'use client' import classNames from 'classnames' import { forwardRef, HTMLAttributes, ReactNode, Ref } from 'react' import type { TCardSkin, TLayout } from 'shared-types' import { PktTag } from '../tag/Tag' export type { TCardSkin, TLayout } type TCardPadding = 'none' | 'default' type TCardImageShape = 'square' | 'round' type TCardTagPosition = 'top' | 'bottom' type THeadingLevel = 1 | 2 | 3 | 4 | 5 | 6 type TTagSkin = 'blue' | 'blue-light' | 'blue-dark' | 'green' | 'red' | 'beige' | 'yellow' | 'grey' | 'gray' interface ICardTag { skin?: TTagSkin iconName?: string ariaLabel?: string text: string } export interface IPktCard extends Omit, 'title'> { ariaLabel?: string metaLead?: string | null borderOnHover?: boolean metaTrail?: string | null layout?: TLayout heading?: string headingLevel?: THeadingLevel image?: { src: string; alt: string } imageShape?: TCardImageShape clickCardLink?: string | null padding?: TCardPadding openLinkInNewTab?: boolean skin?: TCardSkin subheading?: string tagPosition?: TCardTagPosition tags?: ICardTag[] children?: ReactNode ref?: Ref } export const PktCard = forwardRef( ( { children, className, ariaLabel, metaLead, borderOnHover = true, metaTrail, layout = 'vertical', heading = '', headingLevel = 3, image, imageShape = 'square', clickCardLink, padding = 'default', openLinkInNewTab = false, skin = 'outlined', subheading = '', tagPosition = 'top', tags = [], ...props }, ref, ) => { const classes = classNames({ 'pkt-card': true, [`pkt-card--${skin}`]: skin, [`pkt-card--${layout}`]: layout, [`pkt-card--padding-${padding}`]: padding, 'pkt-card--border-on-hover': borderOnHover, }) const ariaLabelLenke = ariaLabel?.trim() || (heading ? `${heading} lenkekort` : 'lenkekort') const ariaLabelVanlig = ariaLabel?.trim() || (heading ? heading : 'kort') const HeadingTag = `h${headingLevel}` as keyof JSX.IntrinsicElements const renderImage = () => { if (!image?.src) return null return (
{image.alt
) } const renderTags = () => { if (tags.length === 0) return null return (
1 ? 'merkelapper' : 'merkelapp'} > {tags.map((tag, index) => ( {tag.text} ))}
) } const renderHeading = () => { if (!heading || clickCardLink) return null return ( {heading} ) } const renderLinkHeading = () => { if (!clickCardLink) return null return ( {heading} ) } const renderSubheading = () => { if (!subheading) return null return

{subheading}

} const renderHeader = () => { if (!heading && !subheading) return null return (
{renderHeading()} {renderLinkHeading()} {renderSubheading()}
) } const renderMetadata = () => { if (!metaLead && !metaTrail) return null return (
{metaLead && {metaLead}} {metaTrail && {metaTrail}}
) } return (
{renderImage()}
{tagPosition === 'top' && renderTags()} {renderHeader()}
{children}
{tagPosition === 'bottom' && renderTags()} {renderMetadata()}
) }, ) PktCard.displayName = 'PktCard'