Components

The building blocks, grouped into six sections. Pick a section, then a page. Everything is standard HTML with a small set of classes; no custom tags and no IDs. Most components need no JavaScript; the table below marks the few that do.

Every component

Each component, the section it lives in, the standard HTML it is built on, and whether it is built yet. Classes lists what a component adds on top of that HTML; None means the elements alone are enough. JavaScript is None when HTML and CSS do the whole job, Optional when a script only adds to a component that already works without one, and Required when the component cannot work without a script. For components still to build, the Classes and JavaScript columns are the plan.

ComponentSectionPresentBuilt onClassesJavaScript
PageStructureYesbody header nav main footerNoneNone
SectionStructureYessection h1–h6NoneNone
LayoutStructureYesdiv.row .stretch .grid .cols-3 .panel .flow + inline styleNone
NavigationStructureYesnav ul details.pagingNone
TabsetStructureYesinput type="radio" label.tabset .verticalOptional, to read the selection
DividerStructureYeshr.dividerNone
BreadcrumbStructureYesnav ol aria-currentNoneNone
MenuStructureYesmenu button.toolbar .secondaryNone
ScrollspyStructureNonav a to section anchorsNoneRequired
BasicsContentYesp ul ol dl img blockquote pre figureNoneNone
Inline marksContentNokbd mark abbr sub sup del ins s q cite dfn var samp time dataNoneNone
MediaContentNopicture video audio track iframe canvasNoneNone
Copy to clipboardContentNobutton beside pre.copyRequired
CardContainerYesarticle.card .stretch-link .grid .cols-3None
AccordionContainerYesdetails summary name.accordionNone
CalloutContainerNoaside.callout + .info .success .warning .errorNone
WellContainerNodiv.wellNone
List groupContainerNoul or menu.listNone
HeroContainerNoheader or section.heroNone
RibbonContainerNospan in a card.ribbonNone
Media objectContainerNoimg beside a div.mediaNone
CarouselContainerNoul with CSS scroll snap.carouselOptional, for previous and next buttons
DrawerContainerNodialog.drawerOptional, to open it
DialogContainerNodialog form method="dialog"NoneOptional, to open it
PopoverContainerNopopover popovertargetNoneNone
Floating windowContainerNodialog.windowRequired, to drag it
TableDataYestable thead tbodyNoneNone
ChipDataYesspan a button.chip .accent .tealNone
StatisticDataNodl data.statNone
BadgeDataNospan.badgeNone
AvatarDataNoimg.avatarNone
TimelineDataNool time.timelineNone
TreeDataNoul details.treeOptional, for arrow-key moves
RatingDataNofieldset + radios, or meter to display.ratingNone
CalendarDataNotable time.calendarOptional, to build a month
SparklineDataNosvg.sparklineNone
ChartDataNotable or svg.chartOptional
Sortable tableDataNotable + button in th, aria-sortNoneRequired
FormFormYesform label input select textarea fieldsetNoneNone
ButtonFormYesbutton a input type="submit".button .buttons .secondary .ghost .small .largeNone
Input typesFormNoEvery input typeNoneNone
Toggle switchFormNoinput type="checkbox" role="switch"NoneNone
Segmented controlFormNofieldset + radios.segmentedNone
Input groupFormNolabel input button.input-groupNone
Floating labelFormNolabel input placeholder.floatingNone
ValidationFormNorequired pattern :user-invalidNoneOptional, for custom messages
ComboboxFormNoinput + a role="listbox" list.comboboxRequired
StatusFeedbackYesdiv role="status" or role="alert".status .success .error .info .warningNone
ProgressFeedbackYesprogressNoneNone
MeterFeedbackYesmeterNoneNone
SpinnerFeedbackYesdiv role="status".spinner .largeNone
SkeletonFeedbackYesdiv.skeleton + inline styleNone
StepsFeedbackYesol.stepsNone
Empty stateFeedbackYesdiv p.empty .iconNone
TooltipFeedbackYesAny element + data-tip.tooltipNone
ToastFeedbackYesdiv.toasts .toastRequired
3DUnlistedYesdiv.scene .view .stage .node .panel .face .rotate .translate .scale .flip .reflection .side .front .back + inline styleNone

Not yet on the list

Components the library should have that are not in the table above. Most come straight from HTML: elements and attributes the browser already understands, which need only CSS to look right. Together with the table above they cover what HTML can do on its own.

ComponentSectionBuilt onClassesJavaScript
Skip linkStructurea href="#main", shown on :focus-visibleNoneNone
Table of contentsStructurenav ol a to section anchorsNoneNone
Back to topStructurea href="#top"NoneNone
Sticky headerStructureheader with position: sticky.stickyNone
Resizable panesStructurediv with CSS resize.splitNone
Scroll progressStructureCSS scroll-driven animation.scroll-progressOptional, where scroll timelines are missing
Heading groupContenthgroupNoneNone
AddressContentaddressNoneNone
FootnotesContentsup a + an ol of notes.footnotesNone
Ruby annotationContentruby rt rpNoneNone
Bidirectional textContentbdi dirNoneNone
Editable textContentcontenteditableNoneOptional, to save the edit
Find-in-page revealContenthidden="until-found"NoneNone
Gallery and lightboxContentfigure img + popover.galleryNone
DisclosureContainerA single details summaryNoneNone
Dropdown menuContainerbutton popovertarget + popover menuNoneNone
Confirm dialogContainerdialog + form method="dialog"NoneOptional, to read the answer
Hover cardContainerpopover="hint" interestforNoneOptional, where interestfor is missing
Key-value listDatadl dt dd as a two-column grid.pairsNone
Table partsDatacaption tfoot colgroup th scopeNoneNone
Scrolling tableDatatable with a sticky thead.panelNone
SelectFormselect optgroup multiple sizeNoneNone
Checkbox and radio groupsFormfieldset legend + inputsNoneOptional, for the indeterminate state
Range sliderForminput type="range" + datalist ticksNoneNone
Colour pickerForminput type="color"NoneNone
Date and timeFormdate time datetime-local month week inputsNoneNone
File uploadForminput type="file" accept multipleNoneOptional, for drag and drop
SearchFormsearch + input type="search"NoneNone
Number stepperForminput type="number"NoneNone
AutocompleteForminput list + datalistNoneNone
Auto-growing textareaFormtextarea with field-sizing: contentNoneOptional, where field-sizing is missing
Disabled and read-onlyFormdisabled readonly fieldset disabledNoneNone
Help textFormsmall in the labelNoneNone
Calculated resultFormoutput forNoneRequired
Password revealForminput type="password"NoneRequired
Character counterFormmaxlength + outputNoneRequired
Busy buttonFeedbackbutton aria-busy="true"NoneRequired, to set it