backpack-ui
Version:
Lonely Planet's Components
328 lines (276 loc) • 10.4 kB
JavaScript
"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);