diff --git a/.gitignore b/.gitignore
index 2bd81678..d26a2c97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ tsconfig.tsbuildinfo
# Other modules
/*-????????.js*
/AbstractTooltip
+/Alert
/Button
/colors
/ConfirmationTooltip
diff --git a/src/AlertCard/AlertCard.story.mdx b/src/AlertCard/AlertCard.story.mdx
new file mode 100644
index 00000000..7c06628a
--- /dev/null
+++ b/src/AlertCard/AlertCard.story.mdx
@@ -0,0 +1,188 @@
+import { AlertCard } from "../AlertCard";
+import { Button } from "../Button";
+import {
+ Description,
+ Meta,
+ Story,
+ Props,
+ Preview,
+} from "@storybook/addon-docs/blocks";
+
+
+
+# AlertCard
+
+
+
+## Info Alert
+
+Informational alerts present general info about something you are doing or working with. It is neutral and conveys no implications of success or failure.
+
+
+
+ undefined}
+ type="info"
+ heading="Informational alert"
+ >
+ This is a general informational message telling you about something. Learn
+ more
+
+
+
+ undefined}
+ type="info"
+ theme="dark"
+ heading="Informational alert"
+ >
+ This is a general informational message telling you about something. Learn
+ more
+
+
+
+
+### Extended
+
+The extended card variant is for rare use cases where an alert is the most appropriate format for explaining longer instructions.
+
+
+
+ undefined}
+ type="info"
+ heading="Informational alert"
+ extended={true}
+ >
+ In some cases it may be appropriate for the toast card to give a longer
+ message, or a set of instructions helping users navigate complicated
+ situations in the workflow.
+
+
+ It is typically preferrable to link out to a docs article in situations like
+ this, but there are cases where you may also need to include a lengthy amount
+ of content with the card because it will be immediately useful to the user
+ in their workflow.
+
+
+ If a toast card’s content requires more than one paragraph, use the
+ expanded content toast variant.
+
+
+
+ undefined}
+ type="info"
+ theme="dark"
+ heading="Informational alert"
+ extended={true}
+ >
+ In some cases it may be appropriate for the toast card to give a longer
+ message, or a set of instructions helping users navigate complicated
+ situations in the workflow.
+
+
+ It is typically preferrable to link out to a docs article in situations like
+ this, but there are cases where you may also need to include a lengthy amount
+ of content with the card because it will be immediately useful to the user
+ in their workflow.
+
+
+ If a toast card’s content requires more than one paragraph, use the
+ expanded content toast variant.
+
+
+
+
+## Warning Alert
+
+Warning alerts present information about the action that is about to be taken that alerts the user to consequences of the action and asks for confirmation that the action still be taken in light of the consequences.
+
+
+
+ undefined}
+ type="warn"
+ heading="Warning alert"
+ actions={}
+ >
+ exceededSubLimitAt is a deprecated field. You can use it but it may not
+ work as expected.
+
+
+
+ undefined}
+ type="warn"
+ heading="Warning alert"
+ theme="dark"
+ actions={
+
+ }
+ >
+ exceededSubLimitAt is a deprecated field. You can use it but it may not
+ work as expected.
+
+
+
+
+## Error Alert
+
+Error alerts let the user know that something has gone wrong or is blocked in the given workflow they are trying to complete. When possible, error alerts should contain helpful information about what has happened to help unblock the user (such as steps to resolve or a link to a docs article).
+
+
+
+ undefined}
+ type="error"
+ heading="Error alert"
+ style={{ marginBottom: 20 }}
+ >
+ Something is broken. You cannot perform this action at this time.
+
+
+
+ undefined}
+ type="error"
+ heading="Error alert"
+ theme="dark"
+ style={{ marginBottom: 20 }}
+ >
+ Something is broken. You cannot perform this action at this time.
+
+
+
+
+## Success Alert
+
+Success alerts are confirmation that the action the user was trying to take has succeeded.
+
+
+
+ undefined} type="success" heading="Success alert">
+ A new schema registry has been created by timbotnik.
+
+
+
+ undefined}
+ type="success"
+ theme="dark"
+ heading="Success alert"
+ >
+ A new schema registry has been created by timbotnik.
+
+
+
+
+## Props
+
+### `Alert`
+
+
diff --git a/src/AlertCard/AlertCard.tsx b/src/AlertCard/AlertCard.tsx
new file mode 100644
index 00000000..cc999f5d
--- /dev/null
+++ b/src/AlertCard/AlertCard.tsx
@@ -0,0 +1,230 @@
+/** @jsx jsx */
+import { jsx, ClassNames } from "@emotion/core";
+import React, { CSSProperties, Fragment, useMemo } from "react";
+import PropTypes from "prop-types";
+import classnames from "classnames";
+
+import { base } from "../typography";
+import { IconClose } from "../icons/IconClose";
+import { colors } from "../colors";
+import { assertUnreachable } from "../shared/assertUnreachable";
+import { IconInfoSolid } from "../icons/IconInfoSolid";
+import { IconWarningSolid } from "../icons/IconWarningSolid";
+import { IconErrorSolid } from "../icons/IconErrorSolid";
+import { IconSuccessSolid } from "../icons/IconSuccessSolid";
+
+interface AlertCardProps {
+ /**
+ * color theme for alert
+ * @default "light"
+ */
+ theme?: "light" | "dark";
+
+ heading: React.ReactNode;
+
+ /**
+ * actions could be a button
+ * or a tooltip or anything the Alert should display after the children
+ */
+ actions?: React.ReactNode;
+
+ /**
+ * The content of the card, appears below the title
+ */
+ children?: React.ReactNode;
+
+ /**
+ * Override how the `header` is rendered. You can pass either an intrinisic
+ * jsx element as a string (like "h1") or a react element (`
`)
+ *
+ * If you pass a react element, props that we add are spread onto the input.
+ *
+ * @default "h2"
+ */
+ headingAs?: React.ReactElement | keyof JSX.IntrinsicElements;
+
+ /**
+ * callback for handling the clicks on the close button.
+ */
+ onClose: () => void;
+
+ /**
+ * layout for longer content
+ *
+ * @default false
+ */
+ extended?: boolean;
+
+ className?: string;
+ style?: CSSProperties;
+
+ /**
+ * Type of alert, this is used to determine the color and icon in the title
+ */
+ type: "info" | "warn" | "error" | "success";
+}
+
+export const AlertCard: React.FC = ({
+ heading,
+ onClose,
+ actions,
+ headingAs = "h2",
+ children,
+ theme = "light",
+ extended = false,
+ type,
+ ...otherProps
+}) => {
+ const { Icon, color: colorTemp } = useMemo(() => {
+ switch (type) {
+ case "info":
+ return { color: colors.blue, Icon: IconInfoSolid };
+ case "warn":
+ return { color: colors.orange, Icon: IconWarningSolid };
+ case "error":
+ return { color: colors.red, Icon: IconErrorSolid };
+ case "success":
+ return { color: colors.green, Icon: IconSuccessSolid };
+ default:
+ assertUnreachable(type);
+ }
+ }, [type]);
+ return (
+
+