Skip to content
This repository was archived by the owner on Aug 14, 2025. It is now read-only.

Commit bf407c3

Browse files
fix: collapsable code snippet (#30)
1 parent 1768466 commit bf407c3

3 files changed

Lines changed: 90 additions & 8 deletions

File tree

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export interface Story {
5252
type?: "fullsize" | "configurator";
5353
center?: boolean;
5454
information?: string;
55+
codeTemplateExpanded?: boolean;
5556
codeTemplate?: CodeTemplateFn;
5657
render?: (
5758
controls: ReturnType<

src/webapp/layout/story/Story.tsx

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import styled from "@emotion/styled";
2-
import { Center, Title } from "@mantine/core";
2+
import { Center, Title, Button, Collapse } from "@mantine/core";
33
import { observer } from "mobx-react-lite";
44
import { Story } from "../../../types";
55
import { Markdown } from "./atom/Markdown";
@@ -10,6 +10,8 @@ import { useControl } from "./control/useControl";
1010
import { useIsDarkMode } from "./control/useIsDarkMode";
1111
import { DefaultComponentWrapper } from "./DefaultComponentWrapper";
1212
import { useActionOutput } from "./useActionOutput";
13+
import { useState } from "react";
14+
import { ArrowDownIcon } from "../../icons/ArrowDownIcon";
1315

1416
export const StoryComponent = observer(({ story }: { story: Story }) => {
1517
const controls = useControl();
@@ -30,6 +32,21 @@ export const StoryComponent = observer(({ story }: { story: Story }) => {
3032

3133
const sectionId = encodeURIComponent(story?.name ?? "");
3234

35+
const [opened, setOpen] = useState(false);
36+
37+
const toggleCodeSnippet = () => {
38+
setOpen((prevOpened) => !prevOpened);
39+
};
40+
41+
const handleClick = () => {
42+
toggleCodeSnippet();
43+
};
44+
45+
let codeTemplateSource = null;
46+
if (story.codeTemplate) {
47+
codeTemplateSource = story.codeTemplate.toString().trim();
48+
}
49+
3350
return (
3451
<Wrapper>
3552
<SectionAnchor id={sectionId}>
@@ -61,13 +78,43 @@ export const StoryComponent = observer(({ story }: { story: Story }) => {
6178
/>
6279
</ControlsWrapper>
6380
</Configurator>
64-
{story.codeTemplate && (
65-
<CodeTemplate
66-
codeTemplate={story.codeTemplate}
67-
controls={controls}
68-
/>
69-
)}
70-
<ActionOutput outputs={outputs} />
81+
{story.codeTemplate &&
82+
(story.codeTemplateExpanded ? (
83+
<>
84+
<Button
85+
leftIcon={<ArrowDownIcon />}
86+
variant="default"
87+
onClick={handleClick}
88+
styles={() => ({
89+
root: {
90+
color: "gray",
91+
margin: "20px 0",
92+
},
93+
leftIcon: {
94+
transform: opened ? "rotate(180deg)" : "rotate(0deg)",
95+
transition: "transform 0.3s ease-in-out",
96+
},
97+
})}
98+
>
99+
{opened ? "Hide code example" : "Show code example"}
100+
</Button>
101+
<Collapse
102+
in={opened}
103+
transitionDuration={300}
104+
transitionTimingFunction="linear"
105+
>
106+
<CodeTemplate
107+
codeTemplate={story.codeTemplate}
108+
controls={controls}
109+
/>
110+
</Collapse>
111+
</>
112+
) : (
113+
<CodeTemplate
114+
codeTemplate={story.codeTemplate}
115+
controls={controls}
116+
/>
117+
))}
71118
</>
72119
)}
73120
</Wrapper>

src/webapp/layout/story/story-button/StoryButton.story.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export const story: Story = {
2424
{
2525
name: "Kivra Design System",
2626
center: true,
27+
2728
render() {
2829
return (
2930
<StoryHeaderButton
@@ -33,5 +34,38 @@ export const story: Story = {
3334
);
3435
},
3536
},
37+
{
38+
name: "Story Button",
39+
center: true,
40+
information:
41+
"This is just an example how to use `<StoryHeaderButton />`s props. <br/>In this example also implemented show/hide code snippet that is possible to use in stories with `codeTemplate` function.",
42+
codeTemplate: (props) => `
43+
<StoryHeaderButton${props}></StoryHeaderButton>
44+
`,
45+
codeTemplateExpanded: false,
46+
render({ segment, text }) {
47+
const type = segment({
48+
name: "type",
49+
value: "designsystem",
50+
options: [
51+
["designsystem", "designsystem"],
52+
["github", "github"],
53+
["figma", "figmaa"],
54+
],
55+
showAs: "select",
56+
});
57+
return (
58+
<StoryHeaderButton
59+
type={type}
60+
url={text({
61+
name: "url",
62+
value: "https://",
63+
defaultValue: "https://design.kivra.com/",
64+
description: "Always start with https://",
65+
})}
66+
/>
67+
);
68+
},
69+
},
3670
],
3771
};

0 commit comments

Comments
 (0)