diff --git a/packages/raystack/v1/components/emptystate/emptystate.module.css b/packages/raystack/v1/components/emptystate/emptystate.module.css
new file mode 100644
index 00000000..211d6344
--- /dev/null
+++ b/packages/raystack/v1/components/emptystate/emptystate.module.css
@@ -0,0 +1,53 @@
+.emptyState {
+ padding: var(--rs-space-9) var(--rs-space-5);
+ width: 100%;
+ height: 100%;
+ text-align: center;
+}
+
+.iconContainer {
+ position: relative;
+ z-index: 2;
+}
+
+.icon {
+ height: 32px;
+ width: 32px;
+ padding: var(--rs-space-3);
+ box-sizing: content-box;
+ border: 1px solid var(--rs-color-border-base-primary);
+ background-color: var(--rs-color-background-base-secondary);
+ border-radius: var(--rs-radius-4);
+ color: var(--rs-color-text-base-secondary);
+ box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.08),
+ 0px -3px 0px 0px rgba(0, 0, 0, 0.03) inset;
+}
+
+.icon > svg {
+ fill: currentColor;
+ height: 100%;
+ width: 100%;
+}
+
+.icon::before {
+ content: "";
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ top: -10px;
+ left: calc(50% - 15px);
+ border: inherit;
+ border-radius: inherit;
+ background-color: inherit;
+ z-index: -10;
+ transform: rotate(-42deg);
+ box-shadow: 0px -1.5px 0px 0px rgba(0, 0, 0, 0.02) inset;
+}
+
+.headerText {
+ max-width: 360px;
+}
+
+.subHeaderText {
+ max-width: 288px;
+}
diff --git a/packages/raystack/v1/components/emptystate/emptystate.tsx b/packages/raystack/v1/components/emptystate/emptystate.tsx
new file mode 100644
index 00000000..b333ad03
--- /dev/null
+++ b/packages/raystack/v1/components/emptystate/emptystate.tsx
@@ -0,0 +1,70 @@
+import { cva } from "class-variance-authority";
+import styles from "./emptystate.module.css";
+const emptystate = cva(styles.emptystate);
+import { Flex } from "../flex";
+import { Text } from "../text";
+import clsx from "clsx";
+
+type classNameKeys =
+ | "container"
+ | "iconContainer"
+ | "icon"
+ | "heading"
+ | "subHeading";
+
+interface EmptystateProps {
+ icon: React.ReactNode;
+ heading?: React.ReactNode;
+ subHeading?: React.ReactNode;
+ primaryAction?: React.ReactNode;
+ secondaryAction?: React.ReactNode;
+ classNames?: Partial
>;
+}
+
+export const EmptyState = ({
+ icon,
+ heading,
+ subHeading,
+ primaryAction,
+ secondaryAction,
+ classNames,
+}: EmptystateProps) => {
+ return (
+
+
+
+
+ {heading && (
+
+ {heading}
+
+ )}
+
+ {subHeading && (
+
+ {subHeading}
+
+ )}
+
+
+ {primaryAction}
+
+ {secondaryAction}
+
+ );
+};
diff --git a/packages/raystack/v1/components/emptystate/index.tsx b/packages/raystack/v1/components/emptystate/index.tsx
new file mode 100644
index 00000000..8b490946
--- /dev/null
+++ b/packages/raystack/v1/components/emptystate/index.tsx
@@ -0,0 +1 @@
+export { EmptyState } from "./emptystate";
diff --git a/packages/raystack/v1/index.tsx b/packages/raystack/v1/index.tsx
index 0231a3cc..4ccb6780 100644
--- a/packages/raystack/v1/index.tsx
+++ b/packages/raystack/v1/index.tsx
@@ -8,6 +8,8 @@ export { ToastContainer, toast } from "./components/toast";
export { DropdownMenu } from "./components/dropdownMenu";
export { Text } from "./components/text";
export { Flex } from "./components/flex";
+export { EmptyState } from "./components/emptystate";
+
export {
ThemeProvider,
ThemeProviderProps,