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

Formatering
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:

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

Surface
Vi har 5 surface-varianter av Card. Cards skal kun inneholde én surface-farge. Velg kun én av fargene under.
| Variant | Formål |
|---|---|
| None | Ingen farge på surface eller border |
| Border | Svart 2px border som standard, kan endres om den har tydelig CTA eller utformet riktig iht wcag. (se uu for cards) |
| Dark blue | Brukes på lys flate - har svært god kontrast, brukes til blikkfang |
| Sky | Brukes på mørk flate for riktig kontrast, eller som dekorativ farge |
| Mint | Brukes på mørk flate for riktig kontrast, eller som dekorativ farge |
Justering
Regler rundt justering innad i et card.
| Justering | Formål |
|---|---|
| Venstrejustert | Alt 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øyrejustert | Unntaket 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. |

Varianter
Vi har 3 varianter av Card
| Variant | Formål |
|---|---|
| Statisk kort | Statisk 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 kort | Hele 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 illustrasjon | Standard 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. |
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> </>
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.

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.


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>
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å.



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>
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.

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.

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>
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>

Retningslinjer
Disse reglene og begrensningene gjelder for alle variantene av Card.
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.
Kontrast
Sørg for at kontrasten er riktig i henhold til bruken av komponenten. Last ned CCA for å teste selv.
Ikke bland farger
Kortene skal holdes rene, og skal ikke blandes med andre surface-farger på samme surface.

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.


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>
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>
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>
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
| Prop | Description | Default |
|---|---|---|
variant? | The variant of the card | subtle |
layout? | The layout of the card | vertical |
id? | - |
CardLink
| Prop | Description | Default |
|---|---|---|
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
| Prop | Description | Default |
|---|---|---|
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 cropped | cover |