diff --git a/package.json b/package.json index 02ad5598..b4f3b4f2 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "react-media": "^1.10.0" }, "devDependencies": { - "@material-ui/core": "^4.11.0", + "@material-ui/core": "^4.11.2", "@storybook/addon-actions": "^6.1.0", "@storybook/addon-docs": "^6.1.0", "@storybook/addon-links": "^6.1.0", diff --git a/src/dataDisplay/Accordion/accordion.stories.tsx b/src/dataDisplay/Accordion/accordion.stories.tsx new file mode 100644 index 00000000..71663c8d --- /dev/null +++ b/src/dataDisplay/Accordion/accordion.stories.tsx @@ -0,0 +1,111 @@ +import React from 'react'; + +import Accordion from './index'; +import { Card, Text, IconText } from '../../index'; + +export default { + title: 'Data Display/Accordion', + component: Accordion, + parameters: { + componentSubtitle: 'Expansion panels with Summary and Detail content.', + }, +}; + +export const SimpleAccordion = (): React.ReactElement => ( + + + } + detailsContent={ + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. + + } + /> + + } + detailsContent={ + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. + + } + /> + + } + detailsContent={ + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. + + } + /> + +); + +export const CompactAccordion = (): React.ReactElement => ( +
+ + } + detailsContent={ + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. + + } + /> + + } + detailsContent={ + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. + + } + /> +
+); diff --git a/src/dataDisplay/Accordion/index.tsx b/src/dataDisplay/Accordion/index.tsx new file mode 100644 index 00000000..75d704a4 --- /dev/null +++ b/src/dataDisplay/Accordion/index.tsx @@ -0,0 +1,101 @@ +import React, { ReactNode, ReactElement } from 'react'; +import AccordionMUI from '@material-ui/core/Accordion'; +import AccordionSummaryMUI from '@material-ui/core/AccordionSummary'; +import AccordionDetailsMUI from '@material-ui/core/AccordionDetails'; +import styled from 'styled-components'; + +import FixedIcon from '../FixedIcon'; + +type AccordionProps = { + compact?: boolean; +}; + +export const StyledAccordion = styled(AccordionMUI)` + &.MuiAccordion-root { + border-radius: ${({ compact }) => (compact ? '8px' : '0')}; + border: ${({ compact, theme }) => + compact ? '2px solid ' + theme.colors.separator : 'none'}; + border-bottom: 2px solid ${({ theme }) => theme.colors.separator}; + margin-bottom: ${({ compact }) => (compact ? '16px' : '0')}; + overflow: hidden; + + &:before { + height: 0; + } + + &:first-child { + border-top: 2px solid ${({ theme }) => theme.colors.separator}; + } + + &.Mui-expanded { + margin: ${({ compact }) => (compact ? '0 0 16px 0' : '0')}; + } + } +`; +export const AccordionSummary = styled(AccordionSummaryMUI)` + &.MuiAccordionSummary-root { + &.Mui-expanded { + min-height: 48px; + border-bottom: 2px solid ${({ theme }) => theme.colors.separator}; + margin-bottom: ${({ compact }) => (compact ? '16px' : '0')}; + background-color: ${({ theme }) => theme.colors.background}; + } + + &:hover { + background-color: ${({ theme }) => theme.colors.background}; + border-radius: ${({ compact }) => (compact ? '8px' : '0')}; + } + + .MuiAccordionSummary-content { + &.Mui-expanded { + margin: 0; + } + } + .MuiIconButton-root { + font-size: 0; + } + } +`; +export const AccordionDetails = styled(AccordionDetailsMUI)``; + +type Props = { + compact?: boolean; + id?: string; + onChange?: ( + event: React.ChangeEvent>, + expanded: boolean, + id?: string + ) => void; + summaryContent: ReactNode; + detailsContent: ReactNode; +}; + +const Accordion = ({ + compact, + id, + onChange, + summaryContent, + detailsContent, + ...props +}: Props): ReactElement => { + return ( + { + onChange?.(event, expanded, id); + }}> + } + aria-controls="panel1a-content" + id="panel1a-header"> + {summaryContent} + + {detailsContent} + + ); +}; + +export default Accordion; diff --git a/src/dataDisplay/index.ts b/src/dataDisplay/index.ts index 0f29ac95..bb6afd7c 100644 --- a/src/dataDisplay/index.ts +++ b/src/dataDisplay/index.ts @@ -1,4 +1,5 @@ export { default as Card } from './Card'; +export { default as Accordion } from './Accordion'; export { default as Divider } from './Divider'; export { default as Dot } from './Dot'; export { default as FixedIcon } from './FixedIcon'; diff --git a/yarn.lock b/yarn.lock index 25a08f5c..5b19bd5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1172,7 +1172,7 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@material-ui/core@^4.11.0": +"@material-ui/core@^4.11.2": version "4.11.2" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.2.tgz#f8276dfa40d88304e6ceb98962af73803d27d42d" integrity sha512-/D1+AQQeYX/WhT/FUk78UCRj8ch/RCglsQLYujYTIqPSJlwZHKcvHidNeVhODXeApojeXjkl0tWdk5C9ofwOkQ== @@ -1190,6 +1190,13 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" +"@material-ui/icons@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles@^4.11.2": version "4.11.2" resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.2.tgz#e70558be3f41719e8c0d63c7a3c9ae163fdc84cb"