183 lines
4.1 KiB
Plaintext
183 lines
4.1 KiB
Plaintext
// @flow
|
|
|
|
import React from 'react';
|
|
import type { ElementType, Node } from 'react';
|
|
import classNames from 'classnames';
|
|
import withStyles from '../styles/withStyles';
|
|
import { capitalizeFirstLetter } from '../utils/helpers';
|
|
|
|
export const styles = (theme: Object) => ({
|
|
root: {
|
|
display: 'block',
|
|
margin: 0,
|
|
},
|
|
display4: theme.typography.display4,
|
|
display3: theme.typography.display3,
|
|
display2: theme.typography.display2,
|
|
display1: theme.typography.display1,
|
|
headline: theme.typography.headline,
|
|
title: theme.typography.title,
|
|
subheading: theme.typography.subheading,
|
|
body2: theme.typography.body2,
|
|
body1: theme.typography.body1,
|
|
caption: theme.typography.caption,
|
|
button: theme.typography.button,
|
|
alignLeft: {
|
|
textAlign: 'left',
|
|
},
|
|
alignCenter: {
|
|
textAlign: 'center',
|
|
},
|
|
alignRight: {
|
|
textAlign: 'right',
|
|
},
|
|
alignJustify: {
|
|
textAlign: 'justify',
|
|
},
|
|
noWrap: {
|
|
overflow: 'hidden',
|
|
textOverflow: 'ellipsis',
|
|
whiteSpace: 'nowrap',
|
|
},
|
|
gutterBottom: {
|
|
marginBottom: '0.35em',
|
|
},
|
|
paragraph: {
|
|
marginBottom: theme.spacing.unit * 2,
|
|
},
|
|
colorInherit: {
|
|
color: 'inherit',
|
|
},
|
|
colorPrimary: {
|
|
color: theme.palette.primary[500],
|
|
},
|
|
colorSecondary: {
|
|
color: theme.palette.text.secondary,
|
|
},
|
|
colorAccent: {
|
|
color: theme.palette.secondary.A400,
|
|
},
|
|
colorError: {
|
|
color: theme.palette.error.A400,
|
|
},
|
|
});
|
|
|
|
export type Type =
|
|
| 'display4'
|
|
| 'display3'
|
|
| 'display2'
|
|
| 'display1'
|
|
| 'headline'
|
|
| 'title'
|
|
| 'subheading'
|
|
| 'body2'
|
|
| 'body1'
|
|
| 'caption'
|
|
| 'button';
|
|
|
|
type ProvidedProps = {
|
|
classes: Object,
|
|
headlineMapping: { [key: Type]: string },
|
|
type: Type,
|
|
};
|
|
|
|
export type Props = {
|
|
align?: 'inherit' | 'left' | 'center' | 'right' | 'justify',
|
|
children?: Node,
|
|
/**
|
|
* Useful to extend the style applied to components.
|
|
*/
|
|
classes?: Object,
|
|
/**
|
|
* @ignore
|
|
*/
|
|
className?: string,
|
|
/**
|
|
* The component used for the root node.
|
|
* Either a string to use a DOM element or a component.
|
|
* By default we map the type to a good default headline component.
|
|
*/
|
|
component?: ElementType,
|
|
/**
|
|
* The color of the component. It's using the theme palette when that makes sense.
|
|
*/
|
|
color?: 'inherit' | 'primary' | 'secondary' | 'accent' | 'error' | 'default',
|
|
/**
|
|
* If `true`, the text will have a bottom margin.
|
|
*/
|
|
gutterBottom?: boolean,
|
|
/**
|
|
* We are empirically mapping the type property to a range of different DOM element type.
|
|
* For instance, h1 to h6. If you wish to change that mapping, you can provide your own.
|
|
* Alternatively, you can use the `component` property.
|
|
*/
|
|
headlineMapping?: { [key: Type]: string },
|
|
/**
|
|
* If `true`, the text will not wrap, but instead will truncate with an ellipsis.
|
|
*/
|
|
noWrap?: boolean,
|
|
/**
|
|
* If `true`, the text will have a bottom margin.
|
|
*/
|
|
paragraph?: boolean,
|
|
/**
|
|
* Applies the theme typography styles.
|
|
*/
|
|
type?: Type,
|
|
};
|
|
|
|
function Typography(props: ProvidedProps & Props) {
|
|
const {
|
|
align,
|
|
classes,
|
|
className: classNameProp,
|
|
component: componentProp,
|
|
color,
|
|
gutterBottom,
|
|
headlineMapping,
|
|
noWrap,
|
|
paragraph,
|
|
type,
|
|
...other
|
|
} = props;
|
|
|
|
const className = classNames(
|
|
classes.root,
|
|
classes[type],
|
|
{
|
|
[classes[`color${capitalizeFirstLetter(color)}`]]: color !== 'default',
|
|
[classes.noWrap]: noWrap,
|
|
[classes.gutterBottom]: gutterBottom,
|
|
[classes.paragraph]: paragraph,
|
|
[classes[`align${capitalizeFirstLetter(align)}`]]: align !== 'inherit',
|
|
},
|
|
classNameProp,
|
|
);
|
|
|
|
const Component = componentProp || (paragraph ? 'p' : headlineMapping[type]) || 'span';
|
|
|
|
return <Component className={className} {...other} />;
|
|
}
|
|
|
|
Typography.defaultProps = {
|
|
align: 'inherit',
|
|
color: 'default',
|
|
gutterBottom: false,
|
|
headlineMapping: {
|
|
display4: 'h1',
|
|
display3: 'h1',
|
|
display2: 'h1',
|
|
display1: 'h1',
|
|
headline: 'h1',
|
|
title: 'h2',
|
|
subheading: 'h3',
|
|
body2: 'aside',
|
|
body1: 'p',
|
|
},
|
|
noWrap: false,
|
|
paragraph: false,
|
|
type: 'body1',
|
|
};
|
|
|
|
export default withStyles(styles, { name: 'MuiTypography' })(Typography);
|