quantumai-design-system
Version:
퀀텀에이아이의 디자인 시스템
69 lines (68 loc) • 4.38 kB
JavaScript
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
return cooked;
};
var __assign = (this && this.__assign) || function () {
__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;
};
return __assign.apply(this, arguments);
};
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 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
import styled from '@emotion/styled';
import { forwardRef, useCallback, useContext } from 'react';
import { transitionSet } from '../../../utils/styleSet';
import { DropDownContext } from './DropDownContext';
import useTransition from '../../../hooks/useTransition';
import Portal from '../Portal';
var DropDownDisplay = forwardRef(function (_a, ref) {
var children = _a.children, props = __rest(_a, ["children"]);
var _b = useContext(DropDownContext), show = _b.show, setShow = _b.setShow, wrapRef = _b.wrapRef, _c = _b.spacing, spacing = _c === void 0 ? 0 : _c, isOutSideClose = _b.isOutSideClose;
var _d = useTransition(!!show), isMount = _d[0], isTransition = _d[1], onEndTransition = _d[2];
var contentRef = useCallback(function (el) {
if (el === null || !wrapRef)
return;
el === null || el === void 0 ? void 0 : el.focus();
//trigger의 상대 좌표 및 크기
var _a = wrapRef.getBoundingClientRect(), top = _a.top, bottom = _a.bottom, left = _a.left, right = _a.right, wrapWidth = _a.width;
//컨텐츠 크기
var _b = el.getBoundingClientRect(), width = _b.width, height = _b.height;
//컨텐츠 포지션
var pTop = top - height;
var pRight = right - width;
//남은 여백 계산 위치 선정
var isTop = height > window.innerHeight - bottom; //height > 아래 여백
var isRight = width > window.innerWidth - right; //width > 오른쪽 여백
el.style.top = (isTop ? pTop : bottom) + 'px';
el.style.left = (isRight ? pRight : left) + 'px';
el.style.minWidth = wrapWidth + 'px';
if (isTransition) {
el.style.transform = "translateY(".concat(isTop ? -spacing : +spacing, "px)");
el.style.opacity = '1';
}
else {
el.style.transform = "translateY(0)";
el.style.opacity = '0';
}
}, [wrapRef, isTransition]);
return (isMount && (_jsx(Portal, { id: "dropdown-root", children: _jsx(Container, { "data-show": isMount, ref: ref, children: _jsx("div", __assign({ tabIndex: -1, ref: contentRef, onBlur: function (e) { return isOutSideClose && !e.relatedTarget && (setShow === null || setShow === void 0 ? void 0 : setShow(false)); }, onTransitionEnd: onEndTransition }, props, { children: children })) }) })));
});
export default DropDownDisplay;
var Container = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n position: fixed;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n z-index: 2000;\n pointer-events: none;\n\n &[data-show='true'] {\n pointer-events: auto;\n }\n\n & > div {\n position: absolute;\n transform: translateY(0);\n opacity: 0;\n ", ";\n &:focus-visible {\n outline: none;\n }\n }\n"], ["\n position: fixed;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n z-index: 2000;\n pointer-events: none;\n\n &[data-show='true'] {\n pointer-events: auto;\n }\n\n & > div {\n position: absolute;\n transform: translateY(0);\n opacity: 0;\n ", ";\n &:focus-visible {\n outline: none;\n }\n }\n"])), transitionSet('opacity, transform'));
var templateObject_1;