@grafana/ui
Version:
Grafana Components Library
1 lines • 21.4 kB
Source Map (JSON)
{"version":3,"file":"Card.cjs","sources":["../../../../src/components/Card/Card.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { memo, cloneElement, type FC, useId, useMemo, useContext, type ReactNode } from 'react';\nimport * as React from 'react';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getFocusStyles } from '../../themes/mixins';\n\nimport { CardContainer, type CardContainerProps, getCardContainerStyles } from './CardContainer';\n\n/**\n * @public\n */\nexport interface Props\n extends Omit<CardContainerProps, 'disableEvents' | 'disableHover' | 'hasDescriptionComponent' | 'hasTagsComponent'> {\n /** Indicates if the card and all its actions can be interacted with */\n disabled?: boolean;\n /** Link to redirect to on card click. If provided, the Card inner content will be rendered inside `a` */\n href?: string;\n /** On click handler for the Card */\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n /** @deprecated Use `Card.Heading` instead */\n heading?: ReactNode;\n /** @deprecated Use `Card.Description` instead */\n description?: string;\n isSelected?: boolean;\n /** If true, the padding of the Card will be smaller */\n isCompact?: boolean;\n /** Remove the bottom margin */\n noMargin?: boolean;\n}\n\nexport interface CardInterface extends FC<Props> {\n Heading: typeof Heading;\n Tags: typeof Tags;\n Figure: typeof Figure;\n Meta: typeof Meta;\n Actions: typeof Actions;\n SecondaryActions: typeof SecondaryActions;\n Description: typeof Description;\n}\n\nconst CardContext = React.createContext<{\n href?: string;\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n disabled?: boolean;\n isSelected?: boolean;\n} | null>(null);\n\n/**\n * Generic card component\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/layout-card--docs\n * @public\n */\nexport const Card: CardInterface = ({\n disabled,\n href,\n onClick,\n children,\n isSelected,\n isCompact,\n className,\n noMargin,\n ...htmlProps\n}) => {\n const hasHeadingComponent = useMemo(\n () => React.Children.toArray(children).some((c) => React.isValidElement(c) && c.type === Heading),\n [children]\n );\n const hasDescriptionComponent = useMemo(\n () => React.Children.toArray(children).some((c) => React.isValidElement(c) && c.type === Description),\n [children]\n );\n const hasTagsComponent = useMemo(\n () => React.Children.toArray(children).some((c) => React.isValidElement(c) && c.type === Tags),\n [children]\n );\n\n const disableHover = disabled || (!onClick && !href);\n const onCardClick = onClick && !disabled ? onClick : undefined;\n const styles = useStyles2(\n getCardContainerStyles,\n disabled,\n disableHover,\n hasDescriptionComponent,\n hasTagsComponent,\n isSelected,\n isCompact,\n noMargin\n );\n\n return (\n <CardContainer\n disableEvents={disabled}\n disableHover={disableHover}\n isSelected={isSelected}\n className={cx(styles.container, className)}\n noMargin={noMargin}\n hasDescriptionComponent={hasDescriptionComponent}\n hasTagsComponent={hasTagsComponent}\n {...htmlProps}\n >\n <CardContext.Provider value={{ href, onClick: onCardClick, disabled, isSelected }}>\n {!hasHeadingComponent && <Heading />}\n {children}\n </CardContext.Provider>\n </CardContainer>\n );\n};\nCard.displayName = 'Card';\n\ninterface ChildProps {\n className?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\n/** Main heading for the card */\nconst Heading = ({ children, className, 'aria-label': ariaLabel }: ChildProps & { 'aria-label'?: string }) => {\n const context = useContext(CardContext);\n const styles = useStyles2(getHeadingStyles);\n\n const { href, onClick, isSelected } = context ?? {\n href: undefined,\n onClick: undefined,\n isSelected: undefined,\n };\n const optionLabel = t('grafana-ui.card.option', 'option');\n const headingId = useId();\n const hasHeadingContent = React.Children.count(children) > 0;\n\n return (\n <div data-testid={selectors.components.Card.heading} className={cx(styles.heading, className)}>\n {href ? (\n <a id={headingId} href={href} className={styles.linkHack} aria-label={ariaLabel} onClick={onClick}>\n {children}\n </a>\n ) : onClick ? (\n <button id={headingId} onClick={onClick} className={styles.linkHack} aria-label={ariaLabel} type=\"button\">\n {children}\n </button>\n ) : (\n <span id={headingId}>{children}</span>\n )}\n {/* Input must be readonly because we are providing a value for the checked prop with no onChange handler */}\n {isSelected !== undefined && (\n <input\n {...(hasHeadingContent ? { 'aria-labelledby': headingId } : { 'aria-label': optionLabel })}\n type=\"radio\"\n checked={isSelected}\n readOnly\n />\n )}\n </div>\n );\n};\nHeading.displayName = 'Heading';\n\nconst getHeadingStyles = (theme: GrafanaTheme2) => ({\n heading: css({\n gridArea: 'Heading',\n justifySelf: 'start',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n marginBottom: 0,\n fontSize: theme.typography.size.md,\n letterSpacing: 'inherit',\n lineHeight: theme.typography.body.lineHeight,\n color: theme.colors.text.primary,\n fontWeight: theme.typography.fontWeightMedium,\n '& input[readonly]': {\n cursor: 'inherit',\n },\n }),\n linkHack: css({\n all: 'unset',\n '&::after': {\n position: 'absolute',\n content: '\"\"',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n borderRadius: theme.shape.radius.default,\n },\n\n '&:focus-visible': {\n outline: 'none',\n outlineOffset: 0,\n boxShadow: 'none',\n\n '&::after': {\n ...getFocusStyles(theme),\n zIndex: 1,\n },\n },\n }),\n});\n\nconst Tags = ({ children, className }: ChildProps) => {\n const styles = useStyles2(getTagStyles);\n return <div className={cx(styles.tagList, className)}>{children}</div>;\n};\nTags.displayName = 'Tags';\n\nconst getTagStyles = (theme: GrafanaTheme2) => ({\n tagList: css({\n position: 'relative',\n gridArea: 'Tags',\n alignSelf: 'center',\n }),\n});\n\n/** Card description text */\nconst Description = ({ children, className }: ChildProps) => {\n const styles = useStyles2(getDescriptionStyles);\n const Element = typeof children === 'string' ? 'p' : 'div';\n return <Element className={cx(styles.description, className)}>{children}</Element>;\n};\nDescription.displayName = 'Description';\n\nconst getDescriptionStyles = (theme: GrafanaTheme2) => ({\n description: css({\n width: '100%',\n gridArea: 'Description',\n margin: theme.spacing(1, 0, 0),\n color: theme.colors.text.secondary,\n lineHeight: theme.typography.body.lineHeight,\n }),\n});\n\nconst Figure = ({ children, align = 'start', className }: ChildProps & { align?: 'start' | 'center' }) => {\n const styles = useStyles2(getFigureStyles);\n return (\n <div\n className={cx(\n styles.media,\n className,\n css({\n alignSelf: align,\n })\n )}\n >\n {children}\n </div>\n );\n};\nFigure.displayName = 'Figure';\n\nconst getFigureStyles = (theme: GrafanaTheme2) => ({\n media: css({\n position: 'relative',\n gridArea: 'Figure',\n\n marginRight: theme.spacing(2),\n width: '40px',\n\n '> img': {\n width: '100%',\n },\n\n '&:empty': {\n display: 'none',\n },\n }),\n});\n\nconst Meta = memo(({ children, className, separator = '|' }: ChildProps & { separator?: string }) => {\n const styles = useStyles2(getMetaStyles);\n let meta = children;\n\n const filtered = React.Children.toArray(children).filter(Boolean);\n if (!filtered.length) {\n return null;\n }\n meta = filtered.map((element, i) => (\n <div key={`element_${i}`} className={styles.metadataItem}>\n {element}\n </div>\n ));\n // Join meta data elements by separator\n if (filtered.length > 1 && separator) {\n meta = filtered.reduce((prev, curr, i) => [\n prev,\n <span key={`separator_${i}`} className={styles.separator}>\n {separator}\n </span>,\n curr,\n ]);\n }\n return <div className={cx(styles.metadata, className)}>{meta}</div>;\n});\nMeta.displayName = 'Meta';\n\nconst getMetaStyles = (theme: GrafanaTheme2) => ({\n metadata: css({\n gridArea: 'Meta',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n fontSize: theme.typography.size.sm,\n color: theme.colors.text.secondary,\n margin: theme.spacing(0.5, 0, 0),\n lineHeight: theme.typography.bodySmall.lineHeight,\n overflowWrap: 'anywhere',\n }),\n metadataItem: css({\n // Needed to allow for clickable children in metadata\n zIndex: 0,\n }),\n separator: css({\n margin: `0 ${theme.spacing(1)}`,\n }),\n});\n\ninterface ActionsProps extends ChildProps {\n children?: React.ReactNode;\n variant?: 'primary' | 'secondary';\n}\n\nconst BaseActions = ({ children, disabled, variant, className }: ActionsProps) => {\n const styles = useStyles2(getActionStyles);\n const context = useContext(CardContext);\n const isDisabled = context?.disabled || disabled;\n\n const css = variant === 'primary' ? styles.actions : styles.secondaryActions;\n return (\n <div className={cx(css, className)}>\n {React.Children.map(children, (child) => {\n return React.isValidElement<Record<string, unknown>>(child)\n ? cloneElement(child, child.type !== React.Fragment ? { disabled: isDisabled, ...child.props } : undefined)\n : null;\n })}\n </div>\n );\n};\n\nconst getActionStyles = (theme: GrafanaTheme2) => ({\n actions: css({\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n gridArea: 'Actions',\n marginTop: theme.spacing(2),\n }),\n secondaryActions: css({\n alignSelf: 'center',\n color: theme.colors.text.secondary,\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n gridArea: 'Secondary',\n marginTop: theme.spacing(2),\n }),\n});\n\nconst Actions = ({ children, disabled, className }: ChildProps) => {\n return (\n <BaseActions variant=\"primary\" disabled={disabled} className={className}>\n {children}\n </BaseActions>\n );\n};\nActions.displayName = 'Actions';\n\nconst SecondaryActions = ({ children, disabled, className }: ChildProps) => {\n return (\n <BaseActions variant=\"secondary\" disabled={disabled} className={className}>\n {children}\n </BaseActions>\n );\n};\nSecondaryActions.displayName = 'SecondaryActions';\n\n/**\n * @public\n * @deprecated Use `className` on respective components to modify styles\n */\nexport const getCardStyles = (theme: GrafanaTheme2) => {\n return {\n inner: css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n flexWrap: 'wrap',\n }),\n ...getHeadingStyles(theme),\n ...getMetaStyles(theme),\n ...getDescriptionStyles(theme),\n ...getFigureStyles(theme),\n ...getActionStyles(theme),\n ...getTagStyles(theme),\n };\n};\n\nCard.Heading = Heading;\nCard.Tags = Tags;\nCard.Figure = Figure;\nCard.Meta = Meta;\nCard.Actions = Actions;\nCard.SecondaryActions = SecondaryActions;\nCard.Description = Description;\n"],"names":["React","useMemo","useStyles2","getCardContainerStyles","jsx","CardContainer","cx","jsxs","useContext","t","useId","selectors","css","getFocusStyles","memo","cloneElement"],"mappings":"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"}