Card

Om komponenten

Card er en kortkomponent som har mange bruksområder i OBOS. Kortet inneholder et kort sammendrag og kan gi brukeren mulighet til å navigere til en ny side ved hjelp av enten en knapp eller lenke.

Egnet til:

  • Som et navigasjonselement
  • Inngang til en artikkel
  • Boligkort
  • Statisk informativt kort
  • Contact Card

Relaterte komponenter

Divider

Formatering

8px spacer

Anatomi

Cards kan settes sammen på cirka 52 måter. Vi kommer ikke til å vise dem alle her. Her er derfor et eksempel på et standard Card:

Card anatomi

  1. Label Cards bør alltid ha en kortfattet tittel
  2. Ikon Ikonet er relatert til titttelen. Om du ikke finner et passende ikon, ta kontakt med oss.
  3. Beskrivelse Tekst som utfyller tittelen på kortet, men som også er koblet til CTA.
  4. CTA Tydelig og kort CTA-tekst. Dette er det eneste elementet på kortet som er interaktivt.
  5. Container Surface på card i dette tilfelle er dekorativt, og dermed kun button som har kontrastkrav.
8px spacer

Corner-radius

Cards har en corner-radius på 16px, denne skal aldri endres på. Om det skal plasseres inn en knapp i kortet så bruk formelen: ytre radius = indre radius + padding x2.

Corner-radius eksempel

8px spacer

Surface

Vi har 5 surface-varianter av Card. Cards skal kun inneholde én surface-farge. Velg kun én av fargene under.

VariantFormål
NoneIngen farge på surface eller border
BorderSvart 2px border som standard, kan endres om den har tydelig CTA eller utformet riktig iht wcag. (se uu for cards)
Dark blueBrukes på lys flate - har svært god kontrast, brukes til blikkfang
SkyBrukes på mørk flate for riktig kontrast, eller som dekorativ farge
MintBrukes på mørk flate for riktig kontrast, eller som dekorativ farge
8px spacer

Justering

Regler rundt justering innad i et card.

JusteringFormål
VenstrejustertAlt innholdet i cards skal være venstrejustert. Unntaket vil være ikon som er satt i høyre hjørne som bakt inn i navigasjonskortene.
HøyrejustertUnntaket for cards er når en har tertiærbuttons som skiller seg fra navigasjonen som et helt interaktivt kort har, da skal denne ligge under en divider med tydelig og 8px gap mellom clickbounds.
Divider

Varianter

Vi har 3 varianter av Card

VariantFormål
Statisk kortStatisk kort er et kort som ikke normalt har interaktive elementer, det kan brukes som en informasjonsboks for eksempel. 

Unntaket på interaktive elementer her, er at en kan legge til inline lenker i teksten.
Interaktivt kortHele kortet er klikkbart. Kan for eksempel brukes som kategorier å velge mellom, eller til navigasjon.

Om kortet brukes med buttons, skal ikke kortet i seg selv være interaktivt.
Kort med bilde eller illustrasjonStandard kort for artikler, boligprosjekter eller boliger. Selv om innholdet i kortene er annerledes er bunnstrukturen lik på tvers. Et kort med enten bilde eller illustrasjon. 

Om en ønsker å kategorisere kortene i en liste, så kan det brukes badge, enten normalt i top venstre hjørne eller i selve innholdet.
16px spacer

Statisk kort

Et kort som normalt ikke har interaktive elementer. Dette kortet brukes til å gruppere informasjon og separere innhold visuelt.

<>
 <Card layout="horizontal" className="bg-mint w-full">
    <Content>
      <Heading level={4}>Stovnerparken</Heading>
      <p>5 min gange</p>
    </Content>
    <Park />
  </Card>
</>
8px spacer

Inline lenker

Det eneste som er lov av interaktive elementer i et statisk kort er inline lenker. Slik at kortet primært brukes til informasjon, men det kan også brukes til innholdsfortegnelse og anklerlenker.

Statisk kort med inline lenker - eksempel

8px spacer

Ikon

På statiske kort kan du bruke ikoner. Bruk et vanlig ikon, og ikke et illustrativt ikon, da illustrasjoner ofte kan oppleves forstyrrende for innholdet. Se ikonsettet vårt her.

Feilaktig bruk - Kort med illustrativt ikon

Divider

Interaktive kort

Interaktive kort har to former for interaktivitet; enten der hele kortet er klikkbart, eller kun deler av det. For å få hele kortet klikkbart benyttes <CardLink>.

<Card className="bg-blue-dark text-white w-full">
  <Park />
    <Content>
      <Heading level={5}>Vaktmestertjenester</Heading>
      <p>Vi har en voksende liste med dyktige vaktmestertjenster som OBOS har gode avtaler med. Finn en som passer ditt borettslag</p>
      <CardLink className="group/cta mt-1">
        <Button href="#cta" variant="tertiary">
          Finn vaktmester
          <ArrowRight className="transition-transform group-hover/cta:motion-safe:translate-x-1" />
        </Button>
      </CardLink>
    </Content>
  </Card>
