UNPKG

backpack-ui

Version:

Lonely Planet's Components

328 lines (276 loc) 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _radium = require("radium"); var _radium2 = _interopRequireDefault(_radium); var _reactRouter = require("react-router"); var _settings = require("../../../settings.json"); var _heading = require("../heading"); var _heading2 = _interopRequireDefault(_heading); var _flyout = require("../flyout"); var _flyout2 = _interopRequireDefault(_flyout); var _paginatorButton = require("../paginatorButton"); var _paginatorButton2 = _interopRequireDefault(_paginatorButton); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var styles = { container: { base: { display: "inline-block", cursor: "pointer", position: "relative", zIndex: _settings.zIndex.globalHeader } }, heading: { base: _defineProperty({ display: "inline-block", marginRight: "10px" }, "@media (min-width: " + _settings.media.min["600"] + ")", { marginRight: "20px" }) }, menu: { base: { backfaceVisibility: "hidden", position: "absolute", top: "70px", transition: "opacity " + _settings.timing.default + ",\n transform " + _settings.timing.default + ",\n visibility " + _settings.timing.default, width: "290px" }, hidden: { opacity: 0, transform: "translateY(-1rem)", visibility: "hidden" }, visible: { opacity: 1, pointerEvents: "all", transform: "translateY(0)", visibility: "visible" } } }; var TypeSelector = function (_React$Component) { _inherits(TypeSelector, _React$Component); function TypeSelector(props) { _classCallCheck(this, TypeSelector); var _this = _possibleConstructorReturn(this, (TypeSelector.__proto__ || Object.getPrototypeOf(TypeSelector)).call(this, props)); _this.state = { menu: false }; _this.toggleMenu = _this.toggleMenu.bind(_this); _this.handleClickOutside = _this.handleClickOutside.bind(_this); _this.handleKeydown = _this.handleKeydown.bind(_this); return _this; } _createClass(TypeSelector, [{ key: "componentDidMount", value: function componentDidMount() { document.addEventListener("click", this.handleClickOutside); document.addEventListener("keydown", this.handleKeydown); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener("click", this.handleClickOutside); document.removeEventListener("keydown", this.handleKeydown); } }, { key: "toggleMenu", value: function toggleMenu() { this.setState({ menu: !this.state.menu }); } }, { key: "handleClickOutside", value: function handleClickOutside(event) { var container = this._container; var menu = this._menu; if (container.contains(event.target)) { return; } else if (!menu.contains(event.target) && this.state.menu) { this.toggleMenu(); } } }, { key: "handleKeydown", value: function handleKeydown(event) { if (event.keyCode === 27 && this.state.menu) { this.toggleMenu(); } } }, { key: "render", value: function render() { var _this2 = this; var _props = this.props; var title = _props.title; var menuItems = _props.menuItems; var _onClick = _props.onClick; var mobile = _props.mobile; return _react2.default.createElement( "div", { className: "TypeSelector", style: [styles.container.base, mobile && { display: "block" }], onClick: this.toggleMenu, ref: function ref(node) { _this2._container = node; } }, mobile && _react2.default.createElement(_radium.Style, { scopeSelector: ".TypeSelector", rules: { ".Flyout-arrow span": { left: "auto !important", marginLeft: "44px !important" } } }), _react2.default.createElement( _heading2.default, { level: 1, size: "large", weight: "thin", override: styles.heading.base }, title ), _react2.default.createElement(_paginatorButton2.default, { arrow: "triangle", color: "blue", direction: "down", size: "small", shadow: "tight", align: "vertical", iconLabel: "Open menu", owns: "type-selector-menu" }), _react2.default.createElement( "div", { className: "TypeSelector-menu", id: "type-selector-menu", style: [styles.menu.base, !mobile && { right: "-125px" }, mobile && { maxWidth: "290px", width: "100%" }, this.state.menu ? styles.menu.visible : styles.menu.hidden], "aria-hidden": !this.state.menu, ref: function ref(node) { _this2._menu = node; } }, _react2.default.createElement( _flyout2.default, { arrow: "up", size: "medium", displayType: "dropdown", fill: true }, _react2.default.createElement(_radium.Style, { scopeSelector: ".SubNavigation", rules: { listStyle: "none", ".TypeSelector-listItem": { color: "#646c74", display: "block", fontSize: "20px", fontWeight: 300, marginLeft: -40 / 20 + "em", marginRight: -40 / 20 + "em", padding: 17.5 / 20 + "em " + 40 / 20 + "em", position: "relative" }, ".TypeSelector-listItem:hover": { backgroundColor: "#f4f8fc" }, ".TypeSelector-listItem:active": { backgroundColor: "#f4f8fc" }, ".TypeSelector-listItem:focus": { backgroundColor: "#f4f8fc" }, ".TypeSelector-listItem--active .ActiveMarker": { backgroundColor: _settings.color.red, borderRadius: "100%", bottom: 0, display: "block", height: ".4rem", left: "2rem", marginBottom: "auto", marginTop: "auto", position: "absolute", top: 0, width: ".4rem", zIndex: 1 } } }), _react2.default.createElement( "ul", { className: "SubNavigation" }, menuItems.map(function (menuItem, index) { return _react2.default.createElement( "li", { key: index }, _react2.default.createElement( _reactRouter.Link, { to: "" + menuItem.slug, key: "link " + index, onClick: function onClick() { _this2.toggleMenu(); if (_onClick) { _onClick(); } }, className: "TypeSelector-listItem", activeClassName: "TypeSelector-listItem--active" }, _react2.default.createElement("span", { className: "ActiveMarker" }), menuItem.item ) ); }) ) ) ) ); } }]); return TypeSelector; }(_react2.default.Component); TypeSelector.propTypes = { /** * Title for Type Selector */ title: _react2.default.PropTypes.string.isRequired, /** * Menu Items for Type Selector */ menuItems: _react2.default.PropTypes.arrayOf(_react2.default.PropTypes.string).isRequired, /** * Method to run when the Link component is clicked */ onClick: _react2.default.PropTypes.func, /** * Whether or not to use the mobile layout */ mobile: _react2.default.PropTypes.bool }; TypeSelector.defaultProps = { title: "", menuItems: [], onClick: null, mobile: false }; TypeSelector.styles = styles; exports.default = (0, _radium2.default)(TypeSelector);