Modals

A blocking panel centred over the page: a small base — trigger, overlay, modal, dialog, header, actions — and 51 compositions pairing 1:1 with the sheet.

Demo

The panel at rest, and the trigger that opens it. Pick the configurable base or any of the 51 Types; every one is drawn here and opens for real.

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Type
Header align
Actions layout
import { CheckCircle } from "@untitledui/icons"; import { Heading } from "react-aria-components"; import { Dialog, DialogTrigger, Modal, ModalActions, ModalHeader, ModalOverlay, } from "@/components/application/modals/modal"; import { Button } from "@/components/base/buttons/button"; import { FeaturedIcon } from "@/components/foundations/featured-icon/featured-icon"; <DialogTrigger> <Button color="secondary">Open the modal</Button> <ModalOverlay isDismissable> <Modal className="sm:max-w-100"> <Dialog> {({ close }) => ( <> <ModalHeader onClose={close} paddingBottom > <div className="relative w-max"> <FeaturedIcon color="success" size="md" theme="modern" icon={CheckCircle} /> </div> <div className="flex flex-col gap-0.5"> <Heading slot="title" level={2} className="text-md text-primary font-semibold"> Blog post published </Heading> <p className="text-tertiary text-sm">This blog post has been published. Team members will be able to edit this post and republish changes.</p> </div> </ModalHeader> <ModalActions> <Button color="secondary" size="md" onClick={close}> Cancel </Button> <Button color="primary" size="md" onClick={close}> Confirm </Button> </ModalActions> </> )} </Dialog> </Modal> </ModalOverlay> </DialogTrigger>

A four-part base, two new components, and 51 compositions on top

ModalOverlay is the backdrop and the centring, Modal is the panel, Dialog is the content box inside it, and DialogTrigger owns the open state. Until the 2026-08-24 edit that was the entire family API, and all 51 compositions hand-rolled their own header and action row — ModalHeader and ModalActions are new, built to the sheet’s own axes. Everything a Type looks like beyond those two — the icon, the fields, the images, the buttons — is still children you write.

The Type control is the catalogue, not a prop: the family has no type, so picking one swaps the whole composition rather than setting an axis. Choose Base and the panel becomes configurable again, with every switch the base actually owns. The copied snippet follows: a Type gives you the import for its file, because a Type is a file.

Contextual demo

A modal only makes sense over the screen it interrupts: real dialogs over a real page, with no docs shell in the way.

The family

Four React Aria primitives with the kit’s classes on top, plus the ModalHeader and ModalActions added 2026-08-24.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
DialogTriggerReact Aria’s DialogTrigger, re-exported unchanged. Give it two children — the button and the ModalOverlay — and it owns the open state, the trigger’s aria-expanded and aria-haspopup, and focus return.@/​components/​application/​modals/​modal
ModalOverlayThe fixed backdrop: bg-overlay/70 with an 8px blur, and the px/py that decide how much vertical room the panel has. Its --modal-pt and --modal-pb are what the panel’s max-height subtracts.@/​components/​application/​modals/​modal
ModalThe panel: bg-primary, a 16px radius at both breakpoints, shadow-xl, a forced-colors border, and a max-height computed from the overlay’s padding. The per-Type width goes here as a className.@/​components/​application/​modals/​modal
DialogThe dialog inside the panel: max-h-[inherit] and overflow-y-auto. Children can be a function receiving close, which is how a header’s onClose and a footer’s Cancel dismiss without any state of yours.@/​components/​application/​modals/​modal
ModalHeaderNew on 2026-08-24. The sheet’s _Modal header as a component: three align modes, the absolutely positioned close button, and the optional 20px spacer and 1px rule. Adopted in one composition so far.@/​components/​application/​modals/​modal
ModalActionsNew on 2026-08-24. The sheet’s _Modal actions as a component: fill, stacked or end, all three stacking below sm with flex-col-reverse so the primary sits on top there while staying last in the DOM.@/​components/​application/​modals/​modal

Built from

The pieces with their own docs page.

