backpack-ui
Version:
Lonely Planet's Components
460 lines (384 loc) • 12.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _base, _base3, _base5, _image, _description;
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _radium = require("radium");
var _radium2 = _interopRequireDefault(_radium);
var _truncate = require("truncate");
var _truncate2 = _interopRequireDefault(_truncate);
var _moment = require("moment");
var _moment2 = _interopRequireDefault(_moment);
var _reactRouter = require("react-router");
var _settings = require("../../../settings.json");
var _bookmark = require("../bookmark");
var _bookmark2 = _interopRequireDefault(_bookmark);
var _moreLink = require("../moreLink");
var _moreLink2 = _interopRequireDefault(_moreLink);
var _grid = require("../../utils/grid");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 containerWidth = (0, _grid.span)(8, "static");
var imageWidth = (0, _grid.span)(2, "static");
var contentWidth = (0, _grid.span)(6, "static");
var styles = {
image: {
base: (_base = {
position: "relative",
width: (0, _grid.percentage)("78px", "335px")
}, _defineProperty(_base, "@media (max-width: " + _settings.media.max["768"] + ")", {
float: "right",
marginTop: ".9rem"
}), _defineProperty(_base, "@media (min-width: " + _settings.media.min["768"] + ")", {
position: "absolute",
right: 0,
top: 0,
width: (0, _grid.percentage)(imageWidth, containerWidth)
}), _base),
img: {
display: "block",
float: "right"
}
},
content: {
base: {
position: "relative"
}
},
info: {
base: {
overflow: "hidden"
}
},
header: {
base: _defineProperty({
overflow: "hidden"
}, "@media (min-width: " + _settings.media.min["768"] + ")", {
marginRight: (0, _grid.percentage)((0, _grid.gutter)("static"), containerWidth),
width: (0, _grid.percentage)(contentWidth, containerWidth)
})
},
category: {
base: (_base3 = {
color: _settings.color.detailHeaderSmall,
fontSize: "1rem",
lineHeight: 1,
marginBottom: ".5rem",
textTransform: "uppercase"
}, _defineProperty(_base3, "@media (max-width: " + _settings.media.max["768"] + ")", {
letterSpacing: ".4px",
marginTop: ".1rem"
}), _defineProperty(_base3, "@media (min-width: " + _settings.media.min["768"] + ")", {
fontSize: "1.2rem",
marginBottom: "1rem"
}), _base3),
sponsored: {
color: _settings.color.orange,
fontWeight: 600
},
topChoice: {
color: _settings.color.red,
fontWeight: 600
},
location: _defineProperty({}, "@media (max-width: " + _settings.media.max["768"] + ")", {
display: "none"
})
},
title: {
base: _defineProperty({
color: _settings.color.darkGray,
float: "left",
fontSize: "2rem",
fontWeight: 600,
letterSpacing: "-1px",
lineHeight: 24 / 20,
margin: 0,
maxWidth: "76%"
}, "@media (min-width: " + _settings.media.min["768"] + ")", {
fontSize: "2.8rem",
lineHeight: 34 / 28,
maxWidth: "100%",
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "nowrap"
})
},
bookmark: {
base: (_base5 = {}, _defineProperty(_base5, "@media (max-width: " + _settings.media.max["768"] + ")", {
bottom: "-2rem",
position: "absolute",
right: "-.4rem"
}), _defineProperty(_base5, "@media (min-width: " + _settings.media.min["768"] + ")", {
display: "inline-block",
marginLeft: ".5rem",
marginTop: ".3rem"
}), _base5)
},
description: {
base: _defineProperty({
color: _settings.color.titleGray,
float: "left",
fontSize: "1.4rem",
lineHeight: 24 / 14,
marginTop: ".9rem",
width: (0, _grid.percentage)("242px", "335px"),
fontWeight: 300
}, "@media (min-width: " + _settings.media.min["768"] + ")", {
fontSize: "1.8rem",
lineHeight: 32 / 18,
marginRight: (0, _grid.percentage)((0, _grid.gutter)("static"), containerWidth),
marginTop: "1.4rem",
width: (0, _grid.percentage)(contentWidth, containerWidth)
}),
clamp: {
display: "-webkit-box",
overflow: "hidden",
textOverflow: "ellipsis",
WebkitBoxOrient: "vertical",
WebkitLineClamp: 2
}
},
link: {
image: (_image = {}, _defineProperty(_image, "@media (max-width: " + _settings.media.max["1024"] + ")", {
display: "none"
}), _defineProperty(_image, "@media (min-width: " + _settings.media.min["1024"] + ")", {
marginTop: "2rem"
}), _image),
description: (_description = {}, _defineProperty(_description, "@media (max-width: " + _settings.media.max["768"] + ")", {
marginTop: "1.2rem"
}), _defineProperty(_description, "@media (min-width: " + _settings.media.min["768"] + ") and (max-width: " + _settings.media.max["1024"] + ")", {
marginTop: "1.9rem"
}), _defineProperty(_description, "@media (min-width: " + _settings.media.min["1024"] + ")", {
display: "none"
}), _description)
}
};
function ListItem(_ref) {
var title = _ref.title;
var slug = _ref.slug;
var subtype = _ref.subtype;
var place = _ref.place;
var image = _ref.image;
var link = _ref.link;
var description = _ref.description;
var sponsored = _ref.sponsored;
var topChoice = _ref.topChoice;
var bookmark = _ref.bookmark;
var bookmarkSize = _ref.bookmarkSize;
var ad = _ref.ad;
var date = _ref.date;
var id = _ref.id;
var shortDescription = typeof description === "string" && (0, _truncate2.default)(description.replace(/(<([^>]+)>)/ig, ""), 215);
var showLink = link.title && link.url;
var ListItemLink = showLink && _react2.default.createElement(
"div",
{ className: "ListItem-link", style: styles.link.image },
_react2.default.createElement(
_moreLink2.default,
{ href: link.url, caps: true },
link.title
)
);
return _react2.default.createElement(
"div",
{ className: "ListItem", id: id },
_react2.default.createElement(
"div",
{ className: "ListItem-content", style: styles.content.base },
_react2.default.createElement(
"header",
{ className: "ListItem-header", style: styles.header.base },
_react2.default.createElement(
"div",
{ className: "ListItem-category", style: styles.category.base },
date && _react2.default.createElement(
"time",
{ dateTime: (0, _moment2.default)(date).format("YYYY-MM-DD") },
(0, _moment2.default)(date).format("D MMMM YYYY")
),
!date && sponsored && ad && _react2.default.createElement(
"span",
{ style: styles.category.sponsored },
"Sponsored",
ad
),
" ",
!date && topChoice && _react2.default.createElement(
"span",
{ style: styles.category.topChoice },
"Top Choice"
),
" ",
!date && subtype,
" ",
!date && place.name && _react2.default.createElement(
"span",
{ style: styles.category.location },
" in ",
place.name
)
),
_react2.default.createElement(
"h2",
{ className: "ListItem-title", style: styles.title.base },
_react2.default.createElement(
_reactRouter.Link,
{ to: "" + slug, style: { color: "currentColor" } },
title
)
),
bookmark && _react2.default.createElement(
"div",
{ className: "ListItem-bookmark", style: styles.bookmark.base },
_react2.default.createElement(_bookmark2.default, {
onClick: null,
size: bookmarkSize
})
)
),
description && _react2.default.createElement(
"div",
{ className: "ListItem-info", style: styles.info.base },
_react2.default.createElement(
"div",
{ className: "ListItem-description", style: styles.description.base },
_react2.default.createElement("div", {
style: styles.description.clamp,
dangerouslySetInnerHTML: { __html: shortDescription }
}),
showLink && _react2.default.createElement(
"div",
{ className: "ListItem-link", style: styles.link.description },
_react2.default.createElement(
_moreLink2.default,
{ href: link.url, caps: true },
link.title
)
)
),
image.path && showLink && _react2.default.createElement(
"div",
{ className: "ListItem-image", style: styles.image.base },
_react2.default.createElement(
"div",
{ style: styles.image.img },
_react2.default.createElement(
_reactRouter.Link,
{ to: "" + slug, style: { display: "block" } },
_react2.default.createElement("img", {
src: image.path,
alt: ""
})
),
ListItemLink
)
),
image.path && !showLink && _react2.default.createElement(
"div",
{ className: "ListItem-image", style: styles.image.base },
_react2.default.createElement(
_reactRouter.Link,
{ to: "" + slug, style: styles.image.img },
_react2.default.createElement("img", { src: image.path, alt: "" })
)
),
!image.path && showLink && _react2.default.createElement(
"div",
{
className: "ListItem-image",
style: [styles.image.base, { paddingLeft: "20px" }]
},
ListItemLink
)
)
)
);
}
ListItem.propTypes = {
/**
* The name of the POI
*/
title: _react2.default.PropTypes.string.isRequired,
/**
* The URL slug of the POI
*/
slug: _react2.default.PropTypes.string.isRequired,
/**
* The subtype of POI; i.e. Museum
*/
subtype: _react2.default.PropTypes.string.isRequired,
/**
* The place data for the POI; required keys are name and type
*/
place: _react2.default.PropTypes.shape({
name: _react2.default.PropTypes.string,
type: _react2.default.PropTypes.string
}).isRequired,
/**
* Image src for the POI; required keys are path and orientation
*/
image: _react2.default.PropTypes.shape({
path: _react2.default.PropTypes.string,
orientation: _react2.default.PropTypes.oneOf(["", "portrait", "landscape"])
}),
/**
* Link to display under image; required keys are title and url
*/
link: _react2.default.PropTypes.shape({
title: _react2.default.PropTypes.string,
url: _react2.default.PropTypes.string
}),
/**
* Description for POI
*/
description: _react2.default.PropTypes.string,
/**
* Add a "sponsored" label
*/
sponsored: _react2.default.PropTypes.bool,
/**
* Add a "top choice" label
*/
topChoice: _react2.default.PropTypes.bool,
/**
* If list item is able to be bookmarked
*/
bookmark: _react2.default.PropTypes.bool,
/**
* Size of bookmark component
*/
bookmarkSize: _react2.default.PropTypes.oneOf(["small", "large"]),
/**
* Google DFP ad; sponsored must be true
*/
ad: _react2.default.PropTypes.string,
/**
* Publish date for news article
*/
date: _react2.default.PropTypes.string,
/**
* Unique ID for item
*/
id: _react2.default.PropTypes.string
};
ListItem.defaultProps = {
title: "",
slug: "",
type: "",
subtype: "",
place: {},
image: {},
link: {},
description: "",
sponsored: false,
topChoice: false,
bookmark: false,
bookmarkSize: "small",
ad: "",
date: "",
id: ""
};
ListItem.styles = styles;
exports.default = (0, _radium2.default)(ListItem);