From d25f9cf4dafd528a6b00cb959bb665d3d4be8dc5 Mon Sep 17 00:00:00 2001 From: Garrett Bear Date: Thu, 18 Aug 2022 10:51:53 -0700 Subject: [PATCH] UI-14395: typography v2 (#15408) UI-14395: change Typography v2 to Text UI-14395: upgrade design tokens UI-14395: add classname testing UI-14395: update text colors, update font family name to match token, update text storybook boxprops UI-14395: add text transform docs lint fix --- .storybook/metamask-storybook-theme.js | 2 +- app/fonts/Euclid/EuclidCircularB-Medium.ttf | Bin 0 -> 160832 bytes package.json | 2 +- .../component-library-components.scss | 1 + .../component-library/text/README.mdx | 302 ++++++++++++++++++ ui/components/component-library/text/index.js | 1 + ui/components/component-library/text/text.js | 145 +++++++++ .../component-library/text/text.scss | 104 ++++++ .../component-library/text/text.stories.js | 270 ++++++++++++++++ .../component-library/text/text.test.js | 221 +++++++++++++ ui/css/design-system/attributes.scss | 2 +- ui/css/design-system/typography.scss | 17 +- ui/helpers/constants/design-system.js | 18 ++ yarn.lock | 8 +- 14 files changed, 1082 insertions(+), 11 deletions(-) create mode 100644 app/fonts/Euclid/EuclidCircularB-Medium.ttf create mode 100644 ui/components/component-library/text/README.mdx create mode 100644 ui/components/component-library/text/index.js create mode 100644 ui/components/component-library/text/text.js create mode 100644 ui/components/component-library/text/text.scss create mode 100644 ui/components/component-library/text/text.stories.js create mode 100644 ui/components/component-library/text/text.test.js diff --git a/.storybook/metamask-storybook-theme.js b/.storybook/metamask-storybook-theme.js index 49f8c814d..2bba8734c 100644 --- a/.storybook/metamask-storybook-theme.js +++ b/.storybook/metamask-storybook-theme.js @@ -7,6 +7,6 @@ export default create({ brandTitle: 'MetaMask Storybook', // Typography - fontBase: 'Euclid, Roboto, Helvetica, Arial, sans-serif', + fontBase: 'Euclid Circular B, Roboto, Helvetica, Arial, sans-serif', fontCode: 'Inconsolata, monospace', }); diff --git a/app/fonts/Euclid/EuclidCircularB-Medium.ttf b/app/fonts/Euclid/EuclidCircularB-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7a2ae44a166de9dfdb2aecce6290a99fe43e1387 GIT binary patch literal 160832 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 This Text (fka Typography) component has breaking changes in variant options and the line heights associated to each variant. + +Good typography improves readability, legibility and hierarchy of information. + + + + + +## Props + + + +### Variant + +Use the `variant` prop and the `TEXT` object from `./ui/helpers/constants/design-system.js` to change the font size of the component. + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { TEXT } from '../../../helpers/constants/design-system'; + +display-md +heading-lg +heading-md +heading-sm +body-md +body-sm +body-xs +``` + +### Color + +Use the `color` prop and the `COLORS` object from `./ui/helpers/constants/design-system.js` to change the color of the `Text` component. + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { COLORS } from '../../../helpers/constants/design-system'; + + + text-default + + + text-alternative + + + text-muted + + + overlay-inverse + + + primary-default + + + primary-inverse + + + error-default + + + error-inverse + + + success-default + + + success-inverse + + + warning-inverse + + + info-default + + + info-inverse + +``` + +### Font Weight + +Use the `fontWeight` prop and the `FONT_WEIGHT` object from `./ui/helpers/constants/design-system.js` to change the font weight of the `Text` component. There are 3 font weights: + +- `FONT_WEIGHT.NORMAL` = `normal` || `400` +- `FONT_WEIGHT.MEDIUM` = `medium` || `500` +- `FONT_WEIGHT.BOLD` = `bold` || `700` + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { FONT_WEIGHT } from '../../../helpers/constants/design-system'; + + + normal + + + medium + + + bold + +``` + +### Font Style + +Use the `fontStyle` prop and the `FONT_STYLE` object from `./ui/helpers/constants/design-system.js` to change the font style of the `Text` component. There are 2 font styles: + +- `FONT_STYLE.NORMAL` +- `FONT_STYLE.ITALIC` + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { FONT_STYLE } from '../../../helpers/constants/design-system'; + + + normal + + + bold + +``` + +### Text Transform + +Use the `textTransform` prop and the `TEXT_TRANSFORM` object from `./ui/helpers/constants/design-system.js` to change the text alignment of the `Text` component + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { TEXT_TRANSFORM } from '../../../helpers/constants/design-system'; + + + uppercase + + + lowercase + + + capitalize + +``` + +### Text Align + +Use the `textAlign` prop and the `TEXT_ALIGN` object from `./ui/helpers/constants/design-system.js` to change the text alignment of the `Text` component + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { TEXT_ALIGN } from '../../../helpers/constants/design-system'; + + + left + + + center + + + right + + + justify + + + end + +``` + +### Overflow Wrap + +Use the `overflowWrap` prop and the `OVERFLOW_WRAP` object from `./ui/helpers/constants/design-system.js` to change the overflow wrap of the `Text` component + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; +import { OVERFLOW_WRAP } from '../../../helpers/constants/design-system'; + +
+ + {OVERFLOW_WRAP.NORMAL}: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + + + {OVERFLOW_WRAP.BREAK_WORD}: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + +
; +``` + +### Ellipsis + +Use the boolean `ellipsis` prop to change the if the `Text` component to have an ellipsis. + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; + +
+ Ellipsis: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + No Ellipsis: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d +
; +``` + +### As + +Use the `as` prop to change the root html element of the `Text` component + + + + + +```jsx +import { Text } from '../../ui/component-library/text'; + +dd +div +dt +em +h1 +h2 +h3 +h4 +h5 +h6 +li +p +span +strong +``` + +Renders the html: + +```html +
dd
+
div
+
dt
+em +

h1

+

h2

+

h3

+

h4

+
h5
+
h6
+
  • li
  • +

    p

    +span +strong +``` + +### Box Props + +Use any valid box props [Box](/?path=/story/ui-components-ui-box-box-stories-js--default-story) component props to the Text component. + +### Class Name + +Adds an additional class to the `Text` component + +### Children + +The text content of the `Text` component diff --git a/ui/components/component-library/text/index.js b/ui/components/component-library/text/index.js new file mode 100644 index 000000000..8463c3cf8 --- /dev/null +++ b/ui/components/component-library/text/index.js @@ -0,0 +1 @@ +export { Text } from './text'; diff --git a/ui/components/component-library/text/text.js b/ui/components/component-library/text/text.js new file mode 100644 index 000000000..3ca747b69 --- /dev/null +++ b/ui/components/component-library/text/text.js @@ -0,0 +1,145 @@ +import React from 'react'; +import classnames from 'classnames'; +import PropTypes from 'prop-types'; +import Box from '../../ui/box'; +import { + FONT_WEIGHT, + FONT_STYLE, + TEXT, + TEXT_ALIGN, + TEXT_TRANSFORM, + OVERFLOW_WRAP, + TEXT_COLORS, +} from '../../../helpers/constants/design-system'; + +export const ValidTags = [ + 'dd', + 'div', + 'dt', + 'em', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'li', + 'p', + 'span', + 'strong', + 'ul', + 'label', +]; + +export const Text = ({ + variant = TEXT.BODY_MD, + color = TEXT_COLORS.TEXT_DEFAULT, + fontWeight, + fontStyle, + textTransform, + textAlign, + overflowWrap, + ellipsis, + as, + className, + children, + ...props +}) => { + let Tag = as ?? variant; + let strongTagFontWeight; + + if (Tag === 'strong') { + strongTagFontWeight = FONT_WEIGHT.BOLD; + } + + const computedClassName = classnames( + 'text', + className, + `text--${variant}`, + (strongTagFontWeight || fontWeight) && + `text--font-weight-${strongTagFontWeight || fontWeight}`, + { + [`text--font-style-${fontStyle}`]: Boolean(fontStyle), + [`text--ellipsis`]: Boolean(ellipsis), + [`text--text-transform-${textTransform}`]: Boolean(textTransform), + [`text--text-align-${textAlign}`]: Boolean(textAlign), + [`text--color-${color}`]: Boolean(color), + [`text--overflow-wrap-${overflowWrap}`]: Boolean(overflowWrap), + }, + ); + + // // Set a default tag based on variant + const splitTag = Tag.split('-')[0]; + if (splitTag === 'body') { + Tag = 'p'; + } else if (splitTag === 'heading') { + Tag = 'h2'; + } else if (splitTag === 'display') { + Tag = 'h1'; + } + + return ( + + {children} + + ); +}; + +Text.propTypes = { + /** + * The variation of font styles including sizes and weights of the Text component (display, heading, body) + */ + variant: PropTypes.oneOf(Object.values(TEXT)), + /** + * The color of the Text component Should use the COLOR object from + * ./ui/helpers/constants/design-system.js + */ + color: PropTypes.oneOf(Object.values(TEXT_COLORS)), + /** + * The font-weight of the Text component. Should use the FONT_WEIGHT object from + * ./ui/helpers/constants/design-system.js + */ + fontWeight: PropTypes.oneOf(Object.values(FONT_WEIGHT)), + /** + * The font-style of the Text component. Should use the FONT_STYLE object from + * ./ui/helpers/constants/design-system.js + */ + fontStyle: PropTypes.oneOf(Object.values(FONT_STYLE)), + /** + * The textTransform of the Text component. Should use the TEXT_TRANSFORM object from + * ./ui/helpers/constants/design-system.js + */ + textTransform: PropTypes.oneOf(Object.values(TEXT_TRANSFORM)), + /** + * The text-align of the Text component. Should use the TEXT_ALIGN object from + * ./ui/helpers/constants/design-system.js + */ + textAlign: PropTypes.oneOf(Object.values(TEXT_ALIGN)), + /** + * The overflow-wrap of the Text component. Should use the OVERFLOW_WRAP object from + * ./ui/helpers/constants/design-system.js + */ + overflowWrap: PropTypes.oneOf(Object.values(OVERFLOW_WRAP)), + /** + * Used for long strings that can be cut off... + */ + ellipsis: PropTypes.bool, + /** + * Changes the root html element tag of the Text component. + */ + as: PropTypes.oneOf(ValidTags), + /** + * Additional className to assign the Text component + */ + className: PropTypes.string, + /** + * The text content of the Text component + */ + children: PropTypes.node.isRequired, + /** + * Text component accepts all Box component props + */ + ...Box.propTypes, +}; + +export default Text; diff --git a/ui/components/component-library/text/text.scss b/ui/components/component-library/text/text.scss new file mode 100644 index 000000000..5d1ad4e01 --- /dev/null +++ b/ui/components/component-library/text/text.scss @@ -0,0 +1,104 @@ +@use "design-system"; +@use "sass:map"; + +$text-variants: ( + display: ("md"), + heading: ( "sm", "md", "lg"), + body: ("xs", "sm", "sm-bold", "md", "md-bold", "lg-medium"), +); + +// Variable output mixin +// screen size, type, size + +@mixin textVariables($type, $size) { + font-family: var(--typography-s-#{$type}-#{$size}-font-family); + font-weight: var(--typography-s-#{$type}-#{$size}-font-weight); + font-size: var(--typography-s-#{$type}-#{$size}-font-size); + line-height: var(--typography-s-#{$type}-#{$size}-line-height); + letter-spacing: var(--typography-s-#{$type}-#{$size}-letter-spacing); + + @include screen-md-min { + font-family: var(--typography-l-#{$type}-#{$size}-font-family); + font-weight: var(--typography-l-#{$type}-#{$size}-font-weight); + font-size: var(--typography-l-#{$type}-#{$size}-font-size); + line-height: var(--typography-l-#{$type}-#{$size}-line-height); + letter-spacing: var(--typography-l-#{$type}-#{$size}-letter-spacing); + } +} + + + +.text { + // Set default styles + color: var(--color-text-default); + font-family: var(----font-family-sans); + + @each $type, $size-options in $text-variants { + &--#{$type} { + // Sets a default + @include textVariables($type, "md"); + // Generates all the size options + @each $size in $size-options { + &-#{$size} { + @include textVariables($type, $size); + } + } + } + } + + @each $variant, $color in $color-map { + &--color-#{$variant} { + color: var($color); + } + } + + @each $weight in $font-weight { + &--font-weight-#{$weight} { + @if $weight == "medium" { + font-weight: var(--font-weight-medium); + } + + @else { + font-weight: $weight; + } + } + } + + @each $style in $font-style { + &--font-style-#{$style} { + font-style: $style; + } + } + + @each $alignment in $text-align { + &--text-align-#{$alignment} { + text-align: $alignment; + } + } + + @each $overflow in $overflow-wrap { + &--overflow-wrap-#{$overflow} { + overflow-wrap: $overflow; + } + } + + &--ellipsis { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + &--text-transform-uppercase { + text-transform: uppercase; + } + + &--text-transform-lowercase { + text-transform: lowercase; + } + + &--text-transform-capitalize { + text-transform: capitalize; + } +} + + diff --git a/ui/components/component-library/text/text.stories.js b/ui/components/component-library/text/text.stories.js new file mode 100644 index 000000000..2b8fbfa15 --- /dev/null +++ b/ui/components/component-library/text/text.stories.js @@ -0,0 +1,270 @@ +import React from 'react'; +import { + COLORS, + DISPLAY, + BACKGROUND_COLORS, + BORDER_COLORS, + FONT_WEIGHT, + FONT_STYLE, + TEXT_COLORS, + TEXT_ALIGN, + TEXT, + OVERFLOW_WRAP, + TEXT_TRANSFORM, + FRACTIONS, +} from '../../../helpers/constants/design-system'; + +import Box from '../../ui/box'; +import { ValidTags, Text } from './text'; + +import README from './README.mdx'; + +const sizeKnobOptions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; +const marginSizeKnobOptions = [...sizeKnobOptions, 'auto']; + +export default { + title: 'Components/ComponentLibrary/Text', + id: __filename, + parameters: { + docs: { + page: README, + }, + }, + argTypes: { + variant: { + control: { type: 'select' }, + options: Object.values(TEXT), + }, + color: { + control: { type: 'select' }, + options: Object.values(TEXT_COLORS), + }, + fontWeight: { + control: { type: 'select' }, + options: Object.values(FONT_WEIGHT), + }, + fontStyle: { + control: { type: 'select' }, + options: Object.values(FONT_STYLE), + }, + textTransform: { + control: { type: 'select' }, + options: Object.values(TEXT_TRANSFORM), + }, + align: { + control: { type: 'select' }, + options: Object.values(TEXT_ALIGN), + }, + overflowWrap: { + control: { type: 'select' }, + options: Object.values(OVERFLOW_WRAP), + }, + ellipsis: { + control: { type: 'boolean' }, + }, + as: { + control: { type: 'select' }, + options: ValidTags, + }, + className: { + control: { type: 'text' }, + }, + children: { + control: { type: 'text' }, + }, + display: { + options: Object.values(DISPLAY), + control: 'select', + table: { category: 'box props' }, + }, + backgroundColor: { + options: Object.values(BACKGROUND_COLORS), + control: 'select', + table: { category: 'box props' }, + }, + borderColor: { + options: Object.values(BORDER_COLORS), + control: 'select', + table: { category: 'box props' }, + }, + padding: { + options: sizeKnobOptions, + control: 'select', + table: { category: 'box props' }, + }, + margin: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'box props' }, + }, + marginTop: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'box props' }, + }, + marginRight: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'box props' }, + }, + marginBottom: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'box props' }, + }, + marginLeft: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'box props' }, + }, + }, +}; + +function renderBackgroundColor(color) { + let bgColor; + switch (color) { + case COLORS.OVERLAY_INVERSE: + bgColor = COLORS.OVERLAY_DEFAULT; + break; + case COLORS.PRIMARY_INVERSE: + bgColor = COLORS.PRIMARY_DEFAULT; + break; + case COLORS.ERROR_INVERSE: + bgColor = COLORS.ERROR_DEFAULT; + break; + case COLORS.WARNING_INVERSE: + bgColor = COLORS.WARNING_DEFAULT; + break; + case COLORS.SUCCESS_INVERSE: + bgColor = COLORS.SUCCESS_DEFAULT; + break; + case COLORS.INFO_INVERSE: + bgColor = COLORS.INFO_DEFAULT; + break; + default: + bgColor = null; + break; + } + + return bgColor; +} + +export const DefaultStory = (args) => {args.children}; + +DefaultStory.storyName = 'Default'; + +DefaultStory.args = { + children: 'The quick orange fox jumped over the lazy dog.', +}; + +export const Variant = (args) => ( + <> + {Object.values(TEXT).map((variant) => ( + + {args.children || variant} + + ))} + +); + +export const Color = (args) => { + // Index of last valid color in TEXT_COLORS array + return ( + <> + {Object.values(TEXT_COLORS).map((color) => { + return ( + + {color} + + ); + })} + + ); +}; + +export const FontWeight = (args) => ( + <> + {Object.values(FONT_WEIGHT).map((weight) => ( + + {weight} + + ))} + +); + +export const FontStyle = (args) => ( + <> + {Object.values(FONT_STYLE).map((style) => ( + + {style} + + ))} + +); + +export const TextTransform = (args) => ( + <> + {Object.values(TEXT_TRANSFORM).map((transform) => ( + + {transform} + + ))} + +); + +export const TextAlign = (args) => ( + <> + {Object.values(TEXT_ALIGN).map((align) => ( + + {align} + + ))} + +); + +export const OverflowWrap = (args) => ( + + + {OVERFLOW_WRAP.NORMAL}: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + + + {OVERFLOW_WRAP.BREAK_WORD}: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + + +); + +export const Ellipsis = (args) => ( + + + Ellipsis: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + + + No Ellipsis: 0x39013f961c378f02c2b82a6e1d31e9812786fd9d + + +); + +export const As = (args) => ( + <> + {Object.values(ValidTags).map((tag) => ( +
    + + {tag} + +
    + ))} + +); diff --git a/ui/components/component-library/text/text.test.js b/ui/components/component-library/text/text.test.js new file mode 100644 index 000000000..84a8f1672 --- /dev/null +++ b/ui/components/component-library/text/text.test.js @@ -0,0 +1,221 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import { + COLORS, + FONT_STYLE, + FONT_WEIGHT, + OVERFLOW_WRAP, + TEXT, + TEXT_ALIGN, + TEXT_TRANSFORM, +} from '../../../helpers/constants/design-system'; +import { Text } from '.'; + +describe('Text', () => { + it('should render the Text without crashing', () => { + const { getByText } = render(Test type); + expect(getByText('Test type')).toBeDefined(); + }); + it('should render the Text with correct html elements', () => { + const { getByText, container } = render( + <> + p + h1 + h2 + h3 + h4 + h5 + h6 + span + strong + em + li + div + dt + dd + , + ); + expect(container.querySelector('p')).toBeDefined(); + expect(getByText('p')).toBeDefined(); + expect(container.querySelector('h1')).toBeDefined(); + expect(getByText('h1')).toBeDefined(); + expect(container.querySelector('h2')).toBeDefined(); + expect(getByText('h2')).toBeDefined(); + expect(container.querySelector('h3')).toBeDefined(); + expect(getByText('h3')).toBeDefined(); + expect(container.querySelector('h4')).toBeDefined(); + expect(getByText('h4')).toBeDefined(); + expect(container.querySelector('h5')).toBeDefined(); + expect(getByText('h5')).toBeDefined(); + expect(container.querySelector('h6')).toBeDefined(); + expect(getByText('h6')).toBeDefined(); + expect(container.querySelector('span')).toBeDefined(); + expect(getByText('span')).toBeDefined(); + expect(container.querySelector('strong')).toBeDefined(); + expect(getByText('strong')).toBeDefined(); + expect(container.querySelector('em')).toBeDefined(); + expect(getByText('em')).toBeDefined(); + expect(container.querySelector('li')).toBeDefined(); + expect(getByText('li')).toBeDefined(); + expect(container.querySelector('div')).toBeDefined(); + expect(getByText('div')).toBeDefined(); + expect(container.querySelector('dt')).toBeDefined(); + expect(getByText('dt')).toBeDefined(); + expect(container.querySelector('dd')).toBeDefined(); + expect(getByText('dd')).toBeDefined(); + }); + + it('should render the Text with proper variant class name', () => { + const { getByText } = render( + <> + display-md + heading-lg + heading-md + heading-sm + body-lg-medium + body-md + body-sm + body-xs + , + ); + + expect(getByText('display-md')).toHaveClass('text--display-md'); + expect(getByText('heading-lg')).toHaveClass('text--heading-lg'); + expect(getByText('heading-md')).toHaveClass('text--heading-md'); + expect(getByText('heading-sm')).toHaveClass('text--heading-sm'); + expect(getByText('body-lg-medium')).toHaveClass('text--body-lg-medium'); + expect(getByText('body-md')).toHaveClass('text--body-md'); + expect(getByText('body-sm')).toHaveClass('text--body-sm'); + expect(getByText('body-xs')).toHaveClass('text--body-xs'); + }); + + it('should render the Text with proper font weight class name', () => { + const { getByText } = render( + <> + bold + medium + normal + , + ); + expect(getByText('bold')).toHaveClass('text--font-weight-bold'); + expect(getByText('medium')).toHaveClass('text--font-weight-medium'); + expect(getByText('normal')).toHaveClass('text--font-weight-normal'); + }); + + it('should render the Text with proper text color class name', () => { + const { getByText } = render( + <> + text-default + text-alternative + text-muted + overlay-inverse + primary-default + primary-inverse + error-default + error-inverse + success-default + success-inverse + warning-inverse + info-default + info-inverse + , + ); + expect(getByText('text-default')).toHaveClass('text--color-text-default'); + expect(getByText('text-alternative')).toHaveClass( + 'text--color-text-alternative', + ); + expect(getByText('text-muted')).toHaveClass('text--color-text-muted'); + expect(getByText('overlay-inverse')).toHaveClass( + 'text--color-overlay-inverse', + ); + expect(getByText('primary-default')).toHaveClass( + 'text--color-primary-default', + ); + expect(getByText('primary-inverse')).toHaveClass( + 'text--color-primary-inverse', + ); + expect(getByText('error-default')).toHaveClass('text--color-error-default'); + expect(getByText('error-inverse')).toHaveClass('text--color-error-inverse'); + expect(getByText('success-default')).toHaveClass( + 'text--color-success-default', + ); + expect(getByText('success-inverse')).toHaveClass( + 'text--color-success-inverse', + ); + expect(getByText('warning-inverse')).toHaveClass( + 'text--color-warning-inverse', + ); + expect(getByText('info-default')).toHaveClass('text--color-info-default'); + expect(getByText('info-inverse')).toHaveClass('text--color-info-inverse'); + }); + + it('should render the Text with proper font style class name', () => { + const { getByText } = render( + <> + italic + normal + , + ); + expect(getByText('italic')).toHaveClass('text--font-style-italic'); + expect(getByText('normal')).toHaveClass('text--font-style-normal'); + }); + + it('should render the Text with proper text align class name', () => { + const { getByText } = render( + <> + left + center + right + justify + end + , + ); + + expect(getByText('left')).toHaveClass('text--text-align-left'); + expect(getByText('center')).toHaveClass('text--text-align-center'); + expect(getByText('right')).toHaveClass('text--text-align-right'); + expect(getByText('justify')).toHaveClass('text--text-align-justify'); + expect(getByText('end')).toHaveClass('text--text-align-end'); + }); + + it('should render the Text with proper overflow wrap class name', () => { + const { getByText } = render( + <> + break-word + normal + , + ); + expect(getByText('break-word')).toHaveClass( + 'text--overflow-wrap-break-word', + ); + expect(getByText('normal')).toHaveClass('text--overflow-wrap-normal'); + }); + + it('should render the Text with proper ellipsis class name', () => { + const { getByText } = render( + <> + ellipsis + , + ); + expect(getByText('ellipsis')).toHaveClass('text--ellipsis'); + }); + + it('should render the Text with proper text transform class name', () => { + const { getByText } = render( + <> + uppercase + lowercase + capitalize + , + ); + expect(getByText('uppercase')).toHaveClass( + 'text--text-transform-uppercase', + ); + expect(getByText('lowercase')).toHaveClass( + 'text--text-transform-lowercase', + ); + expect(getByText('capitalize')).toHaveClass( + 'text--text-transform-capitalize', + ); + }); +}); diff --git a/ui/css/design-system/attributes.scss b/ui/css/design-system/attributes.scss index fb8c14451..e80e25026 100644 --- a/ui/css/design-system/attributes.scss +++ b/ui/css/design-system/attributes.scss @@ -45,7 +45,7 @@ $directions: top, right, bottom, left; $display: block, flex, grid, inline-block, inline-grid, inline-flex, list-item, none; $text-align: left, right, center, justify, end; $overflow-wrap: normal, break-word; -$font-weight: bold, normal, 100, 200, 300, 400, 500, 600, 700, 800, 900; +$font-weight: bold, medium, normal, 100, 200, 300, 400, 500, 600, 700, 800, 900; $font-style: normal, italic, oblique; $font-size: 10px, 12px; diff --git a/ui/css/design-system/typography.scss b/ui/css/design-system/typography.scss index 8bdc20f96..a7b16b46c 100644 --- a/ui/css/design-system/typography.scss +++ b/ui/css/design-system/typography.scss @@ -1,3 +1,5 @@ +@use "sass:map"; + $fa-font-path: 'fonts/fontawesome'; @import '../../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome'; @@ -48,27 +50,34 @@ $fa-font-path: 'fonts/fontawesome'; } @font-face { - font-family: 'Euclid'; + font-family: 'Euclid Circular B'; font-style: normal; font-weight: 400; src: url('fonts/Euclid/EuclidCircularB-Regular-WebXL.ttf') format('truetype'); } @font-face { - font-family: 'Euclid'; + font-family: 'Euclid Circular B'; font-style: italic; font-weight: 400; src: url('fonts/Euclid/EuclidCircularB-RegularItalic-WebXL.ttf') format('truetype'); } @font-face { - font-family: 'Euclid'; + font-family: 'Euclid Circular B'; + font-style: normal; + font-weight: 500; + src: url('fonts/Euclid/EuclidCircularB-Medium.ttf') format('truetype'); +} + +@font-face { + font-family: 'Euclid Circular B'; font-style: normal; font-weight: 700; src: url('fonts/Euclid/EuclidCircularB-Bold-WebXL.ttf') format('truetype'); } -$font-family: Euclid, Roboto, Helvetica, Arial, sans-serif; +$font-family: 'Euclid Circular B', Roboto, Helvetica, Arial, sans-serif; $typography-variants: ( 'h1': 2.5rem, diff --git a/ui/helpers/constants/design-system.js b/ui/helpers/constants/design-system.js index 699f8bbe4..bc0ffebc6 100644 --- a/ui/helpers/constants/design-system.js +++ b/ui/helpers/constants/design-system.js @@ -158,6 +158,17 @@ export const TYPOGRAPHY = { Paragraph: 'p', }; +export const TEXT = { + DISPLAY_MD: 'display-md', + HEADING_LG: 'heading-lg', + HEADING_MD: 'heading-md', + HEADING_SM: 'heading-sm', + BODY_LG: 'body-lg-medium', + BODY_MD: 'body-md', + BODY_SM: 'body-sm', + BODY_XS: 'body-xs', +}; + const NONE = 'none'; export const SIZES = { @@ -269,8 +280,15 @@ export const TEXT_ALIGN = { END: 'end', }; +export const TEXT_TRANSFORM = { + UPPERCASE: 'uppercase', + LOWERCASE: 'lowercase', + CAPITALIZE: 'capitalize', +}; + export const FONT_WEIGHT = { BOLD: 'bold', + MEDIUM: 'medium', NORMAL: 'normal', }; diff --git a/yarn.lock b/yarn.lock index dbb217cb7..1c33fa9f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2914,10 +2914,10 @@ web3 "^0.20.7" web3-provider-engine "^16.0.3" -"@metamask/design-tokens@^1.6.0", "@metamask/design-tokens@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@metamask/design-tokens/-/design-tokens-1.8.0.tgz#072f455d23e4650ee81681ef066a99a56a9b573a" - integrity sha512-EO0WaMRPcegh2EPWdmAqtFX0aZ7hO0NyJasUQyVrYeN1XNGUC2WzXfqwaI0wSV79NE/WEE3c9g5se+MQMExLew== +"@metamask/design-tokens@^1.6.0", "@metamask/design-tokens@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@metamask/design-tokens/-/design-tokens-1.9.0.tgz#2b173c671f36b0d3faa2e31ea4bf66e811a7ff49" + integrity sha512-L3oIhbE7MVQgiX7bEqdlU32jNyLbYXCj9sJNCOzACIHycB1TIO8TS34dEI7FAf9pC8o0qvMI3k8ur+SD9myVxw== "@metamask/eslint-config-jest@^9.0.0": version "9.0.0"