Component
Where it’s used here
CloseButtonThe header’s close affordance, at size sm (36 with a 20px icon) everywhere except user settings, which the sheet draws at size lg (44 with a 24px icon). It fills React Aria’s close slot, so it dismisses the dialog with or without an onClose.
FeaturedIconThe header glyph on 29 of the 51 compositions, at size md theme modern: a 40px box with an 8px radius and a 20px icon.
ButtonThe action row, at size md — px-3.5 py-2.5 with an 8px radius. A destructive confirm is the same button with color="primary-destructive".
CheckboxThe “don’t show again” affordance leading the end-aligned action row, and the body of the checkboxes and team-invite Types.
SelectThe pickers and comboboxes inside the panels — roles, templates, labels, and the tag select on both New message Types.
AvatarThe people in the team, invite, share and access Types, usually through AvatarLabelGroup, and AvatarProfilePhoto on the two settings panels.

Anatomy

A panel is bg-primary, rounded-2xl and shadow-xl: header, body, action row. Two confirmed widths, from real parts.

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

544px, the Horizontal Type: a featured icon beside the text column from sm up, and an action row aligned to the end with a checkbox at its start

Blog post published

This blog post has been published. Team members will be able to edit this post.

400px, the stacked left-aligned Type: the icon above the text, a 20px padding-bottom spacer, content, and two buttons sharing the width
Ceiling
Class on Modal
Against the sheet
Where the family draws it
400pxsm:max-w-100Read 2026-08-24The family’s default, on 22 files — 21 of them on Modal, plus Centered photo carousel on an inner element. Every short confirmation, the sign-in and sign-up pair, and the three team Types
408pxsm:max-w-102Counted in the kitVerification code, alone
440pxsm:max-w-110Counted in the kitIntegration, alone
480pxsm:max-w-120Read 2026-08-2410 files: the three payment Types, Plan 01, New project, Share project, Profile settings, File upload, User selection and the A.I. assistant
512pxsm:max-w-128Read 2026-09-012FA code, alone
544pxsm:max-w-136Read 2026-08-24The three horizontal Types — Horizontal, Warning horizontal and Destructive horizontal
548pxsm:max-w-137Counted in the kitBanner appearance, alone — and the one value off the theme’s own scale
560pxsm:max-w-140Counted in the kitImage crop and Plan 02
608pxsm:max-w-152Counted in the kitCentered video carousel, set on an inner element rather than on Modal
640pxsm:max-w-160Read 2026-08-244 files: Form 01, both New message Types, and User settings
688pxsm:max-w-172Read 2026-09-01Appearance settings and Form 02
720pxsm:max-w-180Counted in the kitText editor, set on an inner element rather than on Modal
800pxsm:max-w-200Read 2026-09-01Create event, the widest panel in the family
noneCounted in the kitDate picker sets no width at all and takes it from the calendar inside

Those numbers are ceilings, not widths

Modal sets a max-width and no width, and it is a flex item in the overlay, so the panel is content-sized up to its ceiling rather than filling it. Measured against a production build: the Horizontal confirm reaches 544 of 544 and the Centered photo 400 of 400, but the form modal reaches only 486 of its 640 ceiling — it fills only when its content is wide enough to. The two cells above therefore set their widths outright, because a specimen documenting a 544px panel has to be 544px. The sheet draws the panel w-full max-w-[400px], so it always fills; that difference is recorded for a ruling rather than changed here, since changing it would resize every modal in the family.

Why these are boxes and not overlays

Both cells compose the real ModalHeader and ModalActions — the same elements a composition uses, with the same paddings — inside a bounded relative box carrying the panel’s own bg-primary, rounded-2xl and shadow-xl. What they do not mount is ModalOverlay, because it renders fixed inset-0: two of them side by side is one dialog on top of another, over the whole page. The live section below shows the overlay doing its real job, one at a time, behind a trigger.

They also all pass showCloseButton=. Outside a real Dialog, CloseButton’s slot="close" resolves to nothing, so the button would be a focusable control announcing “Close” that closes nothing — six of them in the page’s tab order. The live section renders it doing its job instead.

The radius stopped stepping, and the panel grew an edge

The kit drew rounded-xl sm:rounded-2xl — 12 at a phone width, 16 above it. The sheet draws radius-2xl, 16, at both breakpoints (4057:415360 Desktop, 4057:421981 Mobile), so the 2026-08-24 edit dropped the step. The same edit gave the panel a forced-colors border, which the specimens above carry too: the panel’s only separation from the page was shadow-xl over a bg-overlay/70 backdrop, and forced colors drops the shadow and flattens the backdrop, leaving no edge at all. It had to be a border rather than the outline the slideout family uses, because outline-hidden sits on all three of ModalOverlay, Modal and Dialog here, and Tailwind v4 emits that as outline: 2px solid transparent under forced colors specifically — an outline on the same element would set a width against a transparent colour and paint nothing.

