Simple Healthcare
Core components

The building blocks, audited

Every component on the checklist, mapped to what simple-shared-react ships, with a live example and an honest check against each item.

29 components168 checklist itemssimple-shared-react
Met
55
of 168 checklist items
Partial
35
of 168 checklist items
Missing
78
of 168 checklist items

How to read this page

Status on each component says whether a shared component exists and is in production use. The checklist under it grades the component against the Design System Checklist items by reading its code, not its intent. Partial means the behavior is there but incomplete or not exposed as a prop.

Cross-cutting gaps

Three problems show up across many components and are worth fixing once: Button does not forward aria-* props, so labels set by Pagination and others never reach the DOM; icon-only close buttons in Modal, Toast, and Tag have no accessible name; and no component honors prefers-reduced-motion.
Adopted
Draft
Proposed
Not started
Actions and navigation

How the reader moves and acts.

Button

Adopted

Interactive element used for single-step actions.

Ships asButton

As a link
  • ColorsMetTen solid and nine outline colors plus link and ai. More than a semantic system needs; the Foundations semantic roles would cut this to six.
  • VariantsMetSolid, outline, and link.
  • SizesMetsm, md, lg.
  • Icon supportPartialIcons render as children. No icon-only mode, and aria-label is not forwarded, so an icon-only button has no name.
  • Hover stateMet
  • Active stateMissingNo pressed or selected state, no aria-pressed.
  • Loading stateMissing
  • Disabled stateMetopacity-50 and the disabled attribute. A disabled href button falls back to a real button.
  • Accessibility roleMetRenders <button> or next/link <a> based on href.
  • Focus indicatorMetfocus:ring-2. Uses focus: rather than focus-visible:, so the ring also shows on mouse click.

Tabs

Adopted

Navigation between multiple pages or content sections.

Ships asTabs (uncontrolled), TabLinks (controlled)

Median negotiated rate across in-network plans.

Median negotiated rate across in-network plans.

  • Content compositionMetPanels are children matched by index.
  • VariantsMetdefault, pills, underlined.
  • Selected stateMetaria-selected on the trigger.
  • Disabled stateMet
  • Icon supportMissingTab label is a string.
  • Equal width layoutMissing
  • Keyboard supportPartialTriggers are focusable buttons, but no arrow, Home, or End navigation. aria-labelledby points at tab-{i}, an id that is never rendered, and panel ids collide when two Tabs share a page.

Pagination

Adopted

Enables a selection from a range of pages.

Ships asPagination

  • Selected page statePartialHighlighted blue and re-selecting is a no-op. aria-current is passed to Button, which drops it.
  • Page display rangesMetTwo pages either side of the current one, with ellipses.
  • Amount of items per pageMissing
  • Indeterminate amount of pagesMethasMore adds a load-more control.
  • Full page label announcementsPartialaria-label="Page n" is written but Button does not forward it.
  • State announcementMissing
Forms

How the reader tells us things. Native inputs are styled by element in base.css; the richer pieces are components.

Text field

Draft

Form field to enter and edit single-line text.

Ships asNative <input> styled by base.css; Password

  • LabelMet<label> is styled. Pairing with htmlFor is up to the author.
  • Error statePartial:invalid turns the border red once the field has content. No slot for an error message.
  • Disabled stateMet
  • PlaceholderMet
  • Helper textMissing
  • Icon supportMissingPassword has a trailing show/hide button only.
  • Prefix / SuffixMissing
  • SizesMissingOne size, py-3.
  • Accessibility labelMetNative element; aria-label passes through.

Text area

Draft

Form field to enter and edit multiline text.

Ships asNative <textarea> styled by base.css

  • LabelMet
  • Error statePartialSame :invalid border as the text field.
  • Disabled stateMet
  • PlaceholderMet
  • Helper textMissing
  • SizesPartialrows only.
  • Accessibility labelMet

Select

Adopted

Choose a single value from a list of options. The shared Dropdown also does multi-select, search, and async options.

Ships asDropdown; native <select> styled by base.css

