Skip to content

Commit 60de2b9

Browse files
feat: add collapsible (#57)
1 parent d46d3d4 commit 60de2b9

File tree

7 files changed

+133
-0
lines changed

7 files changed

+133
-0
lines changed

.changeset/mighty-bees-rush.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zenml-io/react-component-library": minor
3+
---
4+
5+
add collapsible component

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
},
8686
"dependencies": {
8787
"@radix-ui/react-avatar": "^1.0.4",
88+
"@radix-ui/react-collapsible": "^1.0.3",
8889
"@radix-ui/react-dropdown-menu": "^2.0.6",
8990
"@radix-ui/react-slot": "^1.0.2",
9091
"@tanstack/react-table": "^8.15.3",

pnpm-lock.yaml

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { Meta } from "@storybook/react";
2+
import React from "react";
3+
import {
4+
Collapsible,
5+
CollapsibleHeader,
6+
CollapsibleContent,
7+
CollapsibleTrigger,
8+
CollapsiblePanel
9+
} from "./index";
10+
import { StoryObj } from "@storybook/react";
11+
12+
const meta = {
13+
title: "Elements/Collapsible",
14+
component: Collapsible,
15+
argTypes: {},
16+
parameters: {
17+
layout: "centered"
18+
},
19+
20+
tags: ["autodocs"]
21+
} satisfies Meta<typeof Collapsible>;
22+
23+
export default meta;
24+
25+
type Story = StoryObj<typeof meta>;
26+
27+
export const DefaultVariant: Story = {
28+
name: "Default",
29+
render: () => (
30+
<CollapsiblePanel>
31+
<CollapsibleHeader>
32+
<CollapsibleTrigger>Click me to toggle</CollapsibleTrigger>
33+
</CollapsibleHeader>
34+
<CollapsibleContent className="border-t border-theme-border-moderate px-5 py-3">
35+
<ul>
36+
<li>Item 1</li>
37+
<li>Item 2</li>
38+
</ul>
39+
</CollapsibleContent>
40+
</CollapsiblePanel>
41+
)
42+
};
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
2+
import { VariantProps, cva } from "class-variance-authority";
3+
import React, { ComponentPropsWithoutRef, ElementRef, HTMLAttributes, forwardRef } from "react";
4+
import { cn } from "../../utilities";
5+
6+
const Collapsible = CollapsiblePrimitive.Root;
7+
8+
const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
9+
10+
const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
11+
12+
const CollapsiblePanel = forwardRef<
13+
ElementRef<typeof Collapsible>,
14+
ComponentPropsWithoutRef<typeof Collapsible>
15+
>(({ className, ...props }, forwardedRef) => (
16+
<Collapsible
17+
className={cn("overflow-hidden rounded-md border border-theme-border-moderate", className)}
18+
ref={forwardedRef}
19+
{...props}
20+
/>
21+
));
22+
23+
CollapsiblePanel.displayName = "Collapsible Panel";
24+
25+
const headerVairants = cva("px-5 py-3", {
26+
variants: {
27+
intent: {
28+
primary: "bg-theme-surface-primary",
29+
secondary: "bg-theme-surface-secondary"
30+
}
31+
},
32+
defaultVariants: {
33+
intent: "primary"
34+
}
35+
});
36+
37+
export interface CollapsibleHeaderProps
38+
extends HTMLAttributes<HTMLDivElement>,
39+
VariantProps<typeof headerVairants> {}
40+
41+
const CollapsibleHeader = forwardRef<HTMLDivElement, CollapsibleHeaderProps>(
42+
({ className, children, intent, ...props }, ref) => {
43+
return (
44+
<div ref={ref} className={cn(headerVairants({ intent }), className)} {...props}>
45+
{children}
46+
</div>
47+
);
48+
}
49+
);
50+
51+
CollapsibleHeader.displayName = "Collapsible Header";
52+
53+
export { Collapsible, CollapsibleContent, CollapsibleHeader, CollapsiblePanel, CollapsibleTrigger };

src/components/Collapsible/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./Collapsible";

src/components/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ export * from "./Table";
99
export * from "./Tag";
1010
export * from "./Badge";
1111
export * from "./Spinner";
12+
export * from "./Collapsible";

0 commit comments

Comments
 (0)