add new typography component (#10197)
parent
118281b9a9
commit
29f4c93830
@ -0,0 +1 @@ |
|||||||
|
export { default } from './typography' |
@ -0,0 +1,58 @@ |
|||||||
|
import React from 'react' |
||||||
|
import classnames from 'classnames' |
||||||
|
import PropTypes from 'prop-types' |
||||||
|
import { COLORS, TYPOGRAPHY } from '../../../helpers/constants/design-system' |
||||||
|
|
||||||
|
const { H6, H7, H8, H9 } = TYPOGRAPHY |
||||||
|
|
||||||
|
export default function Typography({ |
||||||
|
variant = TYPOGRAPHY.Paragraph, |
||||||
|
className, |
||||||
|
color = COLORS.BLACK, |
||||||
|
tag, |
||||||
|
children, |
||||||
|
spacing = 1, |
||||||
|
fontWeight = 'normal', |
||||||
|
align, |
||||||
|
}) { |
||||||
|
const computedClassName = classnames( |
||||||
|
'typography', |
||||||
|
className, |
||||||
|
`typography--${variant}`, |
||||||
|
`typography--align-${align}`, |
||||||
|
`typography--spacing-${spacing}`, |
||||||
|
`typography--color-${color}`, |
||||||
|
`typography--weight-${fontWeight}`, |
||||||
|
) |
||||||
|
|
||||||
|
let Tag = tag ?? variant |
||||||
|
|
||||||
|
if (Tag === TYPOGRAPHY.Paragraph) { |
||||||
|
Tag = 'p' |
||||||
|
} else if ([H7, H8, H9].includes(Tag)) { |
||||||
|
Tag = H6 |
||||||
|
} |
||||||
|
|
||||||
|
return <Tag className={computedClassName}>{children}</Tag> |
||||||
|
} |
||||||
|
|
||||||
|
Typography.propTypes = { |
||||||
|
variant: PropTypes.oneOf(Object.values(TYPOGRAPHY)), |
||||||
|
children: PropTypes.node.isRequired, |
||||||
|
color: PropTypes.oneOf(Object.values(COLORS)), |
||||||
|
className: PropTypes.string, |
||||||
|
align: PropTypes.oneOf(['center', 'right']), |
||||||
|
spacing: PropTypes.oneOf([1, 2, 3, 4, 5, 6, 7, 8]), |
||||||
|
fontWeight: PropTypes.oneOf(['bold', 'normal']), |
||||||
|
tag: PropTypes.oneOf([ |
||||||
|
'p', |
||||||
|
'h1', |
||||||
|
'h2', |
||||||
|
'h3', |
||||||
|
'h4', |
||||||
|
'h5', |
||||||
|
'h6', |
||||||
|
'span', |
||||||
|
'div', |
||||||
|
]), |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
@use "design-system"; |
||||||
|
@use "sass:map"; |
||||||
|
|
||||||
|
.typography { |
||||||
|
@include design-system.Paragraph; |
||||||
|
|
||||||
|
@each $variant in map.keys(design-system.$typography-variants) { |
||||||
|
&--#{$variant} { |
||||||
|
@include design-system.typography($variant); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@each $variant, $color in design-system.$color-map { |
||||||
|
&--color-#{$variant} { |
||||||
|
color: $color; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@each $variant, $weight in design-system.$typography-font-weights { |
||||||
|
&--weight-#{$variant} { |
||||||
|
font-weight: $weight; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&--align-center { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
&--align-right { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
@for $i from 1 through 8 { |
||||||
|
&--spacing-#{$i} { |
||||||
|
margin: #{$i * 4}px auto; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
import React from 'react' |
||||||
|
import { number, select, text } from '@storybook/addon-knobs' |
||||||
|
import { COLORS, TYPOGRAPHY } from '../../../helpers/constants/design-system' |
||||||
|
import Typography from '.' |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'Typography', |
||||||
|
} |
||||||
|
|
||||||
|
const fontWeightOptions = { |
||||||
|
bold: 'bold', |
||||||
|
normal: 'normal', |
||||||
|
} |
||||||
|
|
||||||
|
const alignOptions = { |
||||||
|
left: undefined, |
||||||
|
center: 'center', |
||||||
|
right: 'right', |
||||||
|
} |
||||||
|
|
||||||
|
export const list = () => ( |
||||||
|
<div style={{ width: '80%', flexDirection: 'column' }}> |
||||||
|
{Object.values(TYPOGRAPHY).map((variant) => ( |
||||||
|
<div key={variant} style={{ width: '100%' }}> |
||||||
|
<Typography |
||||||
|
variant={variant} |
||||||
|
color={select('color', COLORS, COLORS.BLACK)} |
||||||
|
spacing={number('spacing', 1, { range: true, min: 1, max: 8 })} |
||||||
|
align={select('align', alignOptions, undefined)} |
||||||
|
fontWeight={select('font weight', fontWeightOptions, 'normal')} |
||||||
|
> |
||||||
|
{variant} |
||||||
|
</Typography> |
||||||
|
</div> |
||||||
|
))} |
||||||
|
</div> |
||||||
|
) |
||||||
|
|
||||||
|
export const TheQuickOrangeFox = () => ( |
||||||
|
<div style={{ width: '80%', flexDirection: 'column' }}> |
||||||
|
<div style={{ width: '100%' }}> |
||||||
|
<Typography |
||||||
|
color={select('color', COLORS, COLORS.BLACK)} |
||||||
|
variant={select('variant', TYPOGRAPHY, TYPOGRAPHY.Paragraph)} |
||||||
|
spacing={number('spacing', 1, { range: true, min: 1, max: 8 })} |
||||||
|
align={select('align', alignOptions, undefined)} |
||||||
|
fontWeight={select('font weight', fontWeightOptions, 'normal')} |
||||||
|
> |
||||||
|
{text('content', 'The quick orange fox jumped over the lazy dog.')} |
||||||
|
</Typography> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
) |
Loading…
Reference in new issue