Choose a plan
PPO
  • LabelPartialid is applied, but the trigger is a div with role=button, so clicking a label does not open it.
  • Error stateMissing
  • Disabled stateMet
  • PlaceholderMetPlus a clear control to return to it.
  • Helper textMissing
  • Icon supportPartialOptions can carry an icon. No leading icon on the field.
  • PrefixMissing
  • SizesMissing
  • Accessibility labelMissingNo aria-label prop, and no combobox or listbox semantics. Arrow, Enter, and Escape keys work.

Checkbox

Not started

Form field used to select one or multiple values from a list.

Ships asNative <input type=checkbox>, unstyled

  • LabelPartialNative label pairing works; nothing styles the pair.
  • Checked statePartialBrowser default.
  • Error stateMissing
  • Disabled statePartialBrowser default.
  • Indeterminate stateMissing
  • Checkbox groupMissing
  • Keyboard supportMetNative.

Input radio

Not started

Form element for selecting one option from a list.

Ships asNative <input type=radio>, unstyled

  • LabelPartialNative label pairing works; nothing styles the pair.
  • Checked statePartialBrowser default.
  • Error stateMissing
  • Disabled statePartialBrowser default.
  • Radio groupMissing
  • Keyboard supportMetNative.

Switch

Adopted

Toggle for immediately changing the state of a single item.

Ships asToggle

Small
  • LabelMissingNo label prop. Pair an external <label htmlFor> with the id prop, as in the demo.
  • Checked stateMetrole=switch with aria-checked.
  • Disabled stateMet
  • Keyboard navigationMetNative button.
  • Accessibility labelPartialHard-coded sr-only text "Toggle". No aria-label prop.

Calendar

Not started

Grid of days in one or more months for picking a date or a range.

Ships asNative <input type=date>, styled by base.css

  • Display modesMissing
  • Selected statePartialSingle date via the native picker. No range.
  • Month selectionPartialNative picker.
  • Day namesPartialNative picker.
  • InternationalisationPartialNative picker follows the OS locale.
  • Keyboard navigationPartialNative picker.
  • State announcementPartialNative picker.
Feedback

How we tell the reader what happened, what is happening, and what to watch for.

Alert

Adopted

Prominent message about the whole page or a specific area of it.

Ships asCallout

Heads up

Prices are median negotiated rates and exclude facility fees.

Estimate

Your actual cost depends on your plan and deductible status.

Saved

Your plan has been saved to this browser.
Could not load prices for this facility.
  • ColorsMetNine variants; 800-on-50 text pairs pass AA.
  • Title supportMet
  • Icon supportMetAny icon from the set.
  • Supplementary actionsPartialChildren accept anything; no dedicated action slot.
  • ResponsivenessMetBlock element, full width of its container.
  • Accessibility rolesMissingPlain div. Needs role=status (or alert for red).

Toast

Adopted

Notification message displayed above the page content.

Ships asToast via ToastProvider and useToast()

  • Content compositionMissingmessage is a string.
  • ColorsMetNine variants.
  • Icon supportMetChosen automatically by variant; not overridable.
  • TimeoutPartial5 s with a close button. Toast accepts duration but addToast() does not expose it.
  • StackingMetBottom center, newest last, animated with AnimatePresence.
  • Supplementary actionMissing
  • Focus managementMissingTimer does not pause on hover or focus. Close button has no accessible name.
  • Reduced motionMissing

Tooltip

Draft

Contextual text shown on hover or focus.

Ships asInfo

Median negotiated rate

 

  • PositioningPartialFour fixed positions via prop. No flipping when it would leave the viewport.
  • TimeoutMissingOpens immediately on mouseenter.
  • Keyboard supportMissingHover only. The trigger is not focusable and there is no aria-describedby.

Loading indicator

Draft

Animated element that communicates progress without saying how long it will take.

Ships asLoading

Cooking up your results...
  • ColorsMissingFixed blue.
  • SizesMissingFixed 64px spinner with py-12 around it. No inline size.
  • Loading durationPartialIndeterminate only, with rotating messages.
  • Reduced motionMissing
  • Accessibility labelMissingNo role=status or aria-live.

Progress bar

Not started