The widths are honest; the paddings inside them are the window’s

The 400px cell is the panel at that width, not a 400px viewport. Every switch this family has — the header’s px-4 pt-5 sm:px-6 sm:pt-6, the action row’s p-4 pt-6 sm:px-6 sm:pt-8 sm:pb-6, the alignment’s sm:flex-row, the layout’s sm:grid — is a media query on the viewport, so at a desktop window these cells draw the desktop treatment at a narrow width. Narrow the browser, or open the contextual demo, to see each pair resolve. One thing genuinely does not change across the breakpoint: the title is text-md 16/24 semibold at both, over text-sm/20 tertiary support. Slideouts step 18 to 16; modals do not.

The action row

The sheet’s _Modal actions: three layouts and two leading slots. Every kit layout stacks below 640px; the sheet has a mode that does not.

layout="fill", the default: sm:grid sm:grid-cols-2, so the two buttons share the width evenly from 640px up
layout="stacked": no sm: layout class at all, so full-width buttons at every width — and the reversal below still puts Confirm on top
layout="end": sm:flex-row sm:items-center sm:justify-end. The sheet’s "Horizontal right aligned (checkbox)" Type fills both of its optional leading slots by default — a checkbox and a tertiary button — and pushes the pair to the end edge
Destructive is a recolour and nothing else: primary-destructive on the confirm button, with every padding, gap, radius, order and leading slot identical
The stacked row with its sm: classes removed, so it draws its phone-width form at any window: Cancel is first in the DOM and second on the screen

flex-col-reverse is the whole trick

The sheet’s Mobile modes put Confirm above Cancel; every other breakpoint puts Cancel first, reading order left to right. Reordering the DOM per breakpoint would be a mess, and reordering it once would put the destructive or committing button first in the tab order on every screen. Instead the row is flex-col-reverse at its base and picks up a layout class from sm up — so the primary is on top at a phone width while staying last in the DOM, last in the tab order, and last for a screen reader. All 34 compositions carrying this row do it the same way, and it is the one thing in the family that was already uniform.

Nine spellings of three layouts, which is why the component exists

Across the family the same row was written nine different ways — 19 files at *:grow sm:grid sm:grid-cols-2, three without the *:grow, five at sm:flex-row sm:items-center, and five more one-off variations, two of which contradict themselves (a sm:grid that also sets sm:flex-row, and another that sets justify-end on a grid, where it is inert). ModalActions names the three shapes those nine were reaching for. It does not yet normalise them: the one adopting file still passes its *:grow along as a className so the render is byte-identical. Dropping those extras was waiting on a measurement, and that measurement has since run: the row computes flex-grow: 1 under a parent that computes display: block, and computes display: grid itself, so both *:grow and the row’s flex flex-1 are inert. The 34-file sweep is now known-safe rather than an inference.

Three booleans on this set, and what became of each

Read from 4057:414373 on 2026-08-31, the set carries checkbox, tertiaryButton and divider, all three true by default. The first two are children in the kit, the same way the header’s featuredIcon is: you write a Checkbox and a tertiary Button into ModalActions and push them with sm:mr-auto, which is what the two endcells above do. The third is not implemented at all — its 25px “Divider-wrap” spacing is unverified and no kit file exercises it, so it is recorded as Figma-only rather than guessed at. ModalHeader’s divider, which is implemented above, is a plain 1px rule with no wrapper.

A third breakpoint mode the kit cannot express

The header set is drawn at two breakpoints; this one is drawn at three. Desktop and Mobile vertical aligned are what ModalActions reproduces — a row above 640px, a reversed column below it. The third, Mobile horizontal aligned (12007:566703 and its two siblings, read 2026-08-31), keeps the buttons in a row at a phone width: Cancel first, both flex-[1_0_0], inside a Content column that carries the checkbox and tertiary button beneath them rather than beside them. The kit has one sm:prefix and no third mode, so every layout stacks below 640px unconditionally. That is a kit limit rather than the sheet’s design, and it is worth knowing before reading “all three stack below sm” as parity.

The overlay

