Skip to content
Liquidify
HomeDocsComponentsExamplesPlayground
⌘K
(opens in new tab)
Liquidify

Accessible React controls with a CSS and SVG material engine.

Product

ComponentsExamplesPlaygroundPackages

Learn

DocumentationGetting startedConceptsAI resources

Project

CommunityShowcaseVersionsGitHub

Independent open-source software. Not affiliated with or endorsed by Apple Inc.

LicenseBrand

Component catalog

Browse the public controls by interaction purpose. Every result links to generated API facts, accessibility behavior, source, and exhaustive stories.

Dialog

A blocking, centered modal surface that interrupts the flow to present a title, an optional description or arbitrary body children, an optional accessory well (one small nested control), and a row of action buttons.

import { Dialog } from "@liquidify/react/dialog"

Overview

Basic Dialog

A focused starting point showing Dialog with its essential configuration.

API

PropTypeDefaultDescription
actions
required
readonly DialogAction[]—The action buttons. Exactly two lay out side by side; otherwise stacked.
childrenReactNode—Arbitrary body content — the generic-Dialog superset over Alert's single-string `message`.
classNamestring | undefined—Optional additional CSS class merged into the glass surface class. The supported per-instance customisation seam: override any `--lq-*` custom property from this class's CSS — the token cascade the engine reads (ADR-0004). No raw inline style is involved, so this stays ADR-0003 clean.
defaultOpenboolean | undefined—Uncontrolled seed for the open state (default `false`).
descriptionstring | undefined—Optional secondary description; the `aria-describedby` target.
descriptionPropsLabelProps | undefined—Per-instance typography override for the description (ADR-0028). Spread last.
dismissibleboolean | undefined—Whether Escape / a scrim tap dismiss the dialog (forwarded to Overlay). Defaults to `true`.
labelPropsLabelProps | undefined—Per-instance typography override for the title (ADR-0028). Spread last.
material"frosted" | "regular" | "clear" | undefinedenclosing `<Material default>`, else `"regular"`Material of the glass surface — `frosted · regular · clear` (§06). Forwarded to the engine, which resolves the chain `prop ?? <Material default> ?? "regular"`, so a bare surface inherits the enclosing provider default.
onOpenChange((open: boolean) => void) | undefined—Fires with the next open state on every close path (action, Escape, scrim).
openboolean | undefined—Controlled open state. Passing it switches Dialog to controlled mode.
perf"low" | "high" | undefinedderived from `<Backdrop type>`, else `"low"`Perf budget of the glass surface (ADR-0006/0007). Forwarded to the engine as `data-glass-perf`; `"high"` opts this surface into the edge-lensing filter. When omitted, derives from the enclosing `<Backdrop type>` (§04).
refRef<HTMLDivElement> | undefined—Forwarded ref to the rendered element — the component's native root (or the merged child element on a component that opts into {@link SlottableProps}). Generic over `E` (charter `docs/api-conventions.md` §4 rule 1, default `HTMLElement`) so a component with a polymorphic root (Link's navigation / action mode union, Text's `as`) can instantiate the concrete element per variant instead of leaving every consumer with a widened `Ref<HTMLElement>`. A component that does not narrow simply inherits the `HTMLElement` default — source-compatible with every pre-existing non-generic `extends ControlProps`.
sizeDialogSize | undefinedregularCard size — the `small · regular · large` subset of the canonical size scale (Dialog-only; Alert pins `small`).
title
required
string—The dialog title — required; the `aria-labelledby` target.

Guidelines

Do
  • Use Dialog when its semantics match the content or action.
  • Keep labels concise, specific, and consistent with the surrounding interface.
  • Test the component with keyboard navigation, zoom, and both color schemes.
Don't
  • Do not use Dialog as a visual substitute for a different semantic element.
  • Do not rely on color or an icon alone to communicate essential meaning.
  • Do not override the component tokens with fixed values unless the product theme requires it.

Accessibility

Dialog supports the documented keyboard interactions below.

Keyboard
  • Press Tab to move focus to the control.
  • Use the control's documented activation keys without trapping focus.
  • Provide an accessible name whenever the visible label is absent.

Tokens

NameValue
--lq-color-action-destructive#ff3b30
--lq-color-label-primary-#000000#ffffff
--lq-color-label-secondary-rgba(60, 60, 67, 0.6)rgba(235, 235, 245, 0.6)rgba(60, 60, 67, 0.8)rgba(235, 235, 245, 0.8)
--lq-dialog-control-filllight-dark( var(--lq-color-system-gray-2-default-light), var(--lq-color-system-gray-3-default-dark) )
--lq-dialog-padvar(--lq-space-20)
--lq-dialog-w-smallcalc(var(--lq-space-64) * 5)
--lq-duration-0ms80ms120ms150ms250ms350ms500ms
--lq-easing-cubic-bezier(0.25, 0.1, 0.25, 1)cubic-bezier(0, 0, 0.2, 1)cubic-bezier(0.4, 0, 1, 1)cubic-bezier(0.175, 0.885, 0.32, 1.275)cubic-bezier(0.25, 0.46, 0.45, 0.94)
--lq-glass-440.71.15var(--lq-segmented-control-indicator-blur)calc(var(--lq-glass-material-blur) * 8)var(--lq-shadow-presentational)
--lq-motion-hover-scale1.025
--lq-overlay-scrim-opacityvar(--lq-opacity-muted)
--lq-radius-pill9999rem
--lq-shadow-presentationalvar(--lq-shadow-ambient-3)
--lq-space-120.75rem
--lq-space-161rem
--lq-space-201.25rem
--lq-space-80.5rem

Key features

  • Liquid material

    Uses Liquidify surfaces and theme-aware design tokens.

  • Layer aware

    Coordinates presentation, focus, and dismissal in an overlay layer.

  • Accessible by default

    Preserves semantic structure, focus visibility, and assistive-technology state.

Resources

  • Source
  • Markdown
  • JSON
  • Storybook
Components