UNPKG

pure-styled-components

Version:

Styled Component design system based on Pure CSS for React/Preact

195 lines (162 loc) 5.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _findByType = _interopRequireDefault(require("../../utils/findByType")); var _Item = _interopRequireDefault(require("./Item")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const scrollableHorizontal = (isScrollable, isHorizontal) => { if (isScrollable && isHorizontal) { return ` white-space: nowrap; overflow-y: hidden; overflow-x: auto; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; /* a little extra padding for this style to allow for scrollbars */ padding: .5em 0; ::-webkit-scrollbar { display: none; } & .list { display: inline-block; } `; } return ``; }; const horizontalMenu = isHorizontal => { if (isHorizontal) { return ` width: 100%; white-space: nowrap; & .list { display: inline-block; } /* Initial menus should be inline-block so that they are horizontal */ & .item, & .heading, & .separator { display: inline-block; *display: inline; zoom: 1; vertical-align: middle; } & .separator { width: 1px; height: 1.3em; margin: 0 .3em; } & .dropdown { left: 0; top: auto; width: inherit; } `; } return ``; }; const selectedMenu = isSelected => { if (isSelected) { return ` & > .link { color: #000; } `; } return ``; }; const Heading = _styledComponents.default.span` display: block; text-decoration: none; white-space: nowrap; text-transform: uppercase; color: #565d64; padding: 0.5em 1em; `; const List = _styledComponents.default.ul` list-style: none; margin: 0; padding: 0; `; class BaseMenu extends _react.PureComponent { renderMenu() { const { children } = this.props; const listType = [List.displayName] || [List.name]; const headingType = [Heading.displayName] || [Heading.name]; const items = _react.default.Children.map(children, child => { const childType = child && child.type && (child.type.displayName || child.type.name); if (childType.includes(listType)) { return child.props.children.map(item => _react.default.createElement(_Item.default, { className: "item", key: item.props.children }, item.props.children)); } if (childType.includes(headingType)) { return _react.default.createElement(Heading, { className: "heading" }, child.props.children); } }); if (!items) { return null; } return _react.default.createElement(List, { className: "list" }, items); } render() { const { className } = this.props; return _react.default.createElement("nav", _extends({ className: className }, this.props), this.renderMenu()); } } BaseMenu.Heading = Heading; BaseMenu.List = List; BaseMenu.Item = _Item.default; /** * Simple CSS and React for menus. See <List.Heading> and <List.Item>. * * @visibleName Menu */ const Menu = (0, _styledComponents.default)(BaseMenu)` box-sizing: border-box; position: relative; &.separator { background-color: #ccc; height: 1px; margin: 0.3em 0; } ${props => horizontalMenu(props.horizontal)}; ${props => selectedMenu(props.selected)}; ${props => scrollableHorizontal(props.selected, props.horizontal)}; `; Menu.propTypes = { /** * Makes menu items display horizontal (inline) */ horizontal: _propTypes.default.bool, /** * Makes menu items appear selected */ selected: _propTypes.default.bool, /** * Child components (array or single element) */ children: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.node), _propTypes.default.node]).isRequired }; /** @component */ var _default = Menu; exports.default = _default; //# sourceMappingURL=Menu.js.map