The backdrop, the padding and the centring: a fixed inset-0 flex box, bottom-sheet below 640px and centred above it.

The page behind the modal

Body copy, a rule, and a block of colour — enough texture that the blur has something to work on.

bg-overlay/70 with backdrop-blur-[8px], over content. Open any live modal above to see the same treatment over this whole page
The height contract, live. Twelve rows under a 480px ceiling: shorten the browser window and the panel stops growing at the viewport height, and the whole dialog scrolls — header and action row included

Why this one is still behind a trigger

Every other Type on this page is drawn in flow and opened from the Demo. The height contract cannot be drawn: it is the panel stopping at the viewport and the whole dialog — header and action row included — scrolling inside it, which only a real overlay at a real window height can show. Shorten the browser and open it.

The padding is a pair of custom properties, and one of them is responsive

Horizontal padding is px-4 sm:px-8, matching the sheet’s 16 and 32 directly. Vertical padding runs through --modal-pt and --modal-pb so the panel’s max height can subtract it: 16 top and 32 top, against a bottom of clamp(16px, 8vh, 64px) at a phone width and a flat 32 above it. The sheet draws a fixed 64 at the bottom on Mobile, and at the 812px viewport it is drawn on, 8vh is 65 and clamps to exactly that — so the two agree everywhere the sheet can be checked, and the kit keeps shrinking below roughly 800px tall, which a static frame cannot express.

An arbitrary value, by ruling

The sheet’s backdrop-blur is a Figma radius of 16, which halves to 8px in CSS by the rule theme.css records. The kit drew 6. The theme’s blur scale has no 8 — sm 2, md 4, lg 6, xl 10 — and Figma’s backdrop-blur scale and the theme’s blur scale do not share a naming, so the 2026-08-24 edit writes backdrop-blur-[8px] rather than tokenising it. That is the same 8px the slideout family took in the previous batch, so the two backdrops now agree. Whether it earns a token is a proposal, not a read result. The fill is bg-overlay, which is interface-950 in light and switches to interface-800 in dark; the sheet is drawn in light only, so the dark value is unread.

Every Type

All 51, drawn at their real widths from the base's own chrome. Nothing is off-screen: the rows wrap, so every Type is in view as you scroll.

Confirmations

The shapes the base parity read was taken from: an icon, a sentence, and two buttons. Twelve Types, and the rest of the family is these with a body between the header and the row.

Stacked left alignedsm:max-w-100

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Warning stacked left alignedsm:max-w-100

Unsaved changes

Do you want to save or discard changes?

Destructive stacked left alignedsm:max-w-100

Delete blog post

Are you sure you want to delete this post?

Checkboxessm:max-w-100

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Togglessm:max-w-100

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Dropdownsm:max-w-100

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Team member

Link fieldsm:max-w-100

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Access requestsm:max-w-100

Candice has requested edit access

One of your team has requested edit access to your project Marketing Website Design.

Candice Wu

candice@untitledui.com

Input fieldsm:max-w-100

Project created

Please enter a name for this project.

Horizontalsm:max-w-136

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Warning horizontalsm:max-w-136

Unsaved changes

Do you want to save or discard changes?

Destructive horizontalsm:max-w-136

Delete blog post

Are you sure you want to delete this post?

Team

Three Types that lead with an avatar row instead of a featured icon, and centre the block under it.

Stacked with teamsm:max-w-100

Phoenix Baker
Olivia Rhye
Lana Steiner

You’ve been added to the team!

Thanks for accepting the invite. You’ve now been added to the team as an editor.

Stacked with team and linksm:max-w-100

Phoenix Baker
Olivia Rhye
Lana Steiner

Invite your team

You’ve created a new project! Invite colleagues to collaborate on this project.

Stacked with team and invitessm:max-w-100

Phoenix Baker
Olivia Rhye
Lana Steiner

Add your team members

You’ve created a new project! Invite colleagues to collaborate on this project.

Candice Wu

@candice

Admin

Demi Wilkinson

@demi

Admin

Drew Cano

@drew

Editor

Natali Crag

@natali

Editor

Media

The centred onboarding Types, where the image or video is the content and the copy sits under it.

Centered photosm:max-w-100

Blog post published

This blog post has been published. Team members will be able to edit this post and republish changes.

Centered photo carouselsm:max-w-100

Welcome to your dashboard

We’re glad to have you onboard. Here are some quick tips to get you up and running.

