@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
JavaScript
/* scroll-container.tsx generated by @compiled/babel-plugin v0.39.1 */
;
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;