backpack-ui
Version:
Lonely Planet's Components
308 lines (245 loc) • 6.14 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _radium = require("radium");
var _radium2 = _interopRequireDefault(_radium);
var _objectAssign = require("object-assign");
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _upperFirst = require("lodash/upperFirst");
var _upperFirst2 = _interopRequireDefault(_upperFirst);
var _settings = require("../../../settings.json");
var _settings2 = _interopRequireDefault(_settings);
var _icon = require("../icon");
var _icon2 = _interopRequireDefault(_icon);
var _color = require("../../utils/color");
var _mixins = require("../../utils/mixins");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _ = { upperFirst: _upperFirst2.default };
var hoverStyles = {
base: {
color: _settings2.default.color.blue
},
blue: {
color: _settings2.default.color.blue
}
};
var styles = {
base: {
appearance: "none",
backgroundColor: _settings2.default.color.white,
border: 0,
borderRadius: "50%",
cursor: "pointer",
display: "inline-block",
fontSize: "9px",
lineHeight: 1,
transition: "color " + _settings2.default.timing.default + ",\n box-shadow " + _settings2.default.timing.default,
":hover": hoverStyles.base,
":active": hoverStyles.base,
":focus": (0, _objectAssign2.default)({}, hoverStyles.base, (0, _mixins.outline)())
},
size: {
small: {
height: 30 / 9 + "em",
width: 30 / 9 + "em"
},
medium: {
height: 40 / 9 + "em",
width: 40 / 9 + "em"
}
},
shadow: {
loose: {
boxShadow: "0 " + 2 / 9 + "em " + 8 / 9 + "em rgba(" + (0, _color.rgb)(_settings2.default.color.black) + ", .1)"
},
tight: {
boxShadow: "0 0 " + 4 / 9 + "em rgba(" + (0, _color.rgb)(_settings2.default.color.black) + ", .16)"
}
},
color: {
blue: {
color: _settings2.default.color.blue,
":hover": hoverStyles.blue,
":active": hoverStyles.blue,
":focus": (0, _objectAssign2.default)({}, hoverStyles.blue, (0, _mixins.outline)())
}
},
align: {
base: {
position: "absolute"
},
vertical: {
bottom: 0,
marginBottom: "auto",
marginTop: "auto",
top: 0
},
horizontal: {
left: 0,
marginLeft: "auto",
marginRight: "auto",
right: 0
}
},
direction: {
up: {
base: {
top: 0
},
offset: {
small: {
top: -15 / 9 + "em"
},
medium: {
top: -20 / 9 + "em"
}
}
},
down: {
base: {
bottom: 0
},
offset: {
small: {
bottom: -15 / 9 + "em"
},
medium: {
bottom: -20 / 9 + "em"
}
}
},
left: {
base: {
left: 0
},
offset: {
small: {
left: -15 / 9 + "em"
},
medium: {
left: -20 / 9 + "em"
}
}
},
right: {
base: {
right: 0
},
offset: {
small: {
right: -15 / 9 + "em"
},
medium: {
right: -20 / 9 + "em"
}
}
}
}
};
function PaginatorButton(_ref) {
var direction = _ref.direction;
var size = _ref.size;
var shadow = _ref.shadow;
var arrow = _ref.arrow;
var color = _ref.color;
var align = _ref.align;
var offset = _ref.offset;
var onClick = _ref.onClick;
var iconLabel = _ref.iconLabel;
var owns = _ref.owns;
var style = [styles.base];
if (size) {
style.push(styles.size[size]);
}
if (shadow) {
style.push(styles.shadow[shadow]);
}
if (color) {
style.push(styles.color[color]);
}
if (align) {
style.push(styles.align.base, styles.align[align], offset ? styles.direction[direction].offset[size] : styles.direction[direction].base);
}
var iconName = "" + _.upperFirst(arrow) + _.upperFirst(direction);
var label = void 0;
if (iconLabel) {
label = iconLabel;
} else {
label = direction === "up" || direction === "left" ? "Previous" : "Next";
}
var PaginatorIcon = _react2.default.createElement(_icon2.default[iconName], {
label: label
});
return _react2.default.createElement(
"button",
{
className: "PaginatorButton",
style: style,
title: label,
onClick: onClick,
"aria-label": label,
"aria-owns": owns
},
PaginatorIcon
);
}
PaginatorButton.propTypes = {
/**
* Change the direction the arrow points
*/
direction: _react2.default.PropTypes.oneOf(["up", "down", "left", "right"]).isRequired,
/**
* Set the size of the button
*/
size: _react2.default.PropTypes.oneOf(["small", "medium"]),
/**
* Change the shadow
*/
shadow: _react2.default.PropTypes.oneOf(["loose", "tight"]),
/**
* Change the arrow icon type
*/
arrow: _react2.default.PropTypes.oneOf(["chevron", "triangle"]),
/**
* Change the color of the icon
*/
color: _react2.default.PropTypes.oneOf(["", "blue"]),
/**
* Position the button absolutely and align it
*/
align: _react2.default.PropTypes.oneOf(["", "horizontal", "vertical"]),
/**
* Offset the button when positioned absolutely; must be used with align
*/
offset: _react2.default.PropTypes.bool,
/**
* Function to run when the button is clicked
*/
onClick: _react2.default.PropTypes.func,
/**
* Override the icon label
*/
iconLabel: _react2.default.PropTypes.string,
/**
* The ID of the sibling element that the button owns, e.g., if the button has
* a menu with an ID of "share-menu", then `owns="share-menu"`.
*/
owns: _react2.default.PropTypes.string
};
PaginatorButton.defaultProps = {
direction: "up",
size: "medium",
shadow: "loose",
arrow: "chevron",
color: "",
align: "",
offset: false,
onClick: null,
iconLabel: "",
owns: ""
};
PaginatorButton.styles = styles;
exports.default = (0, _radium2.default)(PaginatorButton);