Cross-system reference

Every component pattern this library covers, cross-referenced against the standardization efforts and the component libraries a reader may already know — Open UI, native HTML, Material Web, Radix, Bootstrap, and the WAI-ARIA Authoring Practices — with the accessibility requirements for each pattern. The This library column says what to reach for here; the per-component pages linked from Components carry the runnable demos.

How to read this guide

Column key

ColumnContent
ComponentCanonical pattern name
Open UIOpen UI standardization status + link
HTMLNative HTML element(s)
Material WebMaterial Web component
RadixRadix UI primitive
BootstrapBootstrap 5.3 component
APGWAI-ARIA Authoring Practices pattern
This libraryWhat to reach for in public/ui/, and how far it is built

Status markers

MarkerMeaning
doneImplemented — the link points to its demo page
todoDocumented but not yet implemented in public/ui/
plainStandard HTML/CSS, no custom component needed

Open UI status labels

LabelMeaning
GraduatedShipped in browsers or spec-ready
ActiveActive proposal with explainer
ResearchComponent research / cross-library comparison

Actions

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
ButtonResearch<button>md-button—ButtonsButtonplain .btn classes (ui-button)
TogglePress Button<button aria-pressed>md-icon-button toggleToggle—Button (toggle)plain [aria-pressed] CSS
Toggle Group—Group of <button aria-pressed>—Toggle GroupButton group—todo — single-select is covered by Radio group
Segmented buttonNot proposed<fieldset role="radiogroup"> + <input type="radio">Segmented button (deprecated → connected button group)Toggle Group (type="single")Button group + .btn-checkRadio Group — no segmented pattern of its owndone data-look="segmented" (demo)
LinkResearch<a>———Linkplain

Accessibility notes

Segmented button — what the other systems do

A segmented button (Apple: segmented control; IBM Carbon: content switcher) is a linear row of two-to-five mutually exclusive options that reads as one control. Every system builds it out of the same parts and differs mainly in how the selected segment is painted — this is the evidence behind data-look="segmented" in Radio group, drawn from each system's own spec.

SystemContainerSelected segmentSizing
Material 3 "A toggle button has a shared stroked container" — the frame and the dividers between segments both take the Outline role; "each segment is clearly divided"; fully rounded corners by default Secondary container fill + On secondary container label — a tonal fill, never the primary role — plus a checkmark: "the icon label is replaced by the checkmark icon when the segment is selected" Height 40dp, outline 1dp, label padding min 12dp, target 48dp; segment width = container width / total segments; 2–5 segments; don't let segments wrap to a new line; don't span the full width of a large pane
Material 3 Expressive Segmented buttons are deprecated in favour of the connected button group, which "overrides the individual button's shape to make them visually more belong to a group with 2dp spacing, 8dp inner corners, and fully rounded outer corners" Filled button among outlined ones Also 2–5 segments; use different rounding for the group's outer corners and the inner corners
Apple HIG "A linear set of two or more segments, each of which functions as a button"; "segmented controls preserve their grouping regardless of the view size… This grouping can also help people understand at a glance which controls are currently selected" A neutral raised thumb inside a recessed track (not a tinted or accent fill) "All segments are usually equal in width"; "no more than about five to seven segments in a wide interface"; "prefer using either text or images — not a mix of both"; nouns or noun phrases, title case
IBM Carbon One bar of equal-width tabs; "only one content tab can be selected at a time and there should always be one selected" Inverse layer fill Small 32px / medium 40px / large 48px; labels two-to-three words
Bootstrap 5.3 A button group of .btn-styled <label>s The .btn-* variant's own filled state Hides the real control with .btn-check on <input type="radio"> — i.e. the same native-radio-plus-CSS construction as ours
Open UI No proposal and no research page. "Segmented Control" appears in the component-name matrix only as one library's name for the pattern, so there is no standardization status to track — unlike Switch or Popover.

What every system agrees on, and what this library therefore does:

Forms

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
CheckboxResearch<input type="checkbox">md-checkboxCheckboxChecksCheckboxplain
Radio GroupResearch<fieldset> + <input type="radio">md-radioRadio GroupRadiosRadio Groupdone <fieldset role="radiogroup"> (demo) — CSS-only; three looks: unstyled, data-look="segmented", .option-card
SwitchActive<input type="checkbox" role="switch">md-switchSwitchSwitchesSwitchdone [role="switch"] (demo)
SelectGraduated<select>md-selectSelectSelectListboxdone <x-select> (demo)
ComboboxActive<input> + <datalist>———Comboboxdone <ui-combobox> (demo) — incl. tag-input modes: chips (single token), multiple
Text InputResearch<input>md-text-field—Form control—plain
Input Group—<div role="group"> / <label> / <fieldset> + .prefix/.suffixmd-text-field prefix/suffix—Input group—done .input-group (demo)
Textarea—<textarea>md-text-field—Form control—plain
Number InputResearch<input type="number">———Spinbuttontodo
SliderResearch<input type="range">md-sliderSliderRangeSliderplain
File InputResearch<input type="file">——File input—plain
CalendarResearch<input type="date">———Spinbutton / Gridtodo (low priority)

