UNPKG

lucid-ui

Version:

A UI component library from AppNexus.

50 lines (49 loc) 1.73 kB
import _ from 'lodash'; import React from 'react'; import PropTypes from 'react-peek/prop-types'; import { lucidClassNames } from '../../util/style-helpers'; import { omitProps } from '../../util/component-types'; const cx = lucidClassNames.bind('&-Typography'); const { node, string, oneOf } = PropTypes; export var ElementTypes; (function (ElementTypes) { ElementTypes["p"] = "p"; ElementTypes["tabular"] = "p"; ElementTypes["h1"] = "h1"; ElementTypes["h2"] = "h2"; ElementTypes["h3"] = "h3"; ElementTypes["a"] = "a"; ElementTypes["pre"] = "pre"; ElementTypes["code"] = "code"; ElementTypes["kbd"] = "kbd"; ElementTypes["samp"] = "samp"; ElementTypes["span"] = "span"; })(ElementTypes || (ElementTypes = {})); export const Typography = (props) => { const { children, className, variant, ...passThroughs } = props; const Element = ElementTypes[variant ? variant : 'p']; return React.createElement(Element, { ...omitProps(passThroughs, undefined, _.keys(Typography.propTypes)), className: cx('&', `&-${variant}`, className), }, children); }; Typography.displayName = 'Typography'; Typography.peek = { description: ` A general component for several types of textual HTML elements. `, categories: ['text'], }; Typography.propTypes = { children: node ` Can contain elements or nested \`Typography\` components. `, className: string ` Appended to the component-specific class names set on the root element. `, variant: oneOf(_.keys(ElementTypes)).isRequired ` This prop defines the type of text that will be displayed. It may be an actual HTML element or something with extra semantic meaning. `, }; export default Typography;