Skip to content
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

Add border radius to button group #2506

Merged
merged 4 commits into from
Nov 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/components/ButtonGroup/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { BaseProps } from '../types';
export interface ButtonGroupProps extends BaseProps {
children?: ReactNode;
variant?: 'default' | 'shaded';
borderRadius?: 'square' | 'semi-rounded' | 'rounded';
}

export default function(props: ButtonGroupProps): JSX.Element | null;
13 changes: 11 additions & 2 deletions src/components/ButtonGroup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ import StyledContainer from './styled/container';
* Button groups are used to bunch together buttons with similar actions
*/
export default function ButtonGroup(props) {
const { className, style, children, variant } = props;
const { className, style, children, variant, borderRadius } = props;

return (
<StyledContainer className={className} style={style} role="group" variant={variant}>
<StyledContainer
className={className}
style={style}
role="group"
variant={variant}
borderRadius={borderRadius}
>
{children}
</StyledContainer>
);
Expand All @@ -26,11 +32,14 @@ ButtonGroup.propTypes = {
/** The variant changes the appearance of the ButtonGroup. Accepted variants include default,
* and shaded. This value defaults to default. */
variant: PropTypes.oneOf(['default', 'shaded']),
/** The border radius of the button. Valid values are square, semi-rounded and rounded. This value defaults to rounded. */
borderRadius: PropTypes.oneOf(['square', 'semi-rounded', 'rounded']),
};

ButtonGroup.defaultProps = {
children: null,
className: undefined,
style: undefined,
variant: 'default',
borderRadius: 'rounded',
};
65 changes: 65 additions & 0 deletions src/components/ButtonGroup/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -336,3 +336,68 @@ import { ButtonGroup, Button } from 'react-rainbow-components';
</ButtonGroup>
</div>
```

##### button group with different border radius

```js
import React from 'react';
import { ButtonGroup, Button } from 'react-rainbow-components';
import styled from 'styled-components';

const HeadingContent = styled.div`
@media (max-width: 991px) {
flex-direction: column;
:nth-child(1) { text-align: center; }
}
flex-direction: column;
`;

const SubTitle = styled.span.attrs(props => {
return props.theme.rainbow.palette;
})`
color: ${props => props.text.header};
`;

const Container = styled.div`
max-width: 780px;
margin: auto;
`;

const ButtonGroupExample = () => {
return (
<Container>
<HeadingContent className="rainbow-p-top_large rainbow-align-content_space-between rainbow-m-horizontal_medium rainbow-flex">
<div className="rainbow-m-bottom_medium">
<SubTitle>Button group with border radius square.</SubTitle>
</div>
<ButtonGroup className="rainbow-m-bottom_medium" borderRadius="square">
<Button label="New" variant="neutral" />
<Button label="Edit" variant="neutral" />
<Button label="Remove" variant="neutral" />
</ButtonGroup>

<div className="rainbow-m-bottom_medium">
<SubTitle>Button group with border radius semi-rounded.</SubTitle>
</div>

<ButtonGroup className="rainbow-m-bottom_medium" borderRadius="semi-rounded">
<Button label="New" variant="neutral" />
<Button label="Edit" variant="neutral" />
<Button label="Remove" variant="neutral" />
</ButtonGroup>
<div className="rainbow-m-bottom_medium">
<SubTitle>Button group with border radius rounded.</SubTitle>
</div>

<ButtonGroup className="rainbow-m-bottom_medium" borderRadius="rounded">
<Button label="New" variant="neutral" />
<Button label="Edit" variant="neutral" />
<Button label="Remove" variant="neutral" />
</ButtonGroup>
</HeadingContent>
</Container>
);
};

<ButtonGroupExample />;
```
26 changes: 26 additions & 0 deletions src/components/ButtonGroup/styled/container.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* stylelint-disable no-descending-specificity */
import styled from 'styled-components';
import attachThemeAttrs from '../../../styles/helpers/attachThemeAttrs';
import { BORDER_RADIUS_SQUARE, BORDER_RADIUS_SEMI_ROUNDED } from '../../../styles/borderRadius';

const StyledContainer = attachThemeAttrs(styled.div)`
display: inline-flex;
Expand Down Expand Up @@ -61,6 +62,31 @@ const StyledContainer = attachThemeAttrs(styled.div)`
}
}
`}

${props =>
props.borderRadius === 'square' &&
`
border-radius: ${BORDER_RADIUS_SQUARE};
> button:first-child {
border-radius: ${BORDER_RADIUS_SQUARE} 0 0 ${BORDER_RADIUS_SQUARE};
};
> button:last-child {
border-radius: 0 ${BORDER_RADIUS_SQUARE} ${BORDER_RADIUS_SQUARE} 0;
};
`};

${props =>
props.borderRadius === 'semi-rounded' &&
`
border-radius: ${BORDER_RADIUS_SEMI_ROUNDED};
> button:first-child {
border-radius: ${BORDER_RADIUS_SEMI_ROUNDED} 0 0 ${BORDER_RADIUS_SEMI_ROUNDED};
};
> button:last-child {
border-radius: 0 ${BORDER_RADIUS_SEMI_ROUNDED} ${BORDER_RADIUS_SEMI_ROUNDED} 0;
};
`};

`;

export default StyledContainer;