Skip to content

Intent → component map

A reverse lookup keyed by what you're trying to do, not by component name.

Cynosure ships ~90 components. Most consumer-side friction isn’t missing capability — it’s not knowing which component answers a given intent. The table below is a reverse lookup keyed by “I need to …” instead of by component name.

Use this page when you’d otherwise reach for an inline style={{ display: 'flex' }}, manual recursion, or a hand-rolled overflow container — odds are there’s a primitive that already covers it.

I need to…Reach forSkip the workaround
Constrain page width with safe paddingContainer<div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 1rem' }}>
Make a region scroll without breaking native scrollScrollArea<div style={{ height: 400, overflow: 'auto' }}>
Center content (flex centering, vertically & horizontally)Center<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
Hold a fixed aspect ratio (video, image, embed)AspectRatioposition: relative; padding-top: 56.25% hacks
Open a side panelDrawerCustom position: fixed slide-in
I need to…Reach forSkip the workaround
Stack things vertically with consistent gapStackflex-direction: column; gap: 8px
Lay things in a row with consistent gapInlinedisplay: flex; gap: 8px; align-items: center
Two-axis arbitrary flex layoutFlexRaw display: flex
Grid layout (equal columns, named areas, etc.)GridRaw display: grid; grid-template-columns: …
Position one child in a grid cellBox (or any layout child) with gridColumn / gridRow propsInline style={{ gridColumn: '…' }}
Push siblings apart in a flex rowSpacerflex: 1 1 auto hack

See Layout primitives for the full raw-CSS → Cynosure cheat-sheet.

I need to…Reach for
Toggle a section in-placeCollapsible
Multi-section toggle listAccordion
Side sheetDrawer
Modal / lightboxDialog / AlertDialog
Anchored bubble (click)Popover
Anchored bubble (hover, with delay & a11y)HoverCard
I need to…Reach for
Nested folder/file-style dataTree — supports custom data shapes via getId / getLabel / getChildren accessor props
Sortable / filterable data gridDataTable
Plain static tableTable
Ordered list of eventsTimeline
Plain listList
I need to…Reach for
Pick one from a short listSelect
Pick one with type-ahead / asyncCombobox
Pick manyMultiSelect
Pick one from a huge list with keyboard navigationCommandPalette
Search box (with clear, loading, voice)SearchInput
I need to…Reach for
Inline status message in a formAlert / Callout
Transient pop messageToastimport { Toaster, toast } from '@arshad-shah/cynosure-react' (re-exports sonner with Cynosure theme tokens; don’t import from sonner directly)
Persistent banner in a listNotification
”Nothing here yet” placeholderEmptyState
Loading shimmerSkeleton
I need to…Reach for
Page / section titleHeadingcolor prop accepts tokens like fg.muted; no need to drop to style={{ color }}
Body textText
Inline codeCode
Keyboard shortcut hintKbd

If you reached for style={{ display: 'flex' }} or style={{ overflow: 'auto' }} recently, you probably wanted one of these. The CSS still works — Cynosure primitives just thread tokens (spacing, colour, breakpoints) through them automatically.