diff --git a/packages/propel/package.json b/packages/propel/package.json
index d8887a77bb6..aa5ae59f6e3 100644
--- a/packages/propel/package.json
+++ b/packages/propel/package.json
@@ -27,6 +27,7 @@
"./icons": "./dist/icons/index.js",
"./menu": "./dist/menu/index.js",
"./popover": "./dist/popover/index.js",
+ "./skeleton": "./dist/skeleton/index.js",
"./styles/fonts": "./dist/styles/fonts/index.css",
"./switch": "./dist/switch/index.js",
"./table": "./dist/table/index.js",
diff --git a/packages/propel/src/skeleton/index.ts b/packages/propel/src/skeleton/index.ts
new file mode 100644
index 00000000000..1efe34c51ec
--- /dev/null
+++ b/packages/propel/src/skeleton/index.ts
@@ -0,0 +1 @@
+export * from "./root";
diff --git a/packages/propel/src/skeleton/root.tsx b/packages/propel/src/skeleton/root.tsx
new file mode 100644
index 00000000000..dee2c27f060
--- /dev/null
+++ b/packages/propel/src/skeleton/root.tsx
@@ -0,0 +1,36 @@
+import React from "react";
+// helpers
+import { cn } from "../utils/classname";
+
+type SkeletonProps = {
+ children: React.ReactNode;
+ className?: string;
+ ariaLabel?: string;
+};
+
+const SkeletonRoot = ({ children, className = "", ariaLabel = "Loading content" }: SkeletonProps) => (
+
+ {children}
+
+);
+
+type ItemProps = {
+ height?: string;
+ width?: string;
+ className?: string;
+};
+
+const SkeletonItem: React.FC = ({ height = "auto", width = "auto", className = "" }) => (
+
+);
+
+const Skeleton = Object.assign(SkeletonRoot, { Item: SkeletonItem });
+
+SkeletonRoot.displayName = "plane-ui-skeleton";
+SkeletonItem.displayName = "plane-ui-skeleton-item";
+
+export { Skeleton };
diff --git a/packages/propel/src/skeleton/skeleton.stories.tsx b/packages/propel/src/skeleton/skeleton.stories.tsx
new file mode 100644
index 00000000000..262bcd0529b
--- /dev/null
+++ b/packages/propel/src/skeleton/skeleton.stories.tsx
@@ -0,0 +1,33 @@
+import type { Meta, StoryObj } from "@storybook/react-vite";
+import { Skeleton } from "./index";
+
+const meta: Meta = {
+ title: "Components/Skeleton",
+ component: Skeleton,
+ parameters: {
+ layout: "centered",
+ },
+};
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => (
+
+
+
+ ),
+};
+
+export const Card: Story = {
+ render: () => (
+
+
+
+
+
+
+
+ ),
+};
diff --git a/packages/propel/tsdown.config.ts b/packages/propel/tsdown.config.ts
index 05d57001aea..8f23c301cb8 100644
--- a/packages/propel/tsdown.config.ts
+++ b/packages/propel/tsdown.config.ts
@@ -13,6 +13,7 @@ export default defineConfig({
"src/icons/index.ts",
"src/menu/index.ts",
"src/popover/index.ts",
+ "src/skeleton/index.ts",
"src/switch/index.ts",
"src/table/index.ts",
"src/tabs/index.ts",