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",