Centered video carouselsm:max-w-152

0:00
-0:00
0:00
-0:00
0:00
-0:00
0:00
-0:00

Welcome to your dashboard

Here are some tips to get you up and running.

This Type puts its width on an inner element rather than on Modal.

Codes and sign-in

Pin inputs, a password prompt, and the three account Types — the only ones in the family that use the stacked action layout.

Password promptsm:max-w-100

Please enter your password

Enter your password to make this change.

Log insm:max-w-100

Log in to your account

Welcome back! Please enter your details.

Forgot password

Sign up 01sm:max-w-100

Sign up

Start your 30-day free trial.

Must be at least 8 characters.

Sign up 02sm:max-w-100

Create an account

Start your free 30-day trial. Cancel anytime.

OR

Verification codesm:max-w-102

Please check your email.

We’ve sent a code to olivia@untitledui.com

3
0
6
6
Didn’t get a code? .

2FA codesm:max-w-128

Set up two-factor authentication

To authorize transactions, please scan this QR code with your Google Authenticator App and enter the verification code below.

0
0
0
0
0
0
Didn’t get a code? .

Money, plans and files

Radio cards, card forms, a seat counter and the upload panel.

Plan 01sm:max-w-120

Change your plan

Flexible pricing that grows with you.

Basic plan $10/monthUp to 10 users and 20 GB individual data.Business plan $20/monthUp to 20 users and 40 GB individual data.Enterprise plan $40/monthUnlimited users and unlimited individual data.

Payment methodsm:max-w-120

Change your payment method

Update your plan payment details.

Payment detailssm:max-w-120

Update payment method

Update your card details.

Payment details with imagesm:max-w-120

Untitled.

Olivia Rhye

06 / 2028

1234 1234 1234 1234

Update payment method

Update your card details.

User selectionsm:max-w-120

Purchase seats

Select how many seats you need.

32

Price per seat

$10

Total

$320

File uploadsm:max-w-120

Upload and attach files

Upload and attach files to this project.

or drag and drop

SVG, PNG, JPG or GIF (max. 800x400px)

  • Tech design requirements.pdf

    200 KB of 200 KB

    Complete

    100%
  • Dashboard recording.mp4

    6 MB of 16 MB

    Uploading...

    40%
  • Dashboard prototype FINAL.fig

    3 MB of 4 MB

    Uploading...

    80%

Plan 02sm:max-w-140

Select plan

Simple and flexible per-user pricing.

$10/mthBasic planBilled annuallyBasic featuresBasic reportingUp to 10 individual users20 GB data per user$20/mthBusiness planBilled annuallyBasic Advanced featuresAdvanced reportingUp to 20 individual users40 GB data per user

People and sharing

Access lists, invites, labels, an invitation and a connection flow.

Email invitesm:max-w-100

Invite collaborators

Your new project has been created. Invite colleagues to collaborate on this project.

User invitesm:max-w-100

Share with people

The following users have access to this project:

Candice Wu

candice@untitledui.com

DW

Demi Wilkinson

demi@untitledui.com

Drew Cano

drew@untitledui.com

Team member

Labelssm:max-w-100

Add labels to project

Labels help organize projects.

In progressDesignWeb

Calendar eventsm:max-w-100

JAN

10

Invitation: Product demo

Sienna Hewitt @ Friday, Jan 8, 2028

Details

Friday, Jan 8, 2028

1:30 PM - 3:30 PM

10 min before

Organizer

Sienna Hewitt

sienna@untitledui.com

Attendees

Sienna Hewitt
Ammar Foley
Pippa Wilkinson
Olly Schroeder
Mathilde Lewis
OR

6 guests

5 yes

1 awaiting

Integrationsm:max-w-110

Untitled
Linear

Connect Untitled to Linear

Prioritize work based on customer needs and build a tighter feedback loop with customers.

Untitled would like to

Access basic company information and details

Access and edit bug reports and create new issues

Change issue status and assignee of issues

Open and resolve Intercom conversations

Add or remove users and change user roles

untitledui.com/integrations/linear

Share projectsm:max-w-120

Share this project

Invite your team to review and collaborate.

Anyone with the link

untitledui.com/project/untitled

Who has access