Accessibility notes

Navigation

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
TabsResearch—md-tabsTabsNavs & tabsTabsdone <ui-tab>
BreadcrumbResearch<nav> + <ol>——BreadcrumbBreadcrumbtodo
NavigationActive<nav>—Navigation MenuNavbarLandmarkstodo
Menubar———Menubar—Menu and Menubartodo
ToolbarActive——Toolbar—Toolbardone <ui-toolbar>
Pagination—<nav> + buttons——Pagination—todo

Accessibility notes

Overlays

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
Dialog (Modal)Research<dialog>md-dialogDialogModalDialogdone <ui-dialog> (demo)
Alert Dialog—<dialog>—Alert DialogModalAlert Dialogdone <ui-dialog> (confirm variant)
Response Dialog—<dialog>———Dialogdone response_dialog()
PopoverGraduated[popover]—PopoverPopovers—done <ui-popover> (demo)
TooltipResearch[popover=hint]—TooltipTooltipsTooltipdone tooltip() (demo)
Context MenuActive—md-menuContext Menu—Menudone <ui-menu trigger="contextmenu"> (demo)
Dropdown MenuActive—md-menuDropdown MenuDropdownsMenu Buttondone <ui-menu> (demo)
ToastResearch<output>—ToastToastsAlertdone toast() (demo)
Hover Card—[popover=hint]—Hover Card——todo
Drawer / Sheet—<dialog>——OffcanvasDialogdone <ui-dialog> (slide variant)

Accessibility notes

Feedback

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
Callout (inline alert)———— (Radix has no inline alert; its Alert Dialog is an interruption)Alerts— (not a live region; see Alert for the announced case)plain .callout (demo)
Notification List———Alert (persistent variant)AlertsAlertdone <ui-notifications> (demo)
Status Bar—<output> / [role="status"]———Status role (ARIA)done <ui-statusbar> (demo)

Accessibility notes

Disclosure

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
AccordionGraduated<details name="...">—AccordionAccordionAccordiondone — accordion() decorator (public/ui/lib/accordion.mjs, demo)
Collapsible—<details> / <summary>—CollapsibleCollapseDisclosuredone — styled .ui-disclosure (zero-JS) + accordion() (demo)
Tree View—————Tree Viewdone — tree() decorator (public/ui/lib/tree.mjs, demo)

Accessibility notes

Content

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
CardResearch<article> / <section>——Card—plain <article>
TableResearch<table>——TablesTable / Gridplain
BadgeResearch<span>——Badge—plain .badge classes (ui-badge)
IconResearch—md-icon———done <ui-icon> (demo) — loading spinner: <ui-icon name="spinner" class="spin"> (Loading & spinners)
Progress—<progress>md-progress—Progress—plain
Meter—<meter>———Metertodo
AvatarResearch<img>—Avatar——todo
SkeletonResearch———Placeholders—todo
CarouselResearchCSS scroll-snap——CarouselCarouseltodo
Tag / ChipResearch<span>md-chip———plain static pill = .badge; interactive removable chips = done `<ui-combobox chips\multiple>` (demo)
Separator—<hr>md-divider———todo
ImageResearch<img> / <picture>————plain
ListResearch<ul> / <ol>md-list—List groupFeedplain

Accessibility notes

Layout

ComponentOpen UIHTMLMaterial WebRadixBootstrapAPGThis library
Scroll Area—overflow: auto—Scroll Area——plain CSS
Grid—CSS Grid——GridGridtodo
Landmarks—<header>, <nav>, <main>, <footer>, <aside>———Landmarksplain
Sidebar—CSS layout——Offcanvas—done layout-sidebar.html — hamburger + modal dialog
Side panel (collapsible)—<aside> + CSS—Collapsible (vertical only)Offcanvas (modal)Disclosuredone side_panel() (demo) — non-modal, with a handle attached to its edge
Navigation rail (icon strip a panel collapses to)—<aside> + CSSNavigation rail——Toolbar of Disclosure buttonsdone side_panel() with --sp-rail + <ui-toolbar panel-rail> (demo) — several views in one collapsible panel; shadcn's collapsible="icon" sidebar is the same shape
Resizable—CSS resize———Window Splittertodo
View (swap)——————done <ui-outlet> (demo)

Accessibility notes

Further reading

Standards and specifications

Component libraries

Design systems (the specs, not the code)

Consulted where a pattern's look carries meaning and the APG says nothing about it — the segmented-button section above is built from these.

Accessibility testing

See also