@procore/core-react
Version:
React library of Procore Design Guidelines
254 lines (247 loc) • 11.9 kB
JavaScript
var _excluded = ["title", "children", "variant"],
_excluded2 = ["children", "qa"],
_excluded3 = ["children", "qa"],
_excluded4 = ["children", "onClickBack", "onClose"],
_excluded5 = ["children"],
_excluded6 = ["children"],
_excluded7 = ["children"],
_excluded8 = ["children"],
_excluded9 = ["aria-labelledby", "children"];
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
import { ChevronLeft, Clear, EllipsisVertical } from '@procore/core-icons/dist';
import { useId } from '@react-aria/utils';
import React from 'react';
import { Button } from '../Button';
import { Menu } from '../Menu';
import { OverlayTrigger } from '../OverlayTrigger';
import { LevelContext, Section, SectionProvider } from '../Section';
import { Tooltip } from '../Tooltip';
import { useI18nContext } from '../_hooks/I18n';
import { addSubcomponents } from '../_utils/addSubcomponents';
import { isReactElement } from '../_utils/isReactElement';
import { partition } from '../_utils/partition';
import { StyledBody, StyledCloseButton, StyledFooter, StyledFooterActions, StyledFooterNotation, StyledHeader, StyledHeaderActions, StyledHeaderBackAction, StyledMoreMenu, StyledPanel, StyledTitle } from './Panel.styles';
var PanelContext = /*#__PURE__*/React.createContext({
ariaLabelledBy: undefined,
isScrolling: false,
setIsScrolling: function setIsScrolling() {}
});
var usePanelContext = function usePanelContext() {
return React.useContext(PanelContext);
};
var maxVisibleIcons = 3;
var HeaderAction = /*#__PURE__*/React.forwardRef(function HeaderAction(_ref, ref) {
var title = _ref.title,
children = _ref.children,
_ref$variant = _ref.variant,
variant = _ref$variant === void 0 ? 'tertiary' : _ref$variant,
props = _objectWithoutProperties(_ref, _excluded);
return /*#__PURE__*/React.createElement(Tooltip, {
overlay: title,
trigger: ['hover', 'focus'],
ref: ref
}, /*#__PURE__*/React.createElement(Button, _extends({
"aria-label": title
}, props, {
variant: variant
}), children));
});
var MoreMenu = /*#__PURE__*/React.forwardRef(function MoreMenu(_ref2, ref) {
var children = _ref2.children;
return /*#__PURE__*/React.createElement(StyledMoreMenu, {
ref: ref
}, /*#__PURE__*/React.createElement(Menu, {
ref: function ref(node) {
return node === null || node === void 0 ? void 0 : node.focus();
}
}, /*#__PURE__*/React.createElement(Menu.Options, null, React.Children.map(children, function (child) {
if (isReactElement(child)) {
return /*#__PURE__*/React.createElement(Menu.Item, {
item: null,
key: child.props.title,
onClick: child.props.onClick
}, child.props.title);
}
}))));
});
export var MoreIcon = function MoreIcon(_ref3) {
var children = _ref3.children,
qa = _ref3.qa;
var i18n = useI18nContext();
return /*#__PURE__*/React.createElement(OverlayTrigger, {
overlay: /*#__PURE__*/React.createElement(MoreMenu, null, children),
placement: "bottom-right",
trackAriaExpanded: true,
trigger: "click"
}, /*#__PURE__*/React.createElement(Button, {
"aria-haspopup": "menu",
"aria-label": i18n.t('core.dropdown.moreOptions'),
"data-qa": qa === null || qa === void 0 ? void 0 : qa.moreIcon,
icon: /*#__PURE__*/React.createElement(EllipsisVertical, null),
variant: "tertiary"
}));
};
var HeaderActions = /*#__PURE__*/React.forwardRef(function HeaderActions(_ref4, ref) {
var children = _ref4.children,
qa = _ref4.qa,
props = _objectWithoutProperties(_ref4, _excluded2);
var iconsAmount = React.Children.count(children);
var _ref5 = iconsAmount > maxVisibleIcons ? partition(function (_, index) {
return index > iconsAmount - maxVisibleIcons;
}, React.Children.toArray(children)) : [children, []],
_ref6 = _slicedToArray(_ref5, 2),
visibleIcons = _ref6[0],
hiddenIcons = _ref6[1];
return /*#__PURE__*/React.createElement(StyledHeaderActions, _extends({}, props, {
ref: ref
}), visibleIcons, hiddenIcons.length > 0 && /*#__PURE__*/React.createElement(MoreIcon, {
qa: qa
}, hiddenIcons));
});
var Title = /*#__PURE__*/React.forwardRef(function Title(_ref7, ref) {
var children = _ref7.children,
qa = _ref7.qa,
props = _objectWithoutProperties(_ref7, _excluded3);
var _usePanelContext = usePanelContext(),
ariaLabelledBy = _usePanelContext.ariaLabelledBy;
var headingId = props.id || ariaLabelledBy;
return /*#__PURE__*/React.createElement(StyledTitle, _extends({
id: headingId
}, props, {
ref: ref,
"data-qa": qa === null || qa === void 0 ? void 0 : qa.title
}), children);
});
var Header = /*#__PURE__*/React.forwardRef(function Header(_ref8, ref) {
var children = _ref8.children,
onClickBack = _ref8.onClickBack,
onClose = _ref8.onClose,
props = _objectWithoutProperties(_ref8, _excluded4);
var I18n = useI18nContext();
var isBackButtonActive = onClickBack !== undefined;
return /*#__PURE__*/React.createElement(StyledHeader, _extends({}, props, {
ref: ref
}), /*#__PURE__*/React.createElement(StyledHeaderBackAction, {
$active: isBackButtonActive
}, /*#__PURE__*/React.createElement(Button, {
"aria-label": I18n.t('core.panel.goBack'),
variant: "tertiary",
onClick: onClickBack,
icon: /*#__PURE__*/React.createElement(ChevronLeft, null),
"aria-hidden": !isBackButtonActive,
tabIndex: isBackButtonActive ? 0 : -1,
disabled: !isBackButtonActive
})), children, typeof onClose === 'function' && /*#__PURE__*/React.createElement(StyledCloseButton, null, /*#__PURE__*/React.createElement(HeaderAction, {
title: I18n.t('core.panel.close'),
icon: /*#__PURE__*/React.createElement(Clear, null),
onClick: onClose
})));
});
var Body = /*#__PURE__*/React.forwardRef(function Body(_ref9, ref) {
var children = _ref9.children,
props = _objectWithoutProperties(_ref9, _excluded5);
var _usePanelContext2 = usePanelContext(),
ariaLabelledBy = _usePanelContext2.ariaLabelledBy,
setIsScrolling = _usePanelContext2.setIsScrolling;
var timer = React.useRef(null);
var handleScroll = React.useCallback(function () {
setIsScrolling(true);
if (timer.current) {
clearTimeout(timer.current);
}
timer.current = setTimeout(function () {
setIsScrolling(false);
}, 100);
}, [setIsScrolling]);
return /*#__PURE__*/React.createElement(SectionProvider, null, /*#__PURE__*/React.createElement(LevelContext.Provider, {
value: 3
}, /*#__PURE__*/React.createElement(StyledBody, _extends({}, props, {
ref: ref,
tabIndex: 0,
role: "region",
"aria-labelledby": ariaLabelledBy,
onScroll: handleScroll
}), children)));
});
var FooterNotation = /*#__PURE__*/React.forwardRef(function FooterNotation(_ref0, ref) {
var children = _ref0.children,
props = _objectWithoutProperties(_ref0, _excluded6);
return /*#__PURE__*/React.createElement(StyledFooterNotation, _extends({}, props, {
ref: ref
}), children);
});
var FooterActions = /*#__PURE__*/React.forwardRef(function FooterActions(_ref1, ref) {
var children = _ref1.children,
props = _objectWithoutProperties(_ref1, _excluded7);
return /*#__PURE__*/React.createElement(StyledFooterActions, _extends({}, props, {
ref: ref
}), children);
});
var Footer = /*#__PURE__*/React.forwardRef(function Footer(_ref10, ref) {
var children = _ref10.children,
props = _objectWithoutProperties(_ref10, _excluded8);
var _usePanelContext3 = usePanelContext(),
isScrolling = _usePanelContext3.isScrolling;
return /*#__PURE__*/React.createElement(StyledFooter, _extends({}, props, {
ref: ref,
$hasShadow: isScrolling
}), children);
});
var Panel_ = /*#__PURE__*/React.forwardRef(function Panel(_ref11, ref) {
var ariaLabelledByProp = _ref11['aria-labelledby'],
children = _ref11.children,
props = _objectWithoutProperties(_ref11, _excluded9);
var _React$useState = React.useState(false),
_React$useState2 = _slicedToArray(_React$useState, 2),
isScrolling = _React$useState2[0],
setIsScrolling = _React$useState2[1];
var defaultLabelId = useId();
var ariaLabelledBy = ariaLabelledByProp !== null && ariaLabelledByProp !== void 0 ? ariaLabelledByProp : defaultLabelId;
return /*#__PURE__*/React.createElement(PanelContext.Provider, {
value: {
ariaLabelledBy: ariaLabelledBy,
isScrolling: isScrolling,
setIsScrolling: setIsScrolling
}
}, /*#__PURE__*/React.createElement(StyledPanel, _extends({}, props, {
ref: ref
}), children));
});
Panel_.displayName = 'Panel';
Body.displayName = 'Panel.Body';
Footer.displayName = 'Panel.Footer';
FooterActions.displayName = 'Panel.FooterActions';
FooterNotation.displayName = 'Panel.FooterNotation';
Header.displayName = 'Panel.Header';
HeaderAction.displayName = 'Panel.HeaderAction';
HeaderActions.displayName = 'Panel.HeaderActions';
Title.displayName = 'Panel.Title';
/**
Panels help users complete tasks or view additional information alongside the
main content of a page.
Panels are often initiated by clicking on an item somewhere on the main page,
and they often contain additional information or options specific to that item.
@since 10.19.0
@see [Storybook](https://stories.core.procore.com/?path=/story/core-react_demos-panel--demo)
@see [Design Guidelines](https://design.procore.com/panel)
*/
export var Panel = addSubcomponents({
Body: Body,
Footer: Footer,
FooterActions: FooterActions,
FooterNotation: FooterNotation,
Header: Header,
HeaderAction: HeaderAction,
HeaderActions: HeaderActions,
Section: Section,
Title: Title
}, Panel_);
//# sourceMappingURL=Panel.js.map