Invite others to view and edit this project.

  • Sienna Hewitt

    Sienna Hewitt

    sienna@untitledui.com

  • Ammar Foley

    Ammar Foley

    ammar@untitledui.com

  • Mathilde Lewis

    Mathilde Lewis

    mathilde@untitledui.com

Forms, editors and settings

The wide end of the family, 480 to 800, plus the Types that draw their own header.

New projectsm:max-w-120

Create a new project

Upload an image to create a new project.

or drag and drop

SVG, PNG, JPG or GIF (max. 800x400px)

Team
The sheet draws the panel after an image was dropped — a preview with an upload percentage. The composition holds that image in memory from the drop and ships no asset for it, so the panel is drawn before the drop, with the family's real drop zone.

Profile settingssm:max-w-120

Complete your profile

Choose a username and write a brief intro.

or drag and drop

SVG, PNG, JPG or GIF (max. 800x400px)

untitledui.com/
terms and conditions

A.I. assistantsm:max-w-120

Hi Olivia,

Welcome back! How can I help?

I’m here to help tackle your tasks. Choose from the prompts below or tell me what you need!

Banner appearancesm:max-w-137

Banner appearance

Change how banners appear to visitors.

Image cropsm:max-w-140

Crop header image

Upload a 1600 x 480px image for best results.

Form 01sm:max-w-160

Add experience

Share where you’ve worked on your profile.

https://
Employment

User settingssm:max-w-160

Sienna Hewitt

Sienna Hewitt

@siennahewitt

Followers
32,086
Following
4,698
Posts
128
Collections
24
Name
Email

Verified 2 Jan, 2027

Username
untitledui.com/@
Country
Estimates based on recent IP address.
The one Type that overrides the family geometry: a 20px panel radius rather than 16, a 44px close button rather than 36. Named by aria-label, not a heading.

New message (empty state)sm:max-w-160

New message

TO
CC

New message (filled)sm:max-w-160

New message

TO
mathilde@untitledui.com

mathilde@untitledui.com

caitlyn@untitledui.com

caitlyn@untitledui.com

CC
ammar@untitledui.com

ammar@untitledui.com

Q3_brief_final.pdfQ3_launch_assets.zip4 MB of 12 MB

Form 02sm:max-w-172

Add your company

Create your company profile for free in less than 5 minutes.

untitledui.com/

Appearance settingssm:max-w-172

Appearance

Change how your dashboard looks and feels in your browser.

Brand color

Update your dashboard to your brand color.

Display preference

Switch between light and dark modes.

Text editorsm:max-w-180

Edit featured excerpt

This will be displayed on your profile.

This Type puts its width on an inner element rather than on Modal.

Create eventsm:max-w-200

Create event

Choose dates, time, and add details to schedule your event.

Date pickerno width set

The only Type that sets no max-width and takes it from the calendar inside. One of two named by aria-label rather than a heading.

What these reproduce, and what they leave out

Every panel above is the real ModalHeader and ModalActionsat the Type’s own width, and its body is built from the same sub-components and assets the shipped composition uses — the carousel, the video player, the QR code, the cropper, the range calendar, the text editor, the upload rows, the payment inputs and card art, the banner and theme artwork — with the composition’s own paddings. All 51 were laid beside their Desktop symbols on 2026-09-02. Where a Type deliberately differs from the sheet, the note under its cell says how and why.

They are boxes rather than overlays for the reason the anatomy section gives: ModalOverlay is fixed inset-0, so fifty-one of them would be fifty-one full-screen dialogs stacked on this page. The X on each is drawn in the close button’s geometry but not wired, because outside a real Dialog the slot="close" resolves to nothing. The Demo at the top of this page opens any Type you pick as a real overlay, with the close button doing its job.

The catalogue

The same 51 as an index: which file each Type is, and its width. What each one contains is drawn above.

