backpack-ui
Version:
Lonely Planet's Components
200 lines (169 loc) • 5.56 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 _settings = require("../../../settings.json");
var _color = require("../../utils/color");
var _icon = require("../icon");
var _icon2 = _interopRequireDefault(_icon);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function mapMarker(_ref) {
var poiType = _ref.poiType;
var size = _ref.size;
var hideShadow = _ref.hideShadow;
var inverse = _ref.inverse;
var types = {
sleeping: {
icon: "Sleep",
color: _settings.color.poiSleep
},
drinking_nightlife: {
icon: "Drink",
color: _settings.color.poiDrink
},
transport: {
icon: "Transport",
color: _settings.color.poiTransport
},
activities: {
icon: "See",
color: _settings.color.poiSee
},
tours: {
icon: "See",
color: _settings.color.poiSee
},
entertainment: {
icon: "Play",
color: _settings.color.poiPlay
},
shopping: {
icon: "Shop",
color: _settings.color.poiShop
},
eating: {
icon: "Eat",
color: _settings.color.poiEat
},
restaurants: {
icon: "Eat",
color: _settings.color.poiEat
},
sights: {
icon: "See",
color: _settings.color.poiSee
},
info: {
icon: "Default",
color: _settings.color.poiDefault
},
festivals_events: {
icon: "Play",
color: _settings.color.poiPlay
}
};
/**
* Get a size (in pixels) to use in the CSS. A ratio is created by dividing a
* given number by the default icon size (20). That ratio is then multiplied
* by the size recieved in the component’s props to create a value that is
* proportional to the size of the marker.
* @param {Number} number Pixel value of desired size
* @return {Number} Calculated pixel value
*/
var getSize = function getSize(number) {
return Math.ceil(size * (number / 20));
};
/**
* Calculate the font size from the size (height, width). The ratio is
* calculated by dividing 11 (which is the font size for a 20x20 icon) by 20
* (which has been defined as the default size).
*/
var fontSize = getSize(11);
/**
* Calculate the border width from the size (height, width). The ratio is
* calculated by dividing 1 (which is the lowest posible width) by 20 (which
* has been defined as the default size and is the smallest size that a 1px
* border should be applied to).
*/
var borderWidth = getSize(1);
var styles = {
container: {
base: {
borderRadius: "100%",
backgroundColor: poiType === "center" ? _settings.color.blue : types[poiType].color,
color: _settings.color.white,
borderColor: "rgba(" + (0, _color.rgb)(_settings.color.black) + ", .12)",
borderStyle: "solid",
borderWidth: borderWidth / fontSize + "em",
display: "inline-block",
fontSize: fontSize + "px",
height: size / fontSize + "em",
lineHeight: 1,
textAlign: "center",
width: size / fontSize + "em"
},
shadow: {
boxShadow: "0 " + getSize(1) / fontSize + "em\n " + getSize(5) / fontSize + "em\n rgba(" + (0, _color.rgb)(_settings.color.black) + ", .25)"
},
inverse: {
backgroundColor: _settings.color.white,
borderColor: "transparent",
borderWidth: 0,
boxShadow: "0 0 " + getSize(5) / fontSize + "em\n rgba(" + (0, _color.rgb)(_settings.color.black) + ", .25)",
color: poiType === "center" ? _settings.color.blue : types[poiType].color
}
},
icon: {
base: {
position: "relative",
top: "50%",
transform: "translateY(-50%)",
verticalAlign: "top"
}
}
};
var MarkerIcon = _react2.default.createElement(_icon2.default["Map" + types[poiType].icon], {
style: styles.icon.base,
fill: inverse ? types[poiType].color : _settings.color.white
});
return _react2.default.createElement(
"div",
{
className: "MapMarker",
style: [styles.container.base, !hideShadow && styles.container.shadow, inverse && styles.container.inverse]
},
poiType === "center" ? _react2.default.createElement(_icon2.default.MapDefault, null) : MarkerIcon
);
}
mapMarker.propTypes = {
/**
* A pre-defined POI type that maps to an icon; "center" is a custom value
* that can be used to create an LP Blue marker that uses the default icon
*/
poiType: _react2.default.PropTypes.oneOf(["center", "activities", "drinking_nightlife", "eating", "entertainment", "festivals_events", "info", "restaurants", "shopping", "sights", "sleeping", "tours", "transport"]),
/**
* Number to define width and height
*/
size: _react2.default.PropTypes.number,
/**
* Whether or not to hide the shadow on the marker; note that the "inverse"
* marker always has a shadow, regardless of the value of this prop
*/
hideShadow: _react2.default.PropTypes.bool,
/**
* Reverse the colors; the background becomes white and the icon a color
*/
inverse: _react2.default.PropTypes.bool
};
mapMarker.defaultProps = {
poiType: "center",
size: 20,
hideShadow: false,
inverse: false
};
// mapMarker.styles = styles;
exports.default = (0, _radium2.default)(mapMarker);