Button

Om komponenten

Button lar brukeren utføre en handling ved å klikke på en knapp.

Les om plassering av knappehirerarkiet og plassering.

Egnet til:

  • Handlinger som å logge inn, bli medlem, laste ned skjema, avbryte etc.
  • Linker

Uegnet til:

  • Viktig statisk informasjon
Divider

Varianter

Vi har tre ulike varianter av Button, og en enkeltstående ikon-knapp. Alle knapper kan brukes med et ikon, på høyre eller venstre side.

16px spacer

Primærknapp

Brukes til den handlingen som skal gis mest oppmerksomhet. En side kan iblant ha mer enn én hovedhandling, men bør ikke ha mange.

<>
  <Button variant="primary">Primærknapp</Button>
  <Button variant="primary">Primærknapp<ArrowRight /></Button>
  <Button variant="primary" href="#primary-cta">
    Primærlink
  </Button>
</>
8px spacer

Sekundærknapp

Brukes til handlinger som ikke er like viktige som hovedhandlingen, og kommer ofte i tillegg til primærknappen.

<>
  <Button variant="secondary">Sekundærknapp</Button>
  <Button variant="secondary">Sekundærknapp<ArrowRight /></Button>
  <Button variant="secondary" href="#secondary-cta">
    Sekundærlink
  </Button>
</>
8px spacer

Tertiærknapp

Brukes for valg som ikke prioriteres, som “avbryt”. Den kan også brukes som navigasjonselement, som for eksempel inngangen på et kort eller en artikkel.

<>
  <Button variant="tertiary">Tertiærknapp</Button>
  <Button variant="tertiary">Tertiærknapp<ArrowRight /></Button>
  <Button variant="tertiary" href="#tertiary-cta">
    Tertiærlink
  </Button>
</>
8px spacer

Knapp med ikon

Kan brukes som navigasjon eller enkeltstående handling, som å lukke en fane. Det bør helst også være en tekst som forklarer handlingen, slik som “Lukk”. Sørg for at knappen er forståelig for skjermleserbrukere ved å bruke aria-labels.

<Button isIconOnly aria-label="Lukk">
  <Close />
</Button>
Divider

Retningslinjer

Husk på også å lese om knappehirerarkiet i OBOS. Den er flyttet over på ny side ettersom den gjelder for flere komponenter hvor button er nested.
Les om plassering av knappehirerarkiet og plassering.

8px spacer

Knappegruppering av samme nivå

Knappegruppering

8px spacing

Knappegruppering av alle nivåene

Knappegruppering_2

8px spacer

Tertiærknapp innrykk

Tertiærknappen har en innebygget indentering. Den kan forklares med å kunne støtte to måter. Den ene er at teksten faller på samme vertikale linje som de andre knappene. Den andre er grunnet fokusmarkeringen rundt tertiærknappen, det må være nok luft mellom teksten og fokusmarkeringen.

Knapp inntrykk eksempel

Tertiærknapp vs. inline-lenke

Tertiærknapp kalles gjerne knappelenke i våre CMSer. Når vi publiserer artikler skiller vi mellom bruken av inline-lenke og knappelenke slik:

Knappelenke brukes når brukeren tas til en oppgave, for eksempel "Opprett bufferkonto".

Inline-lenker bruker vi når leseren skal tas videre til annet relevant innhold i løpende tekst. For eksempel "Les mer: Slik fylte Nina opp bufferkontoen sin."

Divider

Formatering

8px spacer

Anatomi

Teksten i knappen er det viktigeste elementet og er meningsbærende, siden teksten ofte formidler handlingen til brukeren.

Button Anatomi

  1. Ikon Et ikon som gir mening i konteksten den brukes i.
  2. Tekst Knappeteksten er det viktigste elementet, og vi bruker stor forbokstav. Knappeteksten er venstrejustert (se justering for unntak).
  3. Kontainer Corner-radius for knapp er satt til 8px og skal ikke endres. Bruk kun farger tillatt for varianten av knapp du bruker.
8px spacer

Farger

Knapper kan brukes med forskjellige farger. Obos grønn er primærfargen som brukes på knapper. I noen situasjoner brukes andre farger for å skille mellom mellom bakgrunn og hvilket område en opererer i.

FargeFormål
Obos GrønnPrimærfargen til Obos. Skal brukes på hvite flater primært
Obos Dark GreenForbeholdt farge til brukt hos Obos næringseiendom
Obos MintBrukes primært som topnavigasjon i header eller footer. Kan også brukes på mørke flater som "Dark Green" og "Dark Blue"
Obos hvitKan brukes på mørke flater
8px spacer

Justering

JusteringFormål
VenstrejustertKnapper skal i nesten alle tilfeller være venstrejustert. Bruk full bredde kun hvis knappeteksten er for lang og dekker flere linjer - men da bør knappeteksten heller skrives om.
HøyrejustertNår en knapp er satt i en tabell eller i et progressivt skjema, skal den høyrejusteres.
MidtjustertPå små skjermer kan knappen midtjusteres, og skal da ta hele bredden. På små flater skal knappen også være fullbredde og midtjustert hvis den skiller seg fra andre elementer, eller hvis innholdet i knappegrupperingen tilsier det.
Divider

Universell utforming

