Dialog overlay for focused user interactions and important content
import { Modal } from "@darkcode-ui/react" ;
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {Rocket} from "@gravity-ui/icons" ;
Expand code
Import the Modal component and access all parts using dot notation.
import {Modal, Button} from "@darkcode-ui/react" ;
export default () => (
< Modal >
< Button >Open Modal</ Button >
< Modal.Backdrop >
< Modal.Container >
< Modal.Dialog >
< Modal.CloseTrigger /> { /* Optional: Close button */ }
< Modal.Header >
< Modal.Icon /> { /* Optional: Icon */ }
< Modal.Heading />
</ Modal.Header >
< Modal.Body />
< Modal.Footer />
</ Modal.Dialog >
</ Modal.Container >
</ Modal.Backdrop >
</ Modal >
);
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {Rocket} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {Rocket} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {Rocket} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {Sparkles} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {CircleInfo} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {CircleCheck, CircleInfo} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Label, Modal, Radio, RadioGroup} from "@darkcode-ui/react" ;
import {useState} from "react" ;
Expand code
"use client" ;
import {Button, Modal, useOverlayState} from "@darkcode-ui/react" ;
import {CircleCheck} from "@gravity-ui/icons" ;
import React from "react" ; Expand code
"use client" ;
import {Button, Input, Label, Modal, Surface, TextField} from "@darkcode-ui/react" ;
import {Envelope} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {Gear} from "@gravity-ui/icons" ;
Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {ArrowUpFromLine, Sparkles} from "@gravity-ui/icons" ;
import React from "react" ; Expand code
"use client" ;
import {Button, Modal} from "@darkcode-ui/react" ;
import {useCallback, useRef, useState} from "react" ;
Expand code
import {Modal, Button} from "@darkcode-ui/react" ;
function CustomModal () {
return (
< Modal >
< Button >Open Modal</ Button >
< Modal.Backdrop className = "bg-black/80" >
< Modal.Container className = "items-start pt-20" >
< Modal.Dialog className = "bg-linear-to-br from-purple-500 to-pink-500 text-white" >
< Modal.CloseTrigger />
< Modal.Header >
< Modal.Heading >Custom Styled Modal</ Modal.Heading >
</ Modal.Header >
< Modal.Body >
< p >This modal has custom styling applied via Tailwind classes</ p >
</ Modal.Body >
< Modal.Footer >
< Button slot = "close" >Close</ Button >
</ Modal.Footer >
</ Modal.Dialog >
</ Modal.Container >
</ Modal.Backdrop >
</ Modal >
);
}
To customize the Modal component classes, you can use the @layer components directive.
Learn more .
@layer components {
.modal__backdrop {
@ apply bg-gradient-to-br from-black /50 to-black /70;
}
.modal__dialog {
@ apply rounded- 2 xl border border-white /10 shadow- 2 xl ;
}
.modal__header {
@ apply text-center ;
}
.modal__close-trigger {
@ apply rounded-full bg-white /10 hover :bg-white/ 20 ;
}
}
DarkCode UI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
The Modal component uses these CSS classes (View source styles ):
.modal__trigger - Trigger element that opens the modal
.modal__backdrop - Overlay backdrop behind the modal
.modal__container - Positioning wrapper with placement support
.modal__dialog - Modal content container
.modal__header - Header section for titles and icons
.modal__body - Main content area
.modal__footer - Footer section for actions
.modal__close-trigger - Close button element
.modal__backdrop--opaque - Opaque colored backdrop (default)
.modal__backdrop--blur - Blurred backdrop with glass effect
.modal__backdrop--transparent - Transparent backdrop (no overlay)
.modal__container--scroll-outside - Enables scrolling the entire modal
.modal__dialog--scroll-inside - Constrains modal height for body scrolling
.modal__body--scroll-inside - Makes only the body scrollable
.modal__body--scroll-outside - Allows full-page scrolling
The component supports these interactive states:
Focus : :focus-visible or [data-focus-visible="true"] - Applied to trigger, dialog, and close button
Hover : :hover or [data-hovered="true"] - Applied to close button on hover
Active : :active or [data-pressed="true"] - Applied to close button when pressed
Entering : [data-entering] - Applied during modal opening animation
Exiting : [data-exiting] - Applied during modal closing animation
Placement : [data-placement="*"] - Applied based on modal position (auto, top, center, bottom)
Prop Type Default Description childrenReactNode- Trigger and container elements
Prop Type Default Description childrenReactNode- Custom trigger content classNamestring- CSS classes
Prop Type Default Description variant"opaque" | "blur" | "transparent""opaque"Backdrop overlay style isDismissablebooleantrueClose on backdrop click isKeyboardDismissDisabledbooleanfalseDisable ESC key to close isOpenboolean- Controlled open state onOpenChange(isOpen: boolean) => void- Open state change handler classNamestring | (values) => string- Backdrop CSS classes UNSTABLE_portalContainerHTMLElement- Custom portal container
Prop Type Default Description placement"auto" | "center" | "top" | "bottom""auto"Modal position on screen scroll"inside" | "outside""inside"Scroll behavior size"xs" | "sm" | "md" | "lg" | "cover" | "full""md"Modal size variant classNamestring | (values) => string- Container CSS classes
Prop Type Default Description childrenReactNode | ({close}) => ReactNode- Content or render function classNamestring | (values) => string- CSS classes rolestring"dialog"ARIA role aria-labelstring- Accessibility label aria-labelledbystring- ID of label element aria-describedbystring- ID of description element
Prop Type Default Description childrenReactNode- Header content classNamestring- CSS classes
Prop Type Default Description childrenReactNode- Body content classNamestring- CSS classes
Prop Type Default Description childrenReactNode- Footer content classNamestring- CSS classes
Prop Type Default Description childrenReactNode- Custom close button classNamestring | (values) => string- CSS classes
import {useOverlayState} from "@darkcode-ui/react" ;
const state = useOverlayState ({
defaultOpen: false ,
onOpenChange : ( isOpen ) => console. log (isOpen),
});
state.isOpen; // Current state
state. open (); // Open modal
state. close (); // Close modal
state. toggle (); // Toggle state
state. setOpen (); // Set state directly
Implements WAI-ARIA Dialog pattern :
Focus trap : Focus locked within modal
Keyboard : ESC closes (when enabled), Tab cycles elements
Screen readers : Proper ARIA attributes
Scroll lock : Body scroll disabled when open