diff --git a/ui/components/ui/box/README.mdx b/ui/components/ui/box/README.mdx
index 5d2df0bba..36c91125e 100644
--- a/ui/components/ui/box/README.mdx
+++ b/ui/components/ui/box/README.mdx
@@ -120,8 +120,6 @@ or array of these values.
import { DISPLAY } from '../../../helpers/constants/design-system';
import Box from '../ui/box';
-
-
@@ -131,6 +129,28 @@ import Box from '../ui/box';
```
+### Color
+
+The `color` prop can be used to set the color of the content in Box component. The `color` prop accepts [responsive props](#responsive-props) in the form of array props.
+
+
+
+Example of importing `COLORS` object with `Box` component
+
+```jsx
+import { COLORS } from '../../../helpers/constants/design-system';
+import Box from '../ui/box';
+
+
+ Text goes here
+;
+```
+
### Background Color
Use the `backgroundColor` prop along with the `COLORS` object from `ui/helpers/constants/design-system.js` to change background color. The `backgroundColor` prop accepts [responsive props](#responsive-props) in the form of array props.
@@ -172,6 +192,7 @@ import Box from '../ui/box';
;
```
+
### Responsive Props
The box component provides a responsive props api in the form of array props. Array props are inspired by [styled-systems array props](https://styled-system.com/guides/array-props). The responsive props follow a mobile first methodology with the first item in the array applying the style to the base level size e.g. `0px` and up. The second item overwrites the first items styles at the next breakpoint.
diff --git a/ui/components/ui/box/box.js b/ui/components/ui/box/box.js
index 09c4c0f39..85d638211 100644
--- a/ui/components/ui/box/box.js
+++ b/ui/components/ui/box/box.js
@@ -6,7 +6,9 @@ import {
ALIGN_ITEMS,
BLOCK_SIZES,
BORDER_STYLE,
- COLORS,
+ BACKGROUND_COLORS,
+ BORDER_COLORS,
+ TEXT_COLORS,
DISPLAY,
JUSTIFY_CONTENT,
SIZES,
@@ -18,64 +20,14 @@ import {
const BASE_CLASS_NAME = 'box';
const Sizes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
-export const BackgroundColors = [
- COLORS.BACKGROUND_DEFAULT,
- COLORS.BACKGROUND_ALTERNATIVE,
- COLORS.OVERLAY_DEFAULT,
- COLORS.PRIMARY_DEFAULT,
- COLORS.PRIMARY_ALTERNATIVE,
- COLORS.PRIMARY_MUTED,
- COLORS.ERROR_DEFAULT,
- COLORS.ERROR_ALTERNATIVE,
- COLORS.ERROR_MUTED,
- COLORS.WARNING_DEFAULT,
- COLORS.WARNING_ALTERNATIVE,
- COLORS.WARNING_MUTED,
- COLORS.SUCCESS_DEFAULT,
- COLORS.SUCCESS_ALTERNATIVE,
- COLORS.SUCCESS_MUTED,
- COLORS.INFO_DEFAULT,
- COLORS.INFO_ALTERNATIVE,
- COLORS.INFO_MUTED,
- COLORS.MAINNET,
- COLORS.ROPSTEN,
- COLORS.KOVAN,
- COLORS.RINKEBY,
- COLORS.GOERLI,
- COLORS.TRANSPARENT,
- COLORS.LOCALHOST,
-];
-export const BorderColors = [
- COLORS.BORDER_DEFAULT,
- COLORS.BORDER_MUTED,
- COLORS.PRIMARY_DEFAULT,
- COLORS.PRIMARY_ALTERNATIVE,
- COLORS.PRIMARY_MUTED,
- COLORS.ERROR_DEFAULT,
- COLORS.ERROR_ALTERNATIVE,
- COLORS.ERROR_MUTED,
- COLORS.WARNING_DEFAULT,
- COLORS.WARNING_ALTERNATIVE,
- COLORS.WARNING_MUTED,
- COLORS.SUCCESS_DEFAULT,
- COLORS.SUCCESS_ALTERNATIVE,
- COLORS.SUCCESS_MUTED,
- COLORS.INFO_DEFAULT,
- COLORS.INFO_ALTERNATIVE,
- COLORS.INFO_MUTED,
- COLORS.MAINNET,
- COLORS.ROPSTEN,
- COLORS.KOVAN,
- COLORS.RINKEBY,
- COLORS.GOERLI,
- COLORS.TRANSPARENT,
- COLORS.LOCALHOST,
-];
const ValidSize = PropTypes.oneOf(Sizes);
const ValidSizeAndAuto = PropTypes.oneOf([...Sizes, 'auto']);
-export const ValidBackgroundColors = PropTypes.oneOf(BackgroundColors);
-export const ValidBorderColors = PropTypes.oneOf(BorderColors);
+export const ValidBackgroundColors = PropTypes.oneOf(
+ Object.values(BACKGROUND_COLORS),
+);
+export const ValidBorderColors = PropTypes.oneOf(Object.values(BORDER_COLORS));
+export const ValidTextColors = PropTypes.oneOf(Object.values(TEXT_COLORS));
const ArrayOfValidSizes = PropTypes.arrayOf(ValidSize);
export const MultipleSizes = PropTypes.oneOfType([
@@ -101,6 +53,12 @@ export const MultipleBackgroundColors = PropTypes.oneOfType([
ArrayOfValidBackgroundColors,
]);
+const ArrayOfValidTextColors = PropTypes.arrayOf(ValidTextColors);
+export const MultipleTextColors = PropTypes.oneOfType([
+ ValidTextColors,
+ ArrayOfValidTextColors,
+]);
+
function isValidSize(type, value) {
// Only margin types allow 'auto'
return (
@@ -228,6 +186,7 @@ export default function Box({
className,
backgroundColor,
as = 'div',
+ color,
...props
}) {
const boxClassName = classnames(
@@ -259,6 +218,7 @@ export default function Box({
textAlign && generateClassNames('text-align', textAlign, isValidString),
width && generateClassNames('width', width, isValidString),
height && generateClassNames('height', height, isValidString),
+ color && generateClassNames('color', color, isValidString),
backgroundColor &&
generateClassNames('background-color', backgroundColor, isValidString),
borderRadius && generateClassNames('rounded', borderRadius, isValidString),
@@ -267,6 +227,7 @@ export default function Box({
borderColor &&
generateClassNames('border-color', borderColor, isValidString),
borderWidth && generateClassNames('border-width', borderWidth, isValidSize),
+
{
// Auto applied classes
// ---Borders---
@@ -352,6 +313,7 @@ Box.propTypes = {
PropTypes.arrayOf(PropTypes.oneOf(Object.values(BLOCK_SIZES))),
]),
backgroundColor: MultipleBackgroundColors,
+ color: MultipleTextColors,
className: PropTypes.string,
/**
* The polymorphic `as` prop allows you to change the root HTML element of the Box component
diff --git a/ui/components/ui/box/box.scss b/ui/components/ui/box/box.scss
index edafb9fcb..77a7364bf 100644
--- a/ui/components/ui/box/box.scss
+++ b/ui/components/ui/box/box.scss
@@ -416,4 +416,21 @@ $attributesToApplyExtraProperties: margin;
}
}
}
+
+ // color
+ @each $variant, $color in design-system.$color-map {
+ &--color-#{$variant} {
+ color: var($color);
+ }
+ }
+ // breakpoint classes
+ @each $breakpoint, $min-width in $screen-sizes-map {
+ @each $variant, $color in design-system.$color-map {
+ @media screen and (min-width: $min-width) {
+ &--#{$breakpoint}\color-#{$variant} {
+ color: var($color);
+ }
+ }
+ }
+ }
}
diff --git a/ui/components/ui/box/box.stories.js b/ui/components/ui/box/box.stories.js
index ea50b0e23..2341b3798 100644
--- a/ui/components/ui/box/box.stories.js
+++ b/ui/components/ui/box/box.stories.js
@@ -4,6 +4,9 @@ import {
BLOCK_SIZES,
BORDER_STYLE,
COLORS,
+ TEXT_COLORS,
+ BORDER_COLORS,
+ BACKGROUND_COLORS,
DISPLAY,
JUSTIFY_CONTENT,
SIZES,
@@ -14,7 +17,7 @@ import {
import Typography from '../typography';
-import Box, { BackgroundColors, BorderColors } from './box';
+import Box from './box';
import README from './README.mdx';
@@ -60,12 +63,17 @@ export default {
table: { category: 'display' },
},
backgroundColor: {
- options: BackgroundColors,
+ options: Object.values(BACKGROUND_COLORS),
control: 'select',
table: {
category: 'background',
},
},
+ color: {
+ options: Object.values(TEXT_COLORS),
+ control: 'select',
+ table: { category: 'color' },
+ },
borderStyle: {
options: Object.values(BORDER_STYLE),
control: 'select',
@@ -78,7 +86,7 @@ export default {
table: { category: 'border' },
},
borderColor: {
- options: BorderColors,
+ options: Object.values(BORDER_COLORS),
control: 'select',
defaultValue: COLORS.BORDER_DEFAULT,
table: { category: 'border' },
@@ -426,3 +434,25 @@ export const As = (args) => {
>
);
};
+
+export const Color = () => {
+ return (
+ <>
+
+ COLORS.TEXT_DEFAULT
+
+
+ COLORS.PRIMARY_DEFAULT
+
+
+ COLORS.SECONDARY_DEFAULT
+
+
+ COLORS.ERROR_DEFAULT
+
+
+ COLORS.SUCCESS_DEFAULT
+
+ >
+ );
+};
diff --git a/ui/components/ui/box/box.test.js b/ui/components/ui/box/box.test.js
index c2b87bffb..12fb89e19 100644
--- a/ui/components/ui/box/box.test.js
+++ b/ui/components/ui/box/box.test.js
@@ -659,6 +659,7 @@ describe('Box', () => {
);
});
});
+
describe('width, height', () => {
it('should render the Box with the width class', () => {
const { getByText } = render(
@@ -747,4 +748,38 @@ describe('Box', () => {
);
});
});
+ describe('color', () => {
+ it('should render the Box with the color class', () => {
+ const { getByText } = render(
+ Box content,
+ );
+ expect(getByText('Box content')).toHaveClass('box--color-text-default');
+ });
+ it('should render the Box with the responsive color classes', () => {
+ const { getByText } = render(
+
+ Box content
+ ,
+ );
+ expect(getByText('Box content')).toHaveClass(
+ 'box--color-primary-default',
+ );
+ expect(getByText('Box content')).toHaveClass(
+ 'box--sm:color-secondary-default',
+ );
+ expect(getByText('Box content')).toHaveClass(
+ 'box--md:color-error-default',
+ );
+ expect(getByText('Box content')).toHaveClass(
+ 'box--lg:color-success-default',
+ );
+ });
+ });
});
diff --git a/ui/helpers/constants/design-system.js b/ui/helpers/constants/design-system.js
index 7e0487c40..3c21822f2 100644
--- a/ui/helpers/constants/design-system.js
+++ b/ui/helpers/constants/design-system.js
@@ -4,6 +4,9 @@
* should match the property. When detailing a collection of things, it should
* match the plural form of the thing. e.g. COLORS, TYPOGRAPHY
*/
+
+import { pick } from 'lodash';
+
export const COLORS = {
BACKGROUND_DEFAULT: 'background-default',
BACKGROUND_ALTERNATIVE: 'background-alternative',
@@ -54,8 +57,80 @@ export const COLORS = {
GOERLI: 'goerli',
TRANSPARENT: 'transparent',
LOCALHOST: 'localhost',
+ INHERIT: 'inherit',
};
+export const BACKGROUND_COLORS = pick(COLORS, [
+ 'BACKGROUND_DEFAULT',
+ 'BACKGROUND_ALTERNATIVE',
+ 'OVERLAY_DEFAULT',
+ 'PRIMARY_DEFAULT',
+ 'PRIMARY_ALTERNATIVE',
+ 'PRIMARY_MUTED',
+ 'ERROR_DEFAULT',
+ 'ERROR_ALTERNATIVE',
+ 'ERROR_MUTED',
+ 'WARNING_DEFAULT',
+ 'WARNING_ALTERNATIVE',
+ 'WARNING_MUTED',
+ 'SUCCESS_DEFAULT',
+ 'SUCCESS_ALTERNATIVE',
+ 'SUCCESS_MUTED',
+ 'INFO_DEFAULT',
+ 'INFO_ALTERNATIVE',
+ 'INFO_MUTED',
+ 'MAINNET',
+ 'ROPSTEN',
+ 'KOVAN',
+ 'RINKEBY',
+ 'GOERLI',
+ 'TRANSPARENT',
+ 'LOCALHOST',
+]);
+export const BORDER_COLORS = pick(COLORS, [
+ 'BORDER_DEFAULT',
+ 'BORDER_MUTED',
+ 'PRIMARY_DEFAULT',
+ 'PRIMARY_ALTERNATIVE',
+ 'PRIMARY_MUTED',
+ 'ERROR_DEFAULT',
+ 'ERROR_ALTERNATIVE',
+ 'ERROR_MUTED',
+ 'WARNING_DEFAULT',
+ 'WARNING_ALTERNATIVE',
+ 'WARNING_MUTED',
+ 'SUCCESS_DEFAULT',
+ 'SUCCESS_ALTERNATIVE',
+ 'SUCCESS_MUTED',
+ 'INFO_DEFAULT',
+ 'INFO_ALTERNATIVE',
+ 'INFO_MUTED',
+ 'MAINNET',
+ 'ROPSTEN',
+ 'KOVAN',
+ 'RINKEBY',
+ 'GOERLI',
+ 'TRANSPARENT',
+ 'LOCALHOST',
+]);
+
+export const TEXT_COLORS = pick(COLORS, [
+ 'TEXT_DEFAULT',
+ 'TEXT_ALTERNATIVE',
+ 'TEXT_MUTED',
+ 'OVERLAY_INVERSE',
+ 'PRIMARY_DEFAULT',
+ 'PRIMARY_INVERSE',
+ 'SECONDARY_DEFAULT',
+ 'SECONDARY_INVERSE',
+ 'ERROR_DEFAULT',
+ 'ERROR_INVERSE',
+ 'SUCCESS_DEFAULT',
+ 'SUCCESS_INVERSE',
+ 'WARNING_INVERSE',
+ 'INFO_DEFAULT',
+ 'INFO_INVERSE',
+]);
export const TYPOGRAPHY = {
H1: 'h1',
H2: 'h2',