Husk på

  • Hold deg til korte, konsise tekster i knappene. Det skal være enkelt for brukeren å forstå hva som skjer om de trykker på knappen.
  • Dersom du bruker andre farger i knappene: dobbeltsjekk at du har god nok kontrast, minst 4.5:1 (Du kan bruke Stark plugin i Figma eller CCA - Color Contrast Analyser)
  • Ikke glem visuell feedback - bruk riktig hover, active og focus-states!
    Sørg for at knappen er forståelig for de som bruker skjermleser, dette er spesielt viktig om du bruker knapp med bare ikon. I tilfeller hvor ikonet er meningsbærende, for eksempel en knapp med et e-post ikon og teksten “send”, så kan skjermleseren bare lese “button,send” I disse tilfellene bør du bruke aria-label for å skjule beskrivelsen av knappen visuelt, men den leses opp av skjermleseren.
  • Hvis du bruker animasjon for å gi tilbakemelding på knappens tilstand, bør du sørge for at det er mulig å slå av animasjonen.
  • Husk om du har to eller flere interaktive elementer som en knapp ved siden av hverandre at det skal være minst 8px mellom disse.

Sjekkliste

✓ Jeg har kun én primærknapp per side

✓ Knappene mine har korte og konsise tekster

✓ Jeg har dobbelsjekket kontrasten på fargene (Dersom du har endret på disse)

✓ Jeg har sjekket kontrasten med bakgrunnen på knappen at den ikke er under 3.1.1 i kontrast.

✓ Vi har tatt i bruk og testet ulike states

✓ Knappen er tydelig og ikke for mye visuelt støy rundt

✓ Vi har lagt til aria-label om nødvendig

✓ Vi har nok luft mellom knappene - 8px eller 16px

✓ Vi har sjekket at knappen er 44x44px.

Les mer

Les mer informasjon om tekster i knapper

WCAG 2.5.5 Target Size (AAA)

Props

Button

PropDescriptionDefault
form?The `<form>` element to associate the button with. The value of this attribute must be the id of a `<form>` in the same document.-
formAction?The URL that processes the information submitted by the button. Overrides the action attribute of the button's form owner.-
formEncType?Indicates how to encode the form data that is submitted.-
formMethod?Indicates the HTTP method used to submit the form.-
formNoValidate?Indicates that the form is not to be validated when it is submitted.-
formTarget?Overrides the target attribute of the button's form owner.-
name?Submitted as a pair with the button's value as part of the form data.-
value?The value associated with the button's name when it's submitted with the form data.-
isPending?Whether the button is in a pending state. This disables press and hover events while retaining focusability, and announces the pending state to screen readers.-
isDisabled?Whether the button is disabled. Whether the link is disabled.-
onPress?Handler that is called when the press is released over the target.-
onPressStart?Handler that is called when a press interaction starts.-
onPressEnd?Handler that is called when a press interaction ends, either over the target or when the pointer leaves the target.-
onPressChange?Handler that is called when the press state changes.-
onPressUp?Handler that is called when a press is released over the target, regardless of whether it started on the target or not.-
autoFocus?Whether the element should receive focus on render.-
onFocus?Handler that is called when the element receives focus.-
onBlur?Handler that is called when the element loses focus.-
onFocusChange?Handler that is called when the element's focus status changes.-
onKeyDown?Handler that is called when a key is pressed.-
onKeyUp?Handler that is called when a key is released.-
aria-expanded?Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed.-
aria-haspopup?Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element.-
aria-controls?Identifies the element (or elements) whose contents or presence are controlled by the current element.-
aria-pressed?Indicates the current "pressed" state of toggle buttons.-
aria-current?Indicates whether this element represents the current item within a container or set of related elements.-
type?The behavior of the button when used in an HTML form.'button'
preventFocusOnPress?Whether to prevent focus from moving to the button when pressing it. Caution, this can make the button inaccessible and should only be used when alternative keyboard interaction is provided, such as ComboBox's MenuTrigger or a NumberField's increment/decrement control.-
excludeFromTabOrder?Whether to exclude the element from the sequential tab order. If true, the element will not be focusable via the keyboard by tabbing. This should be avoided except in rare scenarios where an alternative means of accessing the element or its functionality via the keyboard is available.-
id?The element's unique identifier. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id).-
aria-label?Defines a string value that labels the current element.-
aria-labelledby?Identifies the element (or elements) that labels the current element.-
aria-describedby?Identifies the element (or elements) that describes the object.-
aria-details?Identifies the element (or elements) that provide a detailed, extended description for the object.-
onHoverStart?Handler that is called when a hover interaction starts.-
onHoverEnd?Handler that is called when a hover interaction ends.-
onHoverChange?Handler that is called when the hover state changes.-
slot?A slot name for the component. Slots allow the component to receive props from a parent component. An explicit `null` value indicates that the local props completely override all props received from a parent.-
children?The children of the component. A function may be provided to alter the children based on component state.-
className?The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state.-
style?The inline [style](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) for the element. A function may be provided to compute the style based on component state. Additional style properties for the element.-
color?Adjusts the color of the button for usage on different backgrounds.green
variant?The variant of the buttonprimary
isIconOnly?When the button is without text, but with a single icon.false
href?A URL to link to. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#href).-
isLoading?Display the button in a loading state @deprecated Use isPending instead.false
ref?Allows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref). @see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs}-
key?-
target?The target window for the link. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#target).-
rel?The relationship between the linked resource and the current page. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel).-
hrefLang?Hints at the human language of the linked URL. See[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#hreflang).-
download?Causes the browser to download the linked URL. A string may be provided to suggest a file name. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#download).-
ping?A space-separated list of URLs to ping when the link is followed. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#ping).-
referrerPolicy?How much of the referrer to send when following the link. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#referrerpolicy).-
routerOptions?Options for the configured client side router.-