Accordion

Om komponenten

Accordion er en komponent som lar brukeren åpne og lukke innhold.

Vi har valgt å bruke de semantiske details og summary-taggene for å lage en accordion. Dette er en enkel og semantisk måte å lage en accordion på da tastaturnavigering skjer sømløst. Det finnes ulike måter å lage en Accordion på, og du kan lese mer om avgjørelsen under universell utforming”-fanen. For å bruke Punkt sin Accordion er det viktig at <Accordion> brukes som en wrapper rundt <AccordionItem>. Som standard, kan man ha flere åpne rader i Punkt sin Accordion samtidig.

Avhengigheter

Ikoner:

  • chevron-thin-down

Begrens antall åpne rader

Som standard, støtter Accordion åpning av flere rader samtidig. For å styre at kun én rad kan være åpen om gangen, må man styre alle radene sin toggle tilstand lokalt i Vue eller React. Dette kan gjøres ved å sette toggleProps<AccordionItem>.

Varianter

Accordion har fire ulike skins:

  • borderless (standard)
  • outlined
  • beige
  • blue

Accordion kommer også i en compact versjon. Som standard, er compactsatt til false.

CSS oversikt

I Punkt brukes BEM-styling. Under er Accordion sin CSS-struktur.

Block:

  • .pkt-accordion
  • .pkt-accordion-item

Elements:

  • .pkt-accordion-item__title
  • .pkt-accordion-item__icon
  • .pkt-accordion-item__content

Modifiers:

  • .pkt-accordion--borderless
  • .pkt-accordion--outlined
  • .pkt-accordion--beige
  • .pkt-accordion--blue
  • .pkt-accordion-item--open

Props og slots

<Accordion/>

PropsTypeValidationDefaultDescription
classNamestringStyling klasse
childrenReactNode eller ReactNode[]<Accordion> må wrappe rundt <AccordionItem>
compactbooleanfalseMindre padding og tekststørrelse
skinborderless, outlined, beige, blueborderlessHvert skin har en egen bakgrunnsfarge og borderfarge

<AccordionItem/>

PropsTypeValidationDefaultDescription
idstringPåkrevdSettes til en unik id per item for å koble item-header med item-content slik at skjermlesere leser opp innhold korrekt
titlestring PåkrevdEn tittel/oppsummering av innholdet i <AccordionItem>
defaultOpenboolean -falseSett til true dersom man ønsker å la spesifikk <AccordionItem> være åpen når man først laster inn siden
refLegacyRef<HTMLDivElement>-Tillater å hente en ref til komponent instansen.
togglePropsisOpen, onToggleClick()-Sett både isOpen og onToggleClick dersom du ønsker å overskrive den lokale togglingen. F.eks. dersom man ønsker å begrense antall <AccordionItem> som kan være åpne samtidig.
classNamestring-Styling klasse
childrenReactNode eller ReactNode[]-<Accordion> må wrappe rundt <AccordionItem>

toggleProps i Vue og React

Ønsker man å override den lokale togglingen, kan man gjøre det ved å sende inn toggleProps til <AccordionItem>. Da må man sende inn både en boolean isOpen og en onToggleClick funksjon med argumenter som varierer litt avhengig om det er Vue eller React.

PropsTypeValidationDefaultDescription
isOpenbooleanPåkrevdfalseBestemmer om en spesifikk <AccordionItem> er åpen eller lukket
onToggleClick() [vue](id: string) => voidPåkrevd-Lar deg kontrollere åpne-lukke tilstanden til en spesifikk <AccordionItem> vha id.
onToggleClick() [react](e: React.MouseEvent, id: string) => voidPåkrevd-Lar deg kontrollere åpne-lukke tilstanden til en spesifikk <AccordionItem> vha id. React trenger at event sendes inn for å forhindre inkonsistent oppførsel.

I React, trenger man å sende inn event for å forhindre inkonsistent oppførsel. Dette er fordi <details>-elementet har sin egen innebygde toggle-funksjon som kan føre til inkonsistent når vi prøver å sette isOpen-propen i React. I <AccordionItem> kjører vi e.preventDefault() for å forhindre at <details>-elementet sin innebygde toggle-funksjon kjører.