8px spacer

To måter med interaksjon

Interaktiv cards har to primærformer for interaktivitet, enten om hele kortet er klikkbart eller kun deler av det. Hver måte har sine krav knyttet til seg. Nedenfor ser du to måter de ulike interaksjonene kan løses på.

To måter med interaksjon - Eksempel interaktive kort

8px spacer

To varianter av regler iht wcag - Eksempel interaktive kort

Divider

Card m/ bilde eller illustrasjon

Dette er standardkortet for artikler, boligprosjekter eller boliger. Selv om innholdet i kortene er ulike på tvers av obos.no, er bunnstrukturen lik.

Hvis du vil kategorisere kortene i en liste, kan det brukes badge.


<Card className="w-full">
  <Media>
    <img alt="" src="https://obos.brandmaster.com/fr/gallery/14069/images/lowres/0a4467bc-7f8d-40ff-93cd-827d005a51d6.png?cacheVersion=1715682090" />
  </Media>
  <Content>
    <Heading level={3}>Bli kjent med Rødsberget</Heading>
    <p>Nytt nabolag står klart i Fredrikstad, se de nye boligene i et fredelig område.</p>
    <CardLink className="group/cta">
      <Button href="#cta" variant="tertiary">
        Se boligene
        <ArrowRight className="transition-transform group-hover/cta:motion-safe:translate-x-1" />
      </Button>
    </CardLink>
  </Content>
</Card>

8px spacer

Badge

Kort med bilde og illustrasjon kan brukes med Badge, dvs at det kan legges en badge over bilde ved øvre venstre hjørne hvor 2 av sidene i corner radius er satt til 0 slik som anvist i eksempelet.

Badge eksempel kort m/img

8px spacer

Sekundærknapp adskilt fra hoved "clickarea".

Når hele kortet er klikkbart, så skal sekundære innganger seperat fra hoved-clickarea legges under en divider med minst 8px luft mellom clickareas. Det er slik på grunnlag av å ha luft mellom clickareas for at det skal bli enklere å trykke på de respektive inngangene.

Eksempel på hvordan ha et sekundært nivå i et helt interaktivt kort

8px spacer

Kort med horisontal layout

Card har vertikal layout som default, men dette kan endres til horisontal. Siden komponenten må være responsiv vil layouten brekke over til vertikal når det ikke lenger er plass for horisontal layout av innholdet.

For <Card layout="horizontal"> med <Media> som i eksemplet under vil bildet ta opp halvparten av bredden, og <Content> den andre halvparten.

<Card layout="horizontal" className="w-full">
  <Media>
    <img alt="" src="https://obos.brandmaster.com/fr/gallery/14069/images/lowres/0a4467bc-7f8d-40ff-93cd-827d005a51d6.png?cacheVersion=1715682090" />
  </Media>
    <Content>
      <Heading level={3}>Bli kjent med Rødsberget</Heading>
      <p>Nytt nabolag står klart i Fredrikstad, se de nye boligene i et fredelig område.</p>
      <CardLink className="group/cta">
        <Button href="#cta" variant="tertiary">
          Se boligene
          <ArrowRight className="transition-transform group-hover/cta:motion-safe:translate-x-1" />
        </Button>
      </CardLink>
    </Content>
</Card>
8px spacer

Contact card

Card med horisontal layout kan brukes til kontaktkort i kombinasjon med komponenten Avatar.

<Card layout="horizontal" variant="outlined" className="w-full">
  <Avatar src="https://res.cloudinary.com/obosit-prd-ch-clry/image/upload/v1578474487/Boligkonferansen/obosbk%202017/Daniel_Kj%C3%B8rberg_Siraj_1x1.jpg"/>
  <Content>
    <div className="flex flex-col-reverse gap-2">
      <Heading level={3}>Daniel Kjørberg Siraj</Heading>
      <small>Konsernsjef (CEO)</small>
    </div>
    <p>Dette er et kontaktkort med konsernsjef Daniel Kjørberg Siraj</p>
  </Content>
</Card>
Divider

Retningslinjer

Disse reglene og begrensningene gjelder for alle variantene av Card.

8px spacer

Test alltid innholdet med skjermleser

Grunnmuren har ikke kontroll over egendefinert innhold, så dette må testes med skjermleser av teamet selv. Helst test på en person som ikke har sett / ser designet. Mer informasjon om uu for hver komponent kommer.

8px spacer

Kontrast

Sørg for at kontrasten er riktig i henhold til bruken av komponenten. Last ned CCA for å teste selv.

8px spacer

Ikke bland farger

Kortene skal holdes rene, og skal ikke blandes med andre surface-farger på samme surface.

Ikke bland andre farger i et kort

8px spacer

Minstestørrelse

Når en bruker et card, så må minstestørrelsen på 288px designes for å se om innholdet fungerer på den minste størrelsen vi må støtte.

Minstestørrelse - feilaktig bruk

Divider

Eksempler

