react-image-magnifiers
Version:
A collection of responsive, image magnifying React components for mouse and touch.
177 lines (156 loc) • 7.92 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var _utils = _interopRequireDefault(require("./utils"));
var _styles = _interopRequireDefault(require("./styles"));
var _Image = _interopRequireDefault(require("./Image"));
var _ImagePreviewOverlay = _interopRequireDefault(require("./ImagePreviewOverlay"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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 PictureInPictureRenderer = function PictureInPictureRenderer(props) {
var active = props.active,
itemPosition = props.itemPosition,
elementDimensions = props.elementDimensions,
itemDimensions = props.itemDimensions,
imageSrc = props.imageSrc,
largeImageSrc = props.largeImageSrc,
imageAlt = props.imageAlt,
itemRef = props.itemRef,
previewSizePercentage = props.previewSizePercentage,
containerRef = props.containerRef,
previewVerticalPos = props.previewVerticalPos,
previewOpacity = props.previewOpacity,
previewOverlayOpacity = props.previewOverlayOpacity,
previewOverlayBoxOpacity = props.previewOverlayBoxOpacity,
previewOverlayBackgroundColor = props.previewOverlayBackgroundColor,
previewOverlayBoxColor = props.previewOverlayBoxColor,
previewOverlayBoxImage = props.previewOverlayBoxImage,
previewOverlayBoxImageSize = props.previewOverlayBoxImageSize,
renderOverlay = props.renderOverlay,
cursorStyle = props.cursorStyle,
cursorStyleActive = props.cursorStyleActive,
onLoadRefresh = props.onLoadRefresh,
_onImageLoad = props.onImageLoad,
onLargeImageLoad = props.onLargeImageLoad;
var sizeMult = 100 / previewSizePercentage;
var containerTop = 0;
var containerLeft = 0;
var containerWidth = 0;
if (containerRef.current) {
containerWidth = containerRef.current.getBoundingClientRect().width;
if (previewVerticalPos === "bottom") {
containerTop = elementDimensions.height * (sizeMult - 1);
containerRef.current.style.paddingTop = "".concat(containerTop, "px");
} else {
containerRef.current.style.paddingBottom = "".concat(elementDimensions.height * (sizeMult - 1), "px");
}
if (containerRef.current.style.textAlign === "right") {
containerLeft = elementDimensions.width * (sizeMult - 1);
}
}
var smallImageSize = {
width: elementDimensions.width,
height: elementDimensions.height
};
var previewSize = {
width: Math.floor(smallImageSize.width * (smallImageSize.width / itemDimensions.width) * sizeMult),
height: Math.floor(smallImageSize.height * (smallImageSize.height / itemDimensions.height) * sizeMult)
};
if (isNaN(previewSize.width)) {
previewSize.width = 0;
previewSize.height = 0;
}
var position = {
x: 0,
y: 0
};
var itemPositionAdj = _objectSpread({}, itemPosition);
var previewOffset = {
x: previewSize.width / 2,
y: previewSize.height / 2
};
itemPositionAdj.x = Math.max(previewOffset.x, itemPositionAdj.x);
itemPositionAdj.x = Math.min(smallImageSize.width - previewOffset.x, itemPositionAdj.x);
itemPositionAdj.y = Math.max(previewOffset.y, itemPositionAdj.y);
itemPositionAdj.y = Math.min(smallImageSize.height - previewOffset.y, itemPositionAdj.y);
position = _objectSpread({}, itemPositionAdj);
position.x = _utils["default"].convertRange(previewOffset.x, smallImageSize.width - previewOffset.x, itemDimensions.width * -1 + containerWidth, 0, position.x);
position.y = _utils["default"].convertRange(previewOffset.y, smallImageSize.height - previewOffset.y, itemDimensions.height * -1 + smallImageSize.height * sizeMult, 0, position.y);
position.x = _utils["default"].invertNumber(itemDimensions.width * -1 + containerWidth, 0, position.x);
position.y = _utils["default"].invertNumber(itemDimensions.height * -1 + smallImageSize.height * sizeMult, 0, position.y);
previewSize.left = Math.floor(itemPositionAdj.x - previewOffset.x) || 0;
previewSize.right = Math.floor(itemPositionAdj.x + previewOffset.x) || 0;
previewSize.top = Math.floor(itemPositionAdj.y - previewOffset.y) || 0;
previewSize.bottom = Math.floor(itemPositionAdj.y + previewOffset.y) || 0;
var legalSize = previewSize.width < smallImageSize.width;
var finalCursorStyle = active ? cursorStyleActive : cursorStyle;
return /*#__PURE__*/_react["default"].createElement("div", {
style: {
position: "relative",
cursor: legalSize ? finalCursorStyle : "default"
}
}, /*#__PURE__*/_react["default"].createElement(_Image["default"], {
style: {
width: "100%",
display: "block",
opacity: previewOpacity,
visibility: legalSize ? "visible" : "hidden"
},
src: imageSrc,
alt: imageAlt,
onImageLoad: function onImageLoad(e) {
onLoadRefresh();
_onImageLoad(e);
},
onLoadRefresh: onLoadRefresh
}), /*#__PURE__*/_react["default"].createElement("div", {
style: _objectSpread(_objectSpread({}, _styles["default"].getZoomContainerStyle(smallImageSize.width, smallImageSize.height, true)), {}, {
width: containerWidth + "px",
height: elementDimensions.height * sizeMult + "px",
position: "absolute",
left: -containerLeft,
top: -containerTop,
fontSize: "1rem"
})
}, /*#__PURE__*/_react["default"].createElement(_Image["default"], {
style: _objectSpread(_objectSpread({}, _styles["default"].getLargeImageStyle(position.x, position.y, true)), {}, {
visibility: legalSize ? "visible" : "hidden",
zIndex: "-1"
}),
src: largeImageSrc || imageSrc,
alt: imageAlt,
ref: itemRef,
onImageLoad: onLargeImageLoad,
onLoadRefresh: onLoadRefresh
}), /*#__PURE__*/_react["default"].createElement("img", {
src: imageSrc,
alt: imageAlt,
style: {
display: legalSize ? "none" : "block",
width: "100%"
}
}), renderOverlay ? renderOverlay(active) : null), /*#__PURE__*/_react["default"].createElement(_ImagePreviewOverlay["default"], {
previewWidth: previewSize.width,
previewHeight: previewSize.height,
previewPosLeft: previewSize.left,
previewPosRight: previewSize.right,
previewPosTop: previewSize.top,
previewPosBottom: previewSize.bottom,
imageWidth: smallImageSize.width,
imageHeight: smallImageSize.height,
overlayOpacity: previewOverlayOpacity,
overlayBoxOpacity: previewOverlayBoxOpacity,
overlayBackgroundColor: previewOverlayBackgroundColor,
overlayBoxColor: previewOverlayBoxColor,
overlayBoxImage: previewOverlayBoxImage,
overlayBoxImageSize: previewOverlayBoxImageSize,
active: legalSize
}));
};
var _default = PictureInPictureRenderer;
exports["default"] = _default;