Type
File
Width
Access requestaccess-request-modal.tsxsm:max-w-100
A.I. assistantai-assistant-modal.tsxsm:max-w-120
Appearance settingsappearance-settings-modal.tsxsm:max-w-172
Banner appearancebanner-appearance-modal.tsxsm:max-w-137
Calendar eventcalendar-event-modal.tsxsm:max-w-100
Centered photo carouselcentered-photo-carousel-modal.tsxsm:max-w-100
Centered photocentered-photo-modal.tsxsm:max-w-100
Centered video carouselcentered-video-carousel-modal.tsxsm:max-w-152
Checkboxescheckboxes-modal.tsxsm:max-w-100
Create eventcreate-event-modal.tsxsm:max-w-200
Date pickerdate-picker-modal.tsxnone — sized by its calendar
Destructive horizontaldestructive-horizontal-modal.tsxsm:max-w-136
Destructive stacked left aligneddestructive-stacked-left-aligned-modal.tsxsm:max-w-100
Dropdowndropdown-modal.tsxsm:max-w-100
Email inviteemail-invite-modal.tsxsm:max-w-100
File uploadfile-upload-modal.tsxsm:max-w-120
Form 01form-01-modal.tsxsm:max-w-160
Form 02form-02-modal.tsxsm:max-w-172
Horizontalhorizontal-modal.tsxsm:max-w-136
Image cropimage-crop-modal.tsxsm:max-w-140
Input fieldinput-field-modal.tsxsm:max-w-100
Integrationintegration-modal.tsxsm:max-w-110
Labelslabels-modal.tsxsm:max-w-100
Link fieldlink-field-modal.tsxsm:max-w-100
Log inlogin-modal.tsxsm:max-w-100
New message (empty state)new-message-empty-state-modal.tsxsm:max-w-160
New message (filled)new-message-filled-modal.tsxsm:max-w-160
New projectnew-project-modal.tsxsm:max-w-120
Password promptpassword-prompt-modal.tsxsm:max-w-100
Payment detailspayment-details-modal.tsxsm:max-w-120
Payment details with imagepayment-details-with-image-modal.tsxsm:max-w-120
Payment methodpayment-method-modal.tsxsm:max-w-120
Plan 01plan-01-modal.tsxsm:max-w-120
Plan 02plan-02-modal.tsxsm:max-w-140
Profile settingsprofile-settings-modal.tsxsm:max-w-120
Share projectshare-project-modal.tsxsm:max-w-120
Sign up 01signup-01-modal.tsxsm:max-w-100
Sign up 02signup-02-modal.tsxsm:max-w-100
Stacked left alignedstacked-left-aligned-modal.tsxsm:max-w-100
Stacked with team and invitesstacked-with-team-and-invites-modal.tsxsm:max-w-100
Stacked with team and linkstacked-with-team-and-link-modal.tsxsm:max-w-100
Stacked with teamstacked-with-team-modal.tsxsm:max-w-100
Text editortext-editor-modal.tsxsm:max-w-180
Togglestoggles-modal.tsxsm:max-w-100
2FA codetwofa-code-modal.tsxsm:max-w-128
User inviteuser-invite-modal.tsxsm:max-w-100
User selectionuser-selection-modal.tsxsm:max-w-120
User settingsuser-settings-modal.tsxsm:max-w-160
Verification codeverification-code-modal.tsxsm:max-w-102
Warning horizontalwarning-horizontal-modal.tsxsm:max-w-136
Warning stacked left alignedwarning-stacked-left-aligned-modal.tsxsm:max-w-100

Fifty-one Types, fifty-one files

The mapping is 1:1 and settled: no unmapped composition, no Figma-only Type, and no file without one. Until 2026-08-26 there was an extra — rtl-demo.tsx, an upstream demonstration with an I18nProvider, Arabic copy and a direction toggle. It was removed when right-to-left was ruled a non-goal: the family carries 116 physical direction classes against six logical ones, so the demo showed a capability none of the compositions around it honour. A design system should not ship a demonstration of support it does not have.

All 51 named and drawn, 11 read at the code level

The set was enumerated in full on 2026-09-01 — get_metadata on 4057:415205 returns all 102 symbols, and the 51 Type names pair 1:1 with the 51 files, checked name for name rather than asserted. On the same date all 51 Desktop symbols were rendered and reviewed against their compositions, which is what the Every Type section is built from: each panel’s width, header alignment, featured icon and glyph, action layout and button labels come from the file and were checked against the symbol.

Two things that review does not license. Eleven Types have been read at the code level — eight on 2026-08-24 under a hard eight-call budget, plus Create event, Appearance settings and 2FA code measured on 2026-09-01 — so exact paddings and token values inside the other 40 bodies are unverified, which is why the Types whose interior is another family draw a labelled stand-in rather than a guess. And every Mobiletwin beyond the base pair is still unread: this page states nothing about how a Type rearranges below 640px beyond what the base’s own breakpoint does.