Bar showing progress for a long task or one with several steps. Range is a slider, not a progress bar.

Ships asnothing yet

  • LabelMissing
  • SizesMissing
  • DurationMissing
  • Accessibility labelMissing

Skeleton

Draft

Placeholder that stands in for page elements while their data loads.

Ships asLoadingSkeleton

  • SizesPartialLine count is configurable; bar heights are fixed.
  • ShapesMissingRectangles only. No circle for avatars or squares for media.
  • CompositionPartialpage, card, and inline variants. No single-bar primitive to build custom layouts from.
  • Reduced motionMissingUses animate-pulse, a Tailwind animation, rather than motion/react.
Content

Containers and small elements that carry content.

Card

Adopted

Container that groups information about a subject and its related actions.

Ships asCard

With title

Card body. Anything can go here, including other components.

Without a title the body starts at the top.

  • Content compositionMet
  • Media sectionsMissing
  • Supplementary actionsMissingNo footer slot and no clickable card.
  • ResponsivenessMetFills its container.
  • Card groupsPartialGrid utilities do the job; nothing enforces consistent gaps.

Accordion

Not started

Toggles the visibility of a content region when its trigger is pressed.

Ships asNative <details>, unstyled

What is a negotiated rate?

The price an insurer and a provider have agreed on for a service. Native details element, unstyled.

  • Active stateMissing
  • CompositionMissing
  • Toggle transitionMissing
  • Content and trigger relationMissing

List

Draft

Displays a list of items.

Ships asNative ul and ol styled by base.css

  • Unordered item
  • Another item
    • Nested item
  1. Ordered item
  2. Second item
  • OrderMetdisc and decimal. Nested lists are handled.
  • Content compositionMet
  • Accessibility roleMetNative elements.

Divider

Draft

Element for visual content separation.

Ships asNative hr styled in this app, not in base.css

Above the rule.


Below the rule.

  • DirectionPartialHorizontal only. Vertical dividers are hand-built with border-l.
  • Accessibility roleMethr has the separator role natively.

Image

Draft

Utility for displaying images and controlling their behavior.

Ships asnext/image

Simple Healthcare mark

next/image with explicit width and height. The mark is an SVG so density is moot; raster images get a srcset.

  • SizesMetwidth and height, or fill with sizes. aspect-ratio via a wrapper class.
  • Image fallbackMissingA broken src shows the browser default.
  • Screen density supportMetnext/image generates srcset.
  • Alt textMetalt is required by the type.

Avatar

Not started

Thumbnail of a user photo, organization, or other content. Likely needed once accounts show a signed-in user.

Ships asnothing yet

  • ImageMissing
  • Image fallbackMissing
  • SizesMissing
  • ColorsMissing
  • ShapeMissing
  • Avatar groupsMissing
  • Accessibility labelMissing

Badge

Adopted

Compact element that represents the status of an object or a user input.

Ships asTag

In network
Verified
Estimate
Out of network
Pending
Medicare
With icon
  • ColorsMetNine variants, 800-on-100 text pairs.
  • VariantsMissingOne faded style.
  • SizesMissing
  • Icon supportPartialAn Icon as a child works; gap-1 is set. No prop.
  • Dismissible actionMetonClose renders an X. The X has no accessible name.
  • Empty stateMissing
  • PositioningMissingNo notification-dot mode.

Icon

Adopted

Wrapper for SVG assets that controls their appearance.

Ships asIcon

  • ColorsMetcurrentColor, so any text-* utility applies.
  • SizesMetsm 16, md 20, lg 28, xl 36.
  • InteractivityMetNever interactive on its own; wrap in Button. Accessible names are the open item on Foundations.
Not on the checklist

Shared components with no checklist counterpart. They follow the same rules; there is just no external list to grade them against.

Range

Slider with role=slider, aria-value*, keyboard steps, and a commitOn prop for drag versus release. The best-instrumented component in the library.

Password

Text field with a show/hide toggle. The toggle has a proper aria-label.

Code

Inline and block code. Block mode has a language badge; syntax highlighting is commented out.

TabLinks

Controlled tab strip with no panels, for routing-driven tabs.