import React, { forwardRef } from "react"; import type { AkselColor } from "../types"; import type { OverridableComponent } from "../utils-external"; import { cl } from "../utils/helpers"; import { useControllableState } from "../utils/hooks"; import ExpansionCardContent, { ExpansionCardContentProps, } from "./ExpansionCardContent"; import { ExpansionCardDescription, ExpansionCardDescriptionProps, } from "./ExpansionCardDescription"; import ExpansionCardHeader, { ExpansionCardHeaderProps, } from "./ExpansionCardHeader"; import { ExpansionCardTitle, ExpansionCardTitleProps, } from "./ExpansionCardTitle"; import { ExpansionCardContext } from "./context"; interface ExpansionCardComponent extends React.ForwardRefExoticComponent< ExpansionCardProps & React.RefAttributes > { /** * @see 🏷️ {@link ExpansionCardHeaderProps} */ Header: React.ForwardRefExoticComponent< ExpansionCardHeaderProps & React.RefAttributes >; /** * @see 🏷️ {@link ExpansionCardTitleProps} * @see [🤖 OverridableComponent](https://aksel.nav.no/grunnleggende/kode/overridablecomponent) support */ Title: OverridableComponent; /** * @see 🏷️ {@link ExpansionCardDescriptionProps} */ Description: React.ForwardRefExoticComponent< ExpansionCardDescriptionProps & React.RefAttributes >; /** * @see 🏷️ {@link ExpansionCardContentProps} */ Content: React.ForwardRefExoticComponent< ExpansionCardContentProps & React.RefAttributes >; } interface ExpansionCardCommonProps extends Omit< React.HTMLAttributes, "onToggle" > { children: React.ReactNode; /** * Callback for when Card is opened/closed. */ onToggle?: (open: boolean) => void; /** * Controlled open-state. * * Using this removes automatic control of open-state. */ open?: boolean; /** * The open state when initially rendered. Use when you do not need to control the open state. * @default false */ defaultOpen?: boolean; /** * @default "medium" */ size?: "medium" | "small"; /** * Overrides inherited color. * @see 🏷️ {@link AkselColor} * @see [📝 Documentation](https://aksel.nav.no/grunnleggende/styling/farger-tokens) */ "data-color"?: AkselColor; } type ExpansionCardConditionalProps = | { /** * Should be set if not using 'aria-labelledby' */ "aria-label": string; } | { /** * Should be set if not using 'aria-label' */ "aria-labelledby": string; }; export type ExpansionCardProps = ExpansionCardCommonProps & ExpansionCardConditionalProps; /** * A component that displays an expandable card. * * @see [📝 Documentation](https://aksel.nav.no/komponenter/core/expansioncard) * @see 🏷️ {@link ExpansionCardProps} * * @example * ```jsx * * * Utbetaling av sykepenger * * * * * * ``` */ export const ExpansionCard = forwardRef( ( { className, onToggle, open, defaultOpen = false, size = "medium", "data-color": color = "neutral", ...rest }, ref, ) => { const [_open, _setOpen] = useControllableState({ value: open, onChange: onToggle, defaultValue: defaultOpen, }); return ( _setOpen((x) => !x), size, }} >
); }, ) as ExpansionCardComponent; ExpansionCard.Header = ExpansionCardHeader; ExpansionCard.Content = ExpansionCardContent; ExpansionCard.Title = ExpansionCardTitle; ExpansionCard.Description = ExpansionCardDescription; export default ExpansionCard;