Kort hvor hele kortet er interaktivt:

<Card className="w-full">
    <Media>
      <img alt="" src="https://res.cloudinary.com/obosit-prd-ch-clry/image/upload/obos-logo-socialmeta.jpg" />
    </Media>
    <Content>
      <Heading level={5}>Med bilde og CTA</Heading>
      <p>Dette kortet har bilde og er klikkbart mot en CTA-lenke</p>
      <CardLink className="group/cta">
        <Button href="#cta" variant="tertiary">
          Les mer
          <ArrowRight className="transition-transform group-hover/cta:motion-safe:translate-x-1" />
        </Button>
      </CardLink>
    </Content>
  </Card>
8px spacer

Card med klikkbare elementer inne i seg:

<Card className="bg-blue-dark text-white w-full">
    <Content>
      <Heading level={5}>Interaktivt kort med CTA</Heading>
      <p>Dette kortet har en klikkbar CTA-lenke.</p>
      <CardLink className="group/cta mt-1">
        <Button href="#cta" variant="tertiary">
          Les mer
          <ArrowRight className="transition-transform group-hover/cta:motion-safe:translate-x-1" />
        </Button>
      </CardLink>
    </Content>
  </Card>
8px spacer

Avansert eksempel med flere klikkflater i et kort

Det er mulige å lage relativt komplekse kort, med flere klikkbare flater. Til dette kan <CardLink> og Button benyttes. Ved å bruke komponenten Badge i forskjellige deler av kortet er det mulig å fremheve spesielt viktig informasjon på forskjellige måter.

<Card variant="outlined" className="w-full">
  <Media>
    <Badge color="blue-dark" size="large">
      <InfoCircle />
        Meldefrist
    </Badge>
    <img alt="" src="https://res.cloudinary.com/obosit-prd-ch-clry/image/upload/f_auto,c_limit,w_2048,q_auto/v1582122753/Boligprosjekter/Oslo/Ulven/Ulven-N%C3%A6romr%C3%A5de-Oslo-OBOS-Construction-city.jpg" />
  </Media>
  <Content className="flex-grow">
    <div className="grid gap-1">
      <Heading level={3}>
        <CardLink href="#card">Rødbergvn 88C</CardLink>
      </Heading>
      <small className="description">Bjerke - Oslo</small>
    </div>
    <small className="description -order-1">
      Forhåndsvarsling - Saksnr. F0347565
    </small>
    <p className="font-semibold">100 m² | Prisantydning 9 600 000 kr</p>
    <p className="flex gap-x-1">
      <House /> Rekkehus/småhus
    </p>
    <p className="flex gap-x-1">
      <Bed /> 3 soverom
    </p>
    <p className="flex gap-x-1">
      <PiggyBank /> Totalpris 9 989 838
    </p>
    <Badge size="small" color="mint">
      Visning 13. oktober
    </Badge>
    <Footer className="relative grid gap-y-2">
      <hr className="border-t border-t-current" />
      <Button href="#other-link" variant="tertiary">
        Se prospekt
        <Documents />
      </Button>
    </Footer>
  </Content>
</Card>
8px spacer

Horisontalt kort med ikon i stedet for bilde

Hvis man bruker et ikon istedenfor <Media> vil ikonet kun ta opp standardstørrelsen til ikonet, og <Content> fyller resten av bredden

<Card layout="horizontal" variant="outlined" className="w-full">
  <Content>
    <Heading level={3}>Med ikon til høyre</Heading>
    <p>
      Dette kortet er liggende, har et ikon til høyre og er klikkbart mot en
      CTA-lenke
    </p>
    <CardLink className="group/cta">
      <Button href="#cta" variant="tertiary">
        Les mer
        <ArrowRight className="transition-transform group-hover/cta:motion-safe:translate-x-1" />
      </Button>
    </CardLink>
  </Content>
  <PiggyBank />
</Card>

Props

Card

PropDescriptionDefault
variant?The variant of the cardsubtle
layout?The layout of the cardvertical
id?-
PropDescriptionDefault
children?-
autoFocus?-
isDisabled?Whether the link is disabled.-
Events
onFocus?Handler that is called when the element receives focus.-
onBlur?Handler that is called when the element loses focus.-
onKeyDown?Handler that is called when a key is pressed.-
onKeyUp?Handler that is called when a key is released.-
onClick?Not recommended – use onPress instead. onClick is an alias for onPress provided for compatibility with other libraries. onPress provides additional event details for non-mouse interactions.-
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.-
onFocusChange?Handler that is called when the element's focus status changes.-
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.-
Links
referrerPolicy?-
rel?-
target?-
hrefLang?-
download?-
ping?-
routerOptions?-
href?-
Styles
className?'react-aria-Form'
style?-
Accessibility
aria-describedby?-
aria-details?-
aria-label?-
aria-labelledby?-

Media

PropDescriptionDefault
id?-
fit?Control how the content should be placed with the object-fit property You might for example want to use fit="contain" portrait images that should not be croppedcover