Add collapsible component
This commit is contained in:
parent
b736b880fb
commit
7fe700c182
|
@ -0,0 +1,30 @@
|
|||
.collapse {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.collapse-summary {
|
||||
color: var(--codex-color-primary);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.collapse-summary:hover {
|
||||
text-decoration: underline;
|
||||
opacity: 0.7;
|
||||
text-decoration-thickness: 2px;
|
||||
}
|
||||
|
||||
.collapse-details {
|
||||
max-height: 0;
|
||||
transition: max-height 0.2s;
|
||||
overflow: hidden;
|
||||
word-break: break-word;
|
||||
color: var(--codex-color);
|
||||
}
|
||||
|
||||
.collapse-details[aria-expanded] {
|
||||
max-height: 50px;
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
import { useState } from "react";
|
||||
import "./Collapse.css";
|
||||
import { attributes } from "../utils/attributes";
|
||||
|
||||
type Props = {
|
||||
summary: string;
|
||||
details: string;
|
||||
className?: string;
|
||||
};
|
||||
|
||||
export function Collapse({ summary, details, className = "" }: Props) {
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
|
||||
const onClick = () => setExpanded(!expanded);
|
||||
|
||||
return (
|
||||
<div className={"collapse " + className}>
|
||||
<span className="collapse-summary" onClick={onClick}>
|
||||
{summary}
|
||||
<ArrowRight />
|
||||
</span>
|
||||
<div
|
||||
{...attributes({ "aria-expanded": expanded })}
|
||||
className={"collapse-details"}
|
||||
>
|
||||
{details}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const ArrowRight = () => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="1rem"
|
||||
height="1rem"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
>
|
||||
<path d="m6 9 6 6 6-6"></path>
|
||||
</svg>
|
||||
);
|
|
@ -0,0 +1,3 @@
|
|||
.collapse-demo {
|
||||
min-width: 250px;
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import type { Meta, StoryObj } from "@storybook/react";
|
||||
import { Collapse } from "../src/components/Collapse/Collapse";
|
||||
import "./Collapse.stories.css";
|
||||
|
||||
const meta = {
|
||||
title: "Components/Collapse",
|
||||
component: Collapse,
|
||||
parameters: {
|
||||
layout: "centered",
|
||||
},
|
||||
tags: ["autodocs"],
|
||||
argTypes: {},
|
||||
} satisfies Meta<typeof Collapse>;
|
||||
|
||||
export default meta;
|
||||
type Story = StoryObj<typeof meta>;
|
||||
|
||||
export const Default: Story = {
|
||||
args: {
|
||||
summary: "Read more",
|
||||
details: "More details for collapse component",
|
||||
className: "collapse-demo",
|
||||
},
|
||||
};
|
Loading…
Reference in New Issue