From cc46c8c9bd5b6c220fdc30cb97cc2fac8cea825b Mon Sep 17 00:00:00 2001 From: ruli Date: Fri, 5 Jan 2024 15:24:00 +0700 Subject: [PATCH 1/2] feat: add option prop in AccordianHeader to support custom icon and color --- .../Accordion/AccordionHeader.tsx | 66 +++++++++++++------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/src/components/layout-elements/Accordion/AccordionHeader.tsx b/src/components/layout-elements/Accordion/AccordionHeader.tsx index a5602a825..7d5eb077e 100644 --- a/src/components/layout-elements/Accordion/AccordionHeader.tsx +++ b/src/components/layout-elements/Accordion/AccordionHeader.tsx @@ -1,5 +1,5 @@ "use client"; -import { tremorTwMerge } from "lib"; +import { BaseColors, Color, colorPalette, getColorClassNames, tremorTwMerge } from "lib"; import React, { useContext } from "react"; import { Disclosure } from "@headlessui/react"; @@ -9,14 +9,30 @@ import { makeClassName, sizing, spacing } from "lib"; const makeAccordionHeaderClassName = makeClassName("AccordionHeader"); -const AccordionHeader = React.forwardRef< - HTMLButtonElement, - React.ButtonHTMLAttributes ->((props, ref) => { - const { children, className, ...other } = props; +interface AccordionHeaderOptions { + openIcon?: React.ElementType; + closedIcon?: React.ElementType; + colors?: Color | string; +} +export interface AccordionHeaderProps extends React.ButtonHTMLAttributes { + options?: AccordionHeaderOptions; +} +export interface AccordionProps extends React.HTMLAttributes { + defaultOpen?: boolean; +} + +const AccordionHeader = React.forwardRef((props, ref) => { + const { children, className, options, ...other } = props; const { isOpen } = useContext(OpenContext); + const CustomIcon = + options?.closedIcon && options.openIcon + ? isOpen + ? options.openIcon + : options.closedIcon + : null; + return (
- + {CustomIcon ? ( + + ) : ( + + )}
); From 47b2d3dd003c8d23c9bac746cc0284d14e4fb504 Mon Sep 17 00:00:00 2001 From: ruli Date: Fri, 5 Jan 2024 15:33:58 +0700 Subject: [PATCH 2/2] feat: new story for custom icon accordian --- .../layout-elements/Accordion.stories.tsx | 5 ++ .../helpers/SimpleCustomIconAccordion.tsx | 49 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/stories/layout-elements/helpers/SimpleCustomIconAccordion.tsx diff --git a/src/stories/layout-elements/Accordion.stories.tsx b/src/stories/layout-elements/Accordion.stories.tsx index 7fa0e7ea5..a257df45a 100644 --- a/src/stories/layout-elements/Accordion.stories.tsx +++ b/src/stories/layout-elements/Accordion.stories.tsx @@ -2,6 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react"; import { Accordion } from "components"; import { SimpleAccordion } from "./helpers/SimpleAccordion"; +import { SimpleCustomIconAccordionList } from "./helpers/SimpleCustomIconAccordion"; const meta: Meta = { title: "UI/Layout/Accordion", @@ -25,3 +26,7 @@ export const DefaultOpen: Story = { defaultOpen: true, }, }; + +export const WithCustomIcon: Story = { + render: SimpleCustomIconAccordionList, +}; diff --git a/src/stories/layout-elements/helpers/SimpleCustomIconAccordion.tsx b/src/stories/layout-elements/helpers/SimpleCustomIconAccordion.tsx new file mode 100644 index 000000000..183548be4 --- /dev/null +++ b/src/stories/layout-elements/helpers/SimpleCustomIconAccordion.tsx @@ -0,0 +1,49 @@ +import React from "react"; + +import { ArrowRightIcon, ArrowUpHeadIcon, ChevronRightFill } from "assets"; +import { + Accordion, + AccordionBody, + AccordionHeader, + AccordionList, + Callout, + Text, +} from "components"; + +export const CustomIconAccordion = (args: any) => ( + +
+ + Product A +
+ + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod. Sit amet, + consetetur sadipscing elitr. Per aspera ad astra. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempor lorem non est congue + blandit. Praesent non lorem sodales, suscipit est sed, hendrerit dolor. + +
+); + +export const SimpleCustomIconAccordionList = (args: any) => { + return ( + + + + + + ); +};