ButtonPrimitive

A basic button that lets you customize.

ButtonPrimitive

To implement ButtonPrimitive component into your project you’ll need to add the import:

import ButtonPrimitive from "@kiwicom/orbit-components/lib/primitives/ButtonPrimitive";

After adding import into your project you can use it simply like:

<ButtonPrimitive>Hello!</ButtonPrimitive>

Props

Table below contains all types of the props available in ButtonPrimitive component.

NameTypeDefaultDescription
asComponentstring \| React.Element"button"The component used for the root node.
ariaControlsstringId of the element the button controls.
ariaExpandedbooleanTells screen reader the controlled element from ariaControls is expanded.
arialCurrentstringIndicates whether the element represents the current item within within a container or set of related elements.
backgroundstringThe background of the ButtonPrimitive on initial state.
backgroundHoverstringThe background of the ButtonPrimitive on hover state.
backgroundActivestringThe background of the ButtonPrimitive on active state.
backgroundFocusstringThe background of the ButtonPrimitive on focus state.
boxShadowstringThe box-shadow of the ButtonPrimitive on initial state.
boxShadowHoverstringThe box-shadow of the ButtonPrimitive on hover state.
boxShadowActivestringThe box-shadow of the ButtonPrimitive on active state.
boxShadowFocusstringThe box-shadow of the ButtonPrimitive on focus state.
childrenReact.NodeThe content of the ButtonPrimitive. See Functional specs.
centeredbooleanfalseCan only be used when fullWidth is true and if iconLeft and/or iconRight are defined. If centered prop is true, the Button will center everything.
circledbooleanfalseIf true, the ButtonPrimitive will have circular shape.
contentAlignstringcenterThe justify-content of inner container that wraps icons and the children.
contentWidthstringThe with of inner container that wraps the children.
dataTeststringOptional prop for testing purposes.
idstringSet id for ButtonPrimitive
downloadboolean \| stringCan only be used when href is defined. Adds the download attribute to the the anchor element.
disabledbooleanfalseIf true, the ButtonPrimitive will be disabled.
externalbooleanfalseIf true, the ButtonPrimitive opens link in a new tab. See Functional specs
fontSizestringThe font-size of the ButtonPrimitive.
fontWeightstringThe font-weight of the ButtonPrimitive.
foregroundstringThe color of the text inside ButtonPrimitive on initial state.
foregroundHoverstringThe color of the text inside ButtonPrimitive on hover state.
foregroundFocusstringThe color of the text inside ButtonPrimitive on active state.
foregroundActivestringThe color of the text inside ButtonPrimitive on focus state.
fullWidthbooleanfalseIf true, the ButtonPrimitive will grow up to the full width of its container.
heightstringThe height of the ButtonPrimitive.
hrefstringThe URL of the link to open when ButtonPrimitive is clicked. See Functional specs
iconLeftReact.NodeThe displayed icon on the left.
iconRightReact.NodeThe displayed icon on the right.
iconsIconsObject property for passing down settings for icons inside the ButtonPrimitive.
loadingbooleanfalseIf true, the loading glyph will be displayed and ButtonPrimitive will be disabled.
onClickevent => void \| PromiseFunction for handling onClick event.
paddingstringThe inner padding of the ButtonPrimitive.
relstringSpecifies the rel of an element. See Functional specs
rolestringSpecifies the role of an element.
spaceAfterenumAdditional margin-bottom after component. See this docs
submitbooleanfalseIf true, the ButtonPrimitive will have type="submit" attribute, otherwise type="button".
titlestringAdds aria-label.
tabIndexstring \| number"0"Specifies the tab order of an element.
widthstringThe width of the ButtonPrimitive. Can be any string - 100px, 20%.

Icons

icons is special object property of ButtonPrimitive where you can pass settings that belongs to icons that is possible to use inside this component.

NameTypeDescription
widthstringThe width of icons inside the ButtonPrimitive.
heightstringThe height of icons inside the ButtonPrimitive.
leftMarginstringThe margin of the left icon inside the ButtonPrimitive.
rightMarginstringThe margin of the left icon inside the ButtonPrimitive.
foregroundstringThe color of the icon inside the ButtonPrimitive.
foregroundHoverstringThe color of the icon inside the ButtonPrimitive.
foregroundFocusstringThe color of the icon inside the ButtonPrimitive.
foregroundActivestringThe color of the icon inside the ButtonPrimitive.

Functional specs

  • When the external is specified, noopener value will be automatically added to attribute rel for security reason.
  • By passing the href prop into Button, it will render into a element. If you pass asComponent prop it will override this logic.
  • If you want to render Icon only ButtonPrimitive, you just need to let children prop empty and set up any icon you want to use.
  • If you want to use the asComponent prop then YourComponent should accept at least className. Otherwise it won’t be rendered with proper styling, e.g.:

    const YourComponent = props => <div {...props} />
    <ButtonPrimitive asComponent={YourComponent}>Title</ButtonPrimitive>

    If you specify the children of YourComponent component, it will override the children prop of ButtonPrimitive component, e.g.:

    const YourComponent = props => <div {...props}>YourComponent</div>;

Accessibility

A button is mainly used for indicating an action, submitting a data, opening a modal etc. If you want to use ButtonPrimitive for navigation consider using a <TextLink> for that.

  • Use ariaControls prop to add aria-controls attribute to establish the relationship between button and element which is controlled by it. aria-controls works only with a unique id of an element.

  • Use ariaExpands prop to add aria-expands to indicate screenreaders, that element controlled by button through ariaControls is expanded or not.

  • Use disabled prop to indicate users that button is inactive and they can’t interact with it.

  • Use role and tabIndex when you are rendering Button to non-actionable HTML element as div or span. However, this should be done only in edge-cases as it is anti-pattern behavior.

  • Use title to add aria-label when you need to add extra information to screen readers or there is no children presented to be used as label.