diff --git a/packages/accordion/src/lib/Accordion.stories.tsx b/packages/accordion/src/lib/Accordion.stories.tsx index 99bfcebdcc..698be10e4b 100644 --- a/packages/accordion/src/lib/Accordion.stories.tsx +++ b/packages/accordion/src/lib/Accordion.stories.tsx @@ -13,7 +13,7 @@ const meta: Meta = { tags: ['autodocs'], argTypes: { variant: { - options: ['filled', 'outlined'], + options: ['filled', 'outlined', 'flush'], }, }, }; @@ -85,6 +85,28 @@ export const _Variants: StoryObj = { + + + + Flush + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada lacus ex, sit amet blandit + leo lobortis eget. + + + + Flush Nested Accordion + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada lacus ex, sit amet + blandit leo lobortis eget. + + + + + + ), }; @@ -97,13 +119,13 @@ export const _Variants: StoryObj = { * this is due to Material's default gutter behavior when expanded along with how they overwrite the behavior when disabling the gutters. */ export const _Spacing: StoryObj = { - render: () => ( + render: (args: AccordionProps) => (
Grouped
- + Accordion 1 @@ -112,7 +134,7 @@ export const _Spacing: StoryObj = { leo lobortis eget. - + Accordion 2 @@ -121,7 +143,7 @@ export const _Spacing: StoryObj = { leo lobortis eget. - + Accordion 3 with Actions @@ -140,7 +162,7 @@ export const _Spacing: StoryObj = { Separated in a Grid - + Accordion 4 @@ -151,7 +173,7 @@ export const _Spacing: StoryObj = { - + Accordion 5 @@ -162,7 +184,7 @@ export const _Spacing: StoryObj = { - + Accordion 6 with Actions @@ -220,6 +242,24 @@ export const _States: StoryObj = { + + + + Flush Expanded + + + + + Flush Nested Accordion + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada lacus ex, sit amet + blandit leo lobortis eget. + + + + + diff --git a/packages/accordion/src/lib/Accordion.tsx b/packages/accordion/src/lib/Accordion.tsx index 9189b9b2d4..f4e86e25db 100644 --- a/packages/accordion/src/lib/Accordion.tsx +++ b/packages/accordion/src/lib/Accordion.tsx @@ -2,9 +2,11 @@ import MuiAccordion, { AccordionProps as MuiAccordionProps } from '@mui/material import { styled } from '@mui/material/styles'; import { forwardRef } from 'react'; +type Variant = 'filled' | 'outlined' | 'flush'; + export type AccordionProps = { /** @default "filled" */ - variant?: 'filled' | 'outlined'; + variant?: Variant /** * Disable nested styling for child `Accordions` * @default false @@ -33,19 +35,50 @@ const OutlinedAccordion = styled(MuiAccordion, { backgroundColor: theme.palette.background.paper, }, '> .MuiCollapse-root > .MuiCollapse-wrapper > .MuiCollapse-wrapperInner > .MuiAccordion-region > .MuiAccordionDetails-root:first-of-type': - { - borderTop: `1px solid ${theme.palette.divider}`, - }, + { + borderTop: `1px solid ${theme.palette.divider}`, + }, +})); + +const FlushAccordion = styled(MuiAccordion, { + name: 'MuiAccordion', + slot: 'AvFlush', + overridesResolver: (props, styles) => styles.avFlush, +})(({ theme }) => ({ + border: 0, + borderBottom: `1px solid ${theme.palette.divider}`, + '&&': { + borderRadius: 0, + }, + '&:first-of-type': { + borderTop: `1px solid ${theme.palette.divider}`, + }, + '> .MuiAccordion-heading .MuiAccordionSummary-root:not(.Mui-focusVisible, :hover, :active)': { + backgroundColor: 'transparent' + }, + '> .MuiAccordion-heading .MuiAccordionSummary-root': { + padding: 8, + minHeight: 40, + }, + '> .MuiAccordion-heading .MuiAccordionSummary-root .MuiAccordionSummary-content': { + margin: 0 + }, + '& .MuiAccordionDetails-root .MuiAccordion-heading': { + borderRadius: 4, + } })); +const VariantComponent: Record = { + filled: FilledAccordion, + outlined: OutlinedAccordion, + flush: FlushAccordion +} + export const Accordion = forwardRef((allProps, ref) => { const { variant = 'filled', disableNestedStyling = false, className, ...props } = allProps; + const Variant = VariantComponent[variant] - const classnames = `${variant === 'filled' ? 'MuiAccordion-avFilled' : 'MuiAccordion-avOutlined'}${disableNestedStyling ? ' Av-disableNested' : ''} ${className || ''}`; + const classnames = `MuiAccordion-av${variant.charAt(0).toUpperCase() + variant.slice(1)}${disableNestedStyling ? ' Av-disableNested' : ''} ${className || ''}`; - return variant === 'filled' ? ( - - ) : ( - - ); + return ; });