UNPKG

quantumai-design-system

Version:

퀀텀에이아이의 디자인 시스템

69 lines (68 loc) 4.38 kB
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;