UNPKG

@atlaskit/modal-dialog

Version:

A modal dialog displays content that requires user interaction, in a layer above the page.

104 lines (101 loc) 5.05 kB
/* scroll-container.tsx generated by @compiled/babel-plugin v0.39.1 */ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("./scroll-container.compiled.css"); var _runtime = require("@compiled/react/runtime"); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _bindEventListener = require("bind-event-listener"); var _rafSchd = _interopRequireDefault(require("raf-schd")); var _css = require("@atlaskit/css"); var _mergeRefs = _interopRequireDefault(require("@atlaskit/ds-lib/merge-refs")); var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop")); var _useLazyCallback = _interopRequireDefault(require("@atlaskit/ds-lib/use-lazy-callback")); var _compiled = require("@atlaskit/primitives/compiled"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } var keylineColor = "var(--ds-border, #0B120E24)"; var styles = { base: "_kkes1kw7 _1e0c1kw7 _2lx21kw7 _16jlkb7n _6rthze3t _1pfhze3t _12l2ze3t _ahbqze3t _1reo15vq _18m91wug _1jykn7od _wzg61wug", topKeyline: "_mqm21uh4", bottomKeyline: "_179r1uh4" }; var keylineHeight = 2; /** * A container that shows top and bottom keylines when the * content overflows into the scrollable element. */ var ScrollContainer = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) { var testId = _ref.testId, children = _ref.children; var scrollableRef = (0, _react.useRef)(null); var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), showTopKeyline = _useState2[0], setTopKeyline = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), showBottomKeyline = _useState4[0], setBottomKeyline = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), showContentFocus = _useState6[0], setContentFocus = _useState6[1]; // Schedule a content focus on the target element // WARNING: In theory, `target` may not be available when `rafSchedule` hits in concurrent rendering (0, _react.useEffect)(function () { var schedule = (0, _rafSchd.default)(function () { var target = scrollableRef.current; target && setContentFocus(target.scrollHeight > target.clientHeight); }); schedule(); }, [scrollableRef]); var setLazyKeylines = (0, _useLazyCallback.default)((0, _rafSchd.default)(function () { var target = scrollableRef.current; if (target) { var scrollableDistance = target.scrollHeight - target.clientHeight; if (target.previousElementSibling) { setTopKeyline(target.scrollTop > keylineHeight); } if (target.nextElementSibling) { setBottomKeyline(target.scrollTop <= scrollableDistance - keylineHeight); } } })); // On load (and scroll/resize events), we set "keylines" // these border the content to indicate scrollability when content underflows the header or footer (0, _react.useEffect)(function () { var target = scrollableRef.current; setLazyKeylines(); var unbindWindowEvent = (0, _bindEventListener.bind)(window, { type: 'resize', listener: setLazyKeylines }); var unbindTargetEvent = target ? (0, _bindEventListener.bind)(target, { type: 'scroll', listener: setLazyKeylines }) : _noop.default; return function () { unbindWindowEvent(); unbindTargetEvent(); }; }, [setLazyKeylines]); return /*#__PURE__*/_react.default.createElement(_compiled.Focusable, { as: "div", isInset: true // tabindex is allowed here so that keyboard users can scroll content , tabIndex: showContentFocus ? 0 : undefined, role: showContentFocus ? 'region' : undefined, "aria-label": showContentFocus ? 'Scrollable content' : undefined, testId: testId && "".concat(testId, "--scrollable"), ref: (0, _mergeRefs.default)([ref, scrollableRef]), xcss: (0, _css.cx)(styles.base, showTopKeyline && styles.topKeyline, showBottomKeyline && styles.bottomKeyline) }, children); }); ScrollContainer.displayName = 'ScrollContainer'; var _default = exports.default = ScrollContainer;