@grafana/ui
Version:
Grafana Components Library
1 lines • 9.21 kB
Source Map (JSON)
{"version":3,"file":"Alert.mjs","sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { AriaRole, HTMLAttributes, ReactNode } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { IconName } from '../../types/icon';\nimport { Button } from '../Button/Button';\nimport { Icon } from '../Icon/Icon';\nimport { Box } from '../Layout/Box/Box';\nimport { Text } from '../Text/Text';\nexport type AlertVariant = 'success' | 'warning' | 'error' | 'info';\n\nexport interface Props extends HTMLAttributes<HTMLDivElement> {\n title: string;\n /** On click handler for alert button, mostly used for dismissing the alert */\n onRemove?: (event: React.MouseEvent) => void;\n severity?: AlertVariant;\n children?: ReactNode;\n elevated?: boolean;\n buttonContent?: React.ReactNode | string;\n bottomSpacing?: number;\n topSpacing?: number;\n}\n\n/**\n * An alert displays an important message in a way that attracts the user's attention without interrupting the user's task.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/information-alert--docs\n */\nexport const Alert = React.forwardRef<HTMLDivElement, Props>(\n (\n {\n title,\n onRemove,\n children,\n buttonContent,\n elevated,\n bottomSpacing,\n topSpacing,\n className,\n severity = 'error',\n ...restProps\n },\n ref\n ) => {\n const theme = useTheme2();\n const hasTitle = Boolean(title);\n const styles = getStyles(theme, severity, hasTitle, elevated, bottomSpacing, topSpacing);\n const rolesBySeverity: Record<AlertVariant, AriaRole> = {\n error: 'alert',\n warning: 'alert',\n info: 'status',\n success: 'status',\n };\n const role = restProps['role'] || rolesBySeverity[severity];\n const ariaLabel = restProps['aria-label'] || title;\n\n const closeLabel = t('grafana-ui.alert.close-button', 'Close alert');\n\n return (\n <div ref={ref} className={cx(styles.wrapper, className)} role={role} aria-label={ariaLabel} {...restProps}>\n <Box\n data-testid={selectors.components.Alert.alertV2(severity)}\n display=\"flex\"\n backgroundColor={severity}\n borderRadius=\"default\"\n paddingY={1}\n paddingX={2}\n borderStyle=\"solid\"\n borderColor={severity}\n alignItems=\"stretch\"\n boxShadow={elevated ? 'z3' : undefined}\n >\n <Box paddingTop={1} paddingRight={2}>\n <div className={styles.icon}>\n <Icon size=\"xl\" name={getIconFromSeverity(severity)} />\n </div>\n </Box>\n\n <Box paddingY={1} grow={1}>\n <Text color=\"primary\" weight=\"medium\">\n {title}\n </Text>\n {children && <div className={styles.content}>{children}</div>}\n </Box>\n {/* If onRemove is specified, giving preference to onRemove */}\n {onRemove && !buttonContent && (\n <div className={styles.close}>\n <Button\n aria-label={closeLabel}\n icon=\"times\"\n onClick={onRemove}\n type=\"button\"\n fill=\"text\"\n variant=\"secondary\"\n />\n </div>\n )}\n\n {onRemove && buttonContent && (\n <Box marginLeft={1} display=\"flex\" alignItems=\"center\">\n <Button aria-label={closeLabel} variant=\"secondary\" onClick={onRemove} type=\"button\">\n {buttonContent}\n </Button>\n </Box>\n )}\n </Box>\n </div>\n );\n }\n);\n\nAlert.displayName = 'Alert';\n\nexport const getIconFromSeverity = (severity: AlertVariant): IconName => {\n switch (severity) {\n case 'error':\n return 'exclamation-circle';\n case 'warning':\n return 'exclamation-triangle';\n case 'info':\n return 'info-circle';\n case 'success':\n return 'check';\n }\n};\n\nconst getStyles = (\n theme: GrafanaTheme2,\n severity: AlertVariant,\n hasTitle: boolean,\n elevated?: boolean,\n bottomSpacing?: number,\n topSpacing?: number\n) => {\n const color = theme.colors[severity];\n\n return {\n wrapper: css({\n flexGrow: 1,\n marginBottom: theme.spacing(bottomSpacing ?? 2),\n marginTop: theme.spacing(topSpacing ?? 0),\n position: 'relative',\n\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n background: theme.colors.background.primary,\n zIndex: -1,\n },\n }),\n icon: css({\n color: color.text,\n position: 'relative',\n top: '-1px',\n }),\n content: css({\n color: theme.colors.text.primary,\n paddingTop: hasTitle ? theme.spacing(0.5) : 0,\n maxHeight: '50vh',\n overflowY: 'auto',\n }),\n close: css({\n position: 'relative',\n color: theme.colors.text.secondary,\n background: 'none',\n display: 'flex',\n top: '-6px',\n right: '-14px',\n }),\n };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAiCO,MAAM,QAAQ,KAAA,CAAM,UAAA;AAAA,EACzB,CACE;AAAA,IACE,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,GAAW,OAAA;AAAA,IACX,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC9B,IAAA,MAAM,SAAS,SAAA,CAAU,KAAA,EAAO,UAAU,QAAA,EAAU,QAAA,EAAU,eAAe,UAAU,CAAA;AACvF,IAAA,MAAM,eAAA,GAAkD;AAAA,MACtD,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AACA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAM,CAAA,IAAK,gBAAgB,QAAQ,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,YAAY,CAAA,IAAK,KAAA;AAE7C,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,+BAAA,EAAiC,aAAa,CAAA;AAEnE,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,OAAA,EAAS,SAAS,CAAA,EAAG,IAAA,EAAY,YAAA,EAAY,SAAA,EAAY,GAAG,SAAA,EAC9F,QAAA,kBAAA,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,QACxD,OAAA,EAAQ,MAAA;AAAA,QACR,eAAA,EAAiB,QAAA;AAAA,QACjB,YAAA,EAAa,SAAA;AAAA,QACb,QAAA,EAAU,CAAA;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,WAAA,EAAY,OAAA;AAAA,QACZ,WAAA,EAAa,QAAA;AAAA,QACb,UAAA,EAAW,SAAA;AAAA,QACX,SAAA,EAAW,WAAW,IAAA,GAAO,KAAA,CAAA;AAAA,QAE7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAI,UAAA,EAAY,CAAA,EAAG,cAAc,CAAA,EAChC,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAW,MAAA,CAAO,MACrB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAK,IAAA,EAAK,IAAA,EAAM,oBAAoB,QAAQ,CAAA,EAAG,GACvD,CAAA,EACF,CAAA;AAAA,0BAEA,IAAA,CAAC,GAAA,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA,EACtB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,SAAA,EAAU,MAAA,EAAO,UAC1B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YACC,4BAAY,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,SAAU,QAAA,EAAS;AAAA,WAAA,EACzD,CAAA;AAAA,UAEC,YAAY,CAAC,aAAA,wBACX,KAAA,EAAA,EAAI,SAAA,EAAW,OAAO,KAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAY,UAAA;AAAA,cACZ,IAAA,EAAK,OAAA;AAAA,cACL,OAAA,EAAS,QAAA;AAAA,cACT,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,OAAA,EAAQ;AAAA;AAAA,WACV,EACF,CAAA;AAAA,UAGD,QAAA,IAAY,iCACX,GAAA,CAAC,GAAA,EAAA,EAAI,YAAY,CAAA,EAAG,OAAA,EAAQ,QAAO,UAAA,EAAW,QAAA,EAC5C,8BAAC,MAAA,EAAA,EAAO,YAAA,EAAY,YAAY,OAAA,EAAQ,WAAA,EAAY,SAAS,QAAA,EAAU,IAAA,EAAK,QAAA,EACzE,QAAA,EAAA,aAAA,EACH,CAAA,EACF;AAAA;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;AAEb,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAAqC;AACvE,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,sBAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,OAAA;AAAA;AAEb;AAEA,MAAM,YAAY,CAChB,KAAA,EACA,UACA,QAAA,EACA,QAAA,EACA,eACA,UAAA,KACG;AACH,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI;AAAA,MACX,QAAA,EAAU,CAAA;AAAA,MACV,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,aAAA,IAAA,IAAA,GAAA,aAAA,GAAiB,CAAC,CAAA;AAAA,MAC9C,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,UAAA,IAAA,IAAA,GAAA,UAAA,GAAc,CAAC,CAAA;AAAA,MACxC,QAAA,EAAU,UAAA;AAAA,MAEV,UAAA,EAAY;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,MAAA,EAAQ,CAAA;AAAA,QACR,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,OAAA;AAAA,QACpC,MAAA,EAAQ,CAAA;AAAA;AACV,KACD,CAAA;AAAA,IACD,MAAM,GAAA,CAAI;AAAA,MACR,OAAO,KAAA,CAAM,IAAA;AAAA,MACb,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,IACD,SAAS,GAAA,CAAI;AAAA,MACX,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA;AAAA,MACzB,UAAA,EAAY,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAA;AAAA,MAC5C,SAAA,EAAW,MAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,IACD,OAAO,GAAA,CAAI;AAAA,MACT,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,MACzB,UAAA,EAAY,MAAA;AAAA,MACZ,OAAA,EAAS,MAAA;AAAA,MACT,GAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AACF,CAAA;;;;"}