UNPKG

tandem-front-end

Version:

Visual editor for web components

80 lines 3.54 kB
"use strict"; var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; return t; }; Object.defineProperty(exports, "__esModule", { value: true }); var React = require("react"); var recompose_1 = require("recompose"); var controller_1 = require("../portal/controller"); var tandem_common_1 = require("tandem-common"); var calcPortalStyle = function (anchorRect, portalRect) { var portalSize = tandem_common_1.getBoundsSize(portalRect); var anchorSize = tandem_common_1.getBoundsSize(anchorRect); return { position: "absolute", left: Math.min(anchorRect.left, window.innerWidth - portalSize.width), top: Math.min(anchorRect.top + anchorSize.height, window.innerHeight - portalSize.height) }; }; exports.default = recompose_1.compose(recompose_1.withHandlers(function () { var _container; var _emptySpaceListener; return { setContainer: function (_a) { var onEmptySpaceClick = _a.onEmptySpaceClick; return function (container) { if (_emptySpaceListener) { document.body.removeEventListener("click", _emptySpaceListener); } _container = container; if (container && onEmptySpaceClick) { document.body.addEventListener("click", (_emptySpaceListener = function (event) { if (!container.contains(event.target)) { onEmptySpaceClick(event); } })); } }; } }; }), function (Base) { return function (_a) { var setContainer = _a.setContainer, children = _a.children, anchorRect = _a.anchorRect, rest = __rest(_a, ["setContainer", "children", "anchorRect"]); return anchorRect ? (React.createElement(Base, __assign({ anchorRect: anchorRect }, rest), React.createElement("div", { ref: setContainer, style: { width: anchorRect.right - anchorRect.left } }, children))) : null; }; }, recompose_1.pure, recompose_1.withState("style", "setStyle", null), controller_1.portal({ didMount: function (_a) { var anchorRect = _a.anchorRect, setStyle = _a.setStyle; return function (portalMount) { var newStyle = calcPortalStyle(anchorRect, calcInnerBounds(portalMount.children[0].children[0] .children[0])); setStyle(newStyle); }; } })); var calcInnerBounds = function (element, maxDepth, depth) { if (maxDepth === void 0) { maxDepth = 0; } if (depth === void 0) { depth = 0; } var rect = element.getBoundingClientRect(); if (depth >= maxDepth) return rect; return tandem_common_1.mergeBounds.apply(void 0, Array.from(element.children).reduce(function (rects, child) { return rects.concat([calcInnerBounds(child)]); }, [rect])); }; //# sourceMappingURL=content-controller.js.map