diff options
author | Leonid Logvinov <logvinov.leon@gmail.com> | 2019-01-09 19:02:25 +0800 |
---|---|---|
committer | Leonid Logvinov <logvinov.leon@gmail.com> | 2019-01-09 19:02:25 +0800 |
commit | ea14913b412e78ff458bdfba47182f7363e776e5 (patch) | |
tree | 3ee220bfbbd9923b5e1adc36ee51f9b5d39ad640 /packages/website/ts/components/text.tsx | |
parent | 5868c91cfb54cfa9177572b201d88d1168bf5b06 (diff) | |
parent | 5dd55491b86bf8577405e37d0f2d668aa1273b10 (diff) | |
download | dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.tar dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.tar.gz dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.tar.bz2 dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.tar.lz dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.tar.xz dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.tar.zst dexon-sol-tools-ea14913b412e78ff458bdfba47182f7363e776e5.zip |
Merge development
Diffstat (limited to 'packages/website/ts/components/text.tsx')
-rw-r--r-- | packages/website/ts/components/text.tsx | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/packages/website/ts/components/text.tsx b/packages/website/ts/components/text.tsx new file mode 100644 index 000000000..10f272e73 --- /dev/null +++ b/packages/website/ts/components/text.tsx @@ -0,0 +1,83 @@ +import * as React from 'react'; +import styled from 'styled-components'; +import { getCSSPadding, PaddingInterface } from 'ts/constants/utilities'; + +interface BaseTextInterface extends PaddingInterface { + size?: 'default' | 'medium' | 'large' | 'small' | number; + isCentered?: boolean; + textAlign?: string; +} + +interface HeadingProps extends BaseTextInterface { + asElement?: 'h1' | 'h2' | 'h3' | 'h4'; + maxWidth?: string; + fontWeight?: string; + isCentered?: boolean; + isFlex?: boolean; + isNoMargin?: boolean; + isMuted?: boolean | number; + marginBottom?: string; + color?: string; +} + +interface ParagraphProps extends BaseTextInterface { + isNoMargin?: boolean; + marginBottom?: string; // maybe we should remove isNoMargin + isMuted?: boolean | number; + fontWeight?: string | number; +} + +const StyledHeading = + styled.h1 < + HeadingProps > + ` + max-width: ${props => props.maxWidth}; + color: ${props => props.color || props.theme.textColor}; + display: ${props => props.isFlex && `inline-flex`}; + align-items: center; + justify-content: ${props => props.isFlex && `space-between`}; + font-size: ${props => + typeof props.size === 'string' ? `var(--${props.size || 'default'}Heading)` : `${props.size}px`}; + line-height: ${props => `var(--${props.size || 'default'}HeadingHeight)`}; + text-align: ${props => props.isCentered && 'center'}; + padding: ${props => props.padding && getCSSPadding(props.padding)}; + margin-left: ${props => props.isCentered && 'auto'}; + margin-right: ${props => props.isCentered && 'auto'}; + margin-bottom: ${props => !props.isNoMargin && (props.marginBottom || '30px')}; + opacity: ${props => (typeof props.isMuted === 'boolean' ? 0.75 : props.isMuted)}; + font-weight: ${props => (props.fontWeight ? props.fontWeight : ['h4'].includes(props.asElement) ? 400 : 300)}; + width: ${props => props.isFlex && `100%`}; +`; + +export const Heading: React.StatelessComponent<HeadingProps> = props => { + const { asElement = 'h1', children } = props; + const Component = StyledHeading.withComponent(asElement); + + return <Component {...props}>{children}</Component>; +}; + +Heading.defaultProps = { + size: 'default', +}; + +// No need to declare it twice as Styled then rewrap as a stateless comp +// Note: this would be useful to be implemented the same way was "Heading" +// and be more generic. e.g. <Text /> with a props asElement so we can use it +// for literally anything = +export const Paragraph = + styled.p < + ParagraphProps > + ` + font-size: ${props => `var(--${props.size || 'default'}Paragraph)`}; + font-weight: ${props => props.fontWeight || 300}; + margin-bottom: ${props => !props.isNoMargin && (props.marginBottom || '30px')}; + padding: ${props => props.padding && getCSSPadding(props.padding)}; + color: ${props => props.color || props.theme.paragraphColor}; + opacity: ${props => (typeof props.isMuted === 'boolean' ? 0.75 : props.isMuted)}; + text-align: ${props => (props.textAlign ? props.textAlign : props.isCentered && 'center')}; + line-height: 1.4; +`; + +Paragraph.defaultProps = { + isMuted: true, +}; |