-
Notifications
You must be signed in to change notification settings - Fork 622
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New Admin UI - Accordion Component #4505
Merged
Merged
Changes from 38 commits
Commits
Show all changes
60 commits
Select commit
Hold shift + click to select a range
9ea14e8
wip
adrians5j ac949f1
wip
adrians5j 2bc9162
Merge remote-tracking branch 'refs/remotes/origin/feat/new-admin-ui' …
adrians5j 11b2e36
wip
adrians5j 83f16ee
wip
adrians5j 0c84634
wip
adrians5j 2e0b203
wip
adrians5j 10b41f8
wip
adrians5j 5cc2a8f
wip
adrians5j 704561c
wip
adrians5j 015611c
wip
adrians5j 3ca70d2
wip
adrians5j 4b5d40b
wip
adrians5j b5e60de
Merge remote-tracking branch 'refs/remotes/origin/feat/new-admin-ui' …
adrians5j 99f2e65
wip
adrians5j b3808af
wip
adrians5j f12ab9a
wip
adrians5j 83a1d09
wip
adrians5j 483d6a1
wip
adrians5j 9f7b6bb
wip
adrians5j f3de0f5
wip
adrians5j c6dd8e0
wip
adrians5j 4ece986
wip
adrians5j 2203129
wip
adrians5j 2d65e51
wip
adrians5j c374ecb
wip
adrians5j e4971ef
wip
adrians5j 9441782
wip
adrians5j 1f16139
wip
adrians5j c204093
wip
adrians5j 674f4ec
wip
adrians5j e66d20d
wip
adrians5j a9e4de2
wip
adrians5j 74f78f4
wip
adrians5j d0487a9
wip
adrians5j e859420
wip
adrians5j 60cda1d
wip
adrians5j bd4a7d4
wip
adrians5j c5afa9d
fix: rename skeletonPulse to skeleton-pulse
adrians5j cf9c947
fix: use TW numbers instead of px
adrians5j effc6fa
fix: remove redundant displayName setting
adrians5j 844a55e
fix: make Icon label prop required again
adrians5j 5e5cb9c
fix: use `cva`
adrians5j 002ee3e
fix: remove default value
adrians5j b13d00c
fix: use `cva`
adrians5j 6199d04
fix: use `cva`
adrians5j 09dc98c
fix: remove context
adrians5j 22efe18
fix: remove comment
adrians5j a7c769c
wip
adrians5j 747fa3f
wip
adrians5j e408823
wip
adrians5j d2c65f3
wip
adrians5j 1c05b9b
wip
adrians5j a6e9e4a
Merge remote-tracking branch 'refs/remotes/origin/feat/new-admin-ui' …
adrians5j cdb3bcb
wip
adrians5j 64c3a74
wip
adrians5j 42df0a0
wip
adrians5j ffad86a
wip
adrians5j c5cd0aa
wip
adrians5j 0198736
wip
adrians5j File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,257 @@ | ||
import React from "react"; | ||
import type { Meta, StoryObj } from "@storybook/react"; | ||
import { Accordion, type AccordionItemProps as BaseAccordionItemProps } from "./Accordion"; | ||
|
||
import { ReactComponent as WarningIcon } from "@material-design-icons/svg/outlined/insert_chart.svg"; | ||
import { ReactComponent as ArrowUp } from "@material-design-icons/svg/outlined/arrow_upward.svg"; | ||
import { ReactComponent as ArrowDown } from "@material-design-icons/svg/outlined/arrow_downward.svg"; | ||
import { ReactComponent as EditIcon } from "@material-design-icons/svg/outlined/edit.svg"; | ||
import { ReactComponent as TrashIcon } from "@material-design-icons/svg/outlined/delete.svg"; | ||
|
||
const meta: Meta<typeof Accordion> = { | ||
title: "Components/Accordion", | ||
component: Accordion, | ||
tags: ["autodocs"], | ||
argTypes: {} | ||
}; | ||
|
||
export default meta; | ||
|
||
type Story = StoryObj<typeof Accordion>; | ||
|
||
interface AccordionItemProps extends Omit<BaseAccordionItemProps, "value" | "title" | "children"> { | ||
index: number; | ||
} | ||
|
||
const AccordionItem = (props: AccordionItemProps) => { | ||
return ( | ||
<Accordion.Item | ||
value={`Accordion item ${props.index}`} | ||
title={`Accordion item ${props.index}`} | ||
{...props} | ||
> | ||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed elit sem, pretium sit amet | ||
convallis nec, consequat non nulla. Nunc sit amet sagittis tellus. Etiam venenatis, odio | ||
sed consectetur consectetur, quam quam blandit ante, semper maximus lorem est vel dolor. | ||
Praesent ac neque rutrum, elementum turpis et, vulputate enim. In ex lorem, | ||
</Accordion.Item> | ||
); | ||
}; | ||
|
||
export const Default: Story = { | ||
decorators: [ | ||
Story => ( | ||
<div className="wby-w-[600px] wby-p-[50px] wby-min-h-[500px] wby-bg-[#f6f7f8]"> | ||
<Story /> | ||
</div> | ||
) | ||
], | ||
args: { | ||
children: ( | ||
<> | ||
<AccordionItem index={1} /> | ||
<AccordionItem index={2} /> | ||
<AccordionItem index={3} /> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const WithDescriptions: Story = { | ||
...Default, | ||
args: { | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
/> | ||
<AccordionItem | ||
index={3} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
/> | ||
</> | ||
) | ||
}, | ||
argTypes: {} | ||
}; | ||
|
||
export const WithIcon: Story = { | ||
...Default, | ||
args: { | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const WithActionsIcon: Story = { | ||
...Default, | ||
args: { | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
actions={ | ||
<> | ||
<Accordion.Item.Action icon={<ArrowUp />} /> | ||
<Accordion.Item.Action icon={<ArrowDown />} /> | ||
<Accordion.Item.Action.Separator /> | ||
<Accordion.Item.Action icon={<EditIcon />} /> | ||
<Accordion.Item.Action icon={<TrashIcon />} /> | ||
</> | ||
} | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
actions={ | ||
<> | ||
<Accordion.Item.Action icon={<ArrowUp />} /> | ||
<Accordion.Item.Action icon={<ArrowDown />} /> | ||
<Accordion.Item.Action.Separator /> | ||
<Accordion.Item.Action icon={<EditIcon />} /> | ||
<Accordion.Item.Action icon={<TrashIcon />} /> | ||
</> | ||
} | ||
/> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const WithHandleIcon: Story = { | ||
...Default, | ||
args: { | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
handle={<Accordion.Item.Handle />} | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
handle={<Accordion.Item.Handle />} | ||
/> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const WithMultipleOpenedItems: Story = { | ||
...Default, | ||
args: { | ||
type: "multiple", | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
/> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const ContainerVariant: Story = { | ||
...Default, | ||
args: { | ||
variant: "container", | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const LightBackground: Story = { | ||
...Default, | ||
decorators: [ | ||
Story => ( | ||
<div className="wby-w-[600px] wby-p-[50px] wby-min-h-[500px]"> | ||
<Story /> | ||
</div> | ||
) | ||
], | ||
args: { | ||
background: "light", | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
</> | ||
) | ||
} | ||
}; | ||
|
||
export const ContainerVariantWithLightBackground: Story = { | ||
...Default, | ||
decorators: [ | ||
Story => ( | ||
<div className="wby-w-[600px] wby-p-[50px] wby-min-h-[500px]"> | ||
<Story /> | ||
</div> | ||
) | ||
], | ||
args: { | ||
variant: "container", | ||
background: "light", | ||
children: ( | ||
<> | ||
<AccordionItem | ||
index={1} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
<AccordionItem | ||
index={2} | ||
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." | ||
icon={<Accordion.Item.Icon icon={<WarningIcon />} label={"Warning icon"} />} | ||
/> | ||
</> | ||
) | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import React, { useMemo } from "react"; | ||
import { cn, makeDecoratable, withStaticProps } from "~/utils"; | ||
import { AccordionRoot } from "./components/AccordionRoot"; | ||
import { AccordionContext, useAccordion } from "./components/AccordionContext"; | ||
import { AccordionItem, type AccordionItemProps } from "./components/AccordionItem"; | ||
|
||
type AccordionProps = React.ComponentPropsWithoutRef<typeof AccordionRoot> & { | ||
children: React.ReactNode; | ||
variant?: "underline" | "container"; | ||
background?: "transparent" | "base" | "light"; | ||
}; | ||
|
||
const AccordionBase = ({ | ||
children, | ||
variant, | ||
background = "base", | ||
...baseRootProps | ||
}: AccordionProps) => { | ||
const rootProps = useMemo(() => { | ||
const rootProps = { ...baseRootProps }; | ||
if (rootProps.type !== "multiple") { | ||
// For single accordion, make it collapsible by default. | ||
rootProps.collapsible = rootProps.collapsible !== false; | ||
} | ||
return rootProps; | ||
}, [baseRootProps]); | ||
|
||
return ( | ||
<AccordionRoot | ||
{...rootProps} | ||
className={cn( | ||
"w-full", | ||
{ "wby-gap-xs wby-flex wby-flex-col": variant === "container" }, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not use the |
||
rootProps.className | ||
)} | ||
> | ||
<AccordionContext.Provider value={{ variant, background }}> | ||
{children} | ||
</AccordionContext.Provider> | ||
</AccordionRoot> | ||
); | ||
}; | ||
|
||
AccordionBase.displayName = "Accordion"; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need this? Maybe not, since we are not using |
||
|
||
const DecoratableAccordion = makeDecoratable("Accordion", AccordionBase); | ||
|
||
const Accordion = withStaticProps(DecoratableAccordion, { | ||
Item: AccordionItem | ||
}); | ||
|
||
export { Accordion, type AccordionProps, type AccordionItemProps, useAccordion }; |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shall we stick to a camelCase or kebab-case naming convention? The kebab-case looks good, but I would change
skeletonPulse
🙏There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.