You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

302 lines
9.4 KiB

  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. exports.__esModule = true;
  4. exports.getScrollbarWidth = getScrollbarWidth;
  5. exports.setScrollbarWidth = setScrollbarWidth;
  6. exports.isBodyOverflowing = isBodyOverflowing;
  7. exports.getOriginalBodyPadding = getOriginalBodyPadding;
  8. exports.conditionallyUpdateScrollbar = conditionallyUpdateScrollbar;
  9. exports.setGlobalCssModule = setGlobalCssModule;
  10. exports.mapToCssModules = mapToCssModules;
  11. exports.omit = omit;
  12. exports.pick = pick;
  13. exports.warnOnce = warnOnce;
  14. exports.deprecated = deprecated;
  15. exports.DOMElement = DOMElement;
  16. exports.isReactRefObj = isReactRefObj;
  17. exports.findDOMElements = findDOMElements;
  18. exports.isArrayOrNodeList = isArrayOrNodeList;
  19. exports.getTarget = getTarget;
  20. exports.addMultipleEventListeners = addMultipleEventListeners;
  21. exports.focusableElements = exports.defaultToggleEvents = exports.canUseDOM = exports.PopperPlacements = exports.keyCodes = exports.TransitionStatuses = exports.TransitionPropTypeKeys = exports.TransitionTimeouts = exports.tagPropType = exports.targetPropType = void 0;
  22. var _lodash = _interopRequireDefault(require("lodash.isfunction"));
  23. var _propTypes = _interopRequireDefault(require("prop-types"));
  24. // https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.4/js/src/modal.js#L436-L443
  25. function getScrollbarWidth() {
  26. var scrollDiv = document.createElement('div'); // .modal-scrollbar-measure styles // https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.4/scss/_modal.scss#L106-L113
  27. scrollDiv.style.position = 'absolute';
  28. scrollDiv.style.top = '-9999px';
  29. scrollDiv.style.width = '50px';
  30. scrollDiv.style.height = '50px';
  31. scrollDiv.style.overflow = 'scroll';
  32. document.body.appendChild(scrollDiv);
  33. var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
  34. document.body.removeChild(scrollDiv);
  35. return scrollbarWidth;
  36. }
  37. function setScrollbarWidth(padding) {
  38. document.body.style.paddingRight = padding > 0 ? padding + "px" : null;
  39. }
  40. function isBodyOverflowing() {
  41. return document.body.clientWidth < window.innerWidth;
  42. }
  43. function getOriginalBodyPadding() {
  44. var style = window.getComputedStyle(document.body, null);
  45. return parseInt(style && style.getPropertyValue('padding-right') || 0, 10);
  46. }
  47. function conditionallyUpdateScrollbar() {
  48. var scrollbarWidth = getScrollbarWidth(); // https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.6/js/src/modal.js#L433
  49. var fixedContent = document.querySelectorAll('.fixed-top, .fixed-bottom, .is-fixed, .sticky-top')[0];
  50. var bodyPadding = fixedContent ? parseInt(fixedContent.style.paddingRight || 0, 10) : 0;
  51. if (isBodyOverflowing()) {
  52. setScrollbarWidth(bodyPadding + scrollbarWidth);
  53. }
  54. }
  55. var globalCssModule;
  56. function setGlobalCssModule(cssModule) {
  57. globalCssModule = cssModule;
  58. }
  59. function mapToCssModules(className, cssModule) {
  60. if (className === void 0) {
  61. className = '';
  62. }
  63. if (cssModule === void 0) {
  64. cssModule = globalCssModule;
  65. }
  66. if (!cssModule) return className;
  67. return className.split(' ').map(function (c) {
  68. return cssModule[c] || c;
  69. }).join(' ');
  70. }
  71. /**
  72. * Returns a new object with the key/value pairs from `obj` that are not in the array `omitKeys`.
  73. */
  74. function omit(obj, omitKeys) {
  75. var result = {};
  76. Object.keys(obj).forEach(function (key) {
  77. if (omitKeys.indexOf(key) === -1) {
  78. result[key] = obj[key];
  79. }
  80. });
  81. return result;
  82. }
  83. /**
  84. * Returns a filtered copy of an object with only the specified keys.
  85. */
  86. function pick(obj, keys) {
  87. var pickKeys = Array.isArray(keys) ? keys : [keys];
  88. var length = pickKeys.length;
  89. var key;
  90. var result = {};
  91. while (length > 0) {
  92. length -= 1;
  93. key = pickKeys[length];
  94. result[key] = obj[key];
  95. }
  96. return result;
  97. }
  98. var warned = {};
  99. function warnOnce(message) {
  100. if (!warned[message]) {
  101. /* istanbul ignore else */
  102. if (typeof console !== 'undefined') {
  103. console.error(message); // eslint-disable-line no-console
  104. }
  105. warned[message] = true;
  106. }
  107. }
  108. function deprecated(propType, explanation) {
  109. return function validate(props, propName, componentName) {
  110. if (props[propName] !== null && typeof props[propName] !== 'undefined') {
  111. warnOnce("\"" + propName + "\" property of \"" + componentName + "\" has been deprecated.\n" + explanation);
  112. }
  113. for (var _len = arguments.length, rest = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
  114. rest[_key - 3] = arguments[_key];
  115. }
  116. return propType.apply(void 0, [props, propName, componentName].concat(rest));
  117. };
  118. }
  119. function DOMElement(props, propName, componentName) {
  120. if (!(props[propName] instanceof Element)) {
  121. return new Error('Invalid prop `' + propName + '` supplied to `' + componentName + '`. Expected prop to be an instance of Element. Validation failed.');
  122. }
  123. }
  124. var targetPropType = _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func, DOMElement, _propTypes.default.shape({
  125. current: _propTypes.default.any
  126. })]);
  127. exports.targetPropType = targetPropType;
  128. var tagPropType = _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string, _propTypes.default.shape({
  129. $$typeof: _propTypes.default.symbol,
  130. render: _propTypes.default.func
  131. }), _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string, _propTypes.default.shape({
  132. $$typeof: _propTypes.default.symbol,
  133. render: _propTypes.default.func
  134. })]))]);
  135. /* eslint key-spacing: ["error", { afterColon: true, align: "value" }] */
  136. // These are all setup to match what is in the bootstrap _variables.scss
  137. // https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss
  138. exports.tagPropType = tagPropType;
  139. var TransitionTimeouts = {
  140. Fade: 150,
  141. // $transition-fade
  142. Collapse: 350,
  143. // $transition-collapse
  144. Modal: 300,
  145. // $modal-transition
  146. Carousel: 600 // $carousel-transition
  147. }; // Duplicated Transition.propType keys to ensure that Reactstrap builds
  148. // for distribution properly exclude these keys for nested child HTML attributes
  149. // since `react-transition-group` removes propTypes in production builds.
  150. exports.TransitionTimeouts = TransitionTimeouts;
  151. var TransitionPropTypeKeys = ['in', 'mountOnEnter', 'unmountOnExit', 'appear', 'enter', 'exit', 'timeout', 'onEnter', 'onEntering', 'onEntered', 'onExit', 'onExiting', 'onExited'];
  152. exports.TransitionPropTypeKeys = TransitionPropTypeKeys;
  153. var TransitionStatuses = {
  154. ENTERING: 'entering',
  155. ENTERED: 'entered',
  156. EXITING: 'exiting',
  157. EXITED: 'exited'
  158. };
  159. exports.TransitionStatuses = TransitionStatuses;
  160. var keyCodes = {
  161. esc: 27,
  162. space: 32,
  163. enter: 13,
  164. tab: 9,
  165. up: 38,
  166. down: 40,
  167. home: 36,
  168. end: 35,
  169. n: 78,
  170. p: 80
  171. };
  172. exports.keyCodes = keyCodes;
  173. var PopperPlacements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];
  174. exports.PopperPlacements = PopperPlacements;
  175. var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
  176. exports.canUseDOM = canUseDOM;
  177. function isReactRefObj(target) {
  178. if (target && typeof target === 'object') {
  179. return 'current' in target;
  180. }
  181. return false;
  182. }
  183. function findDOMElements(target) {
  184. if (isReactRefObj(target)) {
  185. return target.current;
  186. }
  187. if ((0, _lodash.default)(target)) {
  188. return target();
  189. }
  190. if (typeof target === 'string' && canUseDOM) {
  191. var selection = document.querySelectorAll(target);
  192. if (!selection.length) {
  193. selection = document.querySelectorAll("#" + target);
  194. }
  195. if (!selection.length) {
  196. throw new Error("The target '" + target + "' could not be identified in the dom, tip: check spelling");
  197. }
  198. return selection;
  199. }
  200. return target;
  201. }
  202. function isArrayOrNodeList(els) {
  203. if (els === null) {
  204. return false;
  205. }
  206. return Array.isArray(els) || canUseDOM && typeof els.length === 'number';
  207. }
  208. function getTarget(target) {
  209. var els = findDOMElements(target);
  210. if (isArrayOrNodeList(els)) {
  211. return els[0];
  212. }
  213. return els;
  214. }
  215. var defaultToggleEvents = ['touchstart', 'click'];
  216. exports.defaultToggleEvents = defaultToggleEvents;
  217. function addMultipleEventListeners(_els, handler, _events, useCapture) {
  218. var els = _els;
  219. if (!isArrayOrNodeList(els)) {
  220. els = [els];
  221. }
  222. var events = _events;
  223. if (typeof events === 'string') {
  224. events = events.split(/\s+/);
  225. }
  226. if (!isArrayOrNodeList(els) || typeof handler !== 'function' || !Array.isArray(events)) {
  227. throw new Error("\n The first argument of this function must be DOM node or an array on DOM nodes or NodeList.\n The second must be a function.\n The third is a string or an array of strings that represents DOM events\n ");
  228. }
  229. Array.prototype.forEach.call(events, function (event) {
  230. Array.prototype.forEach.call(els, function (el) {
  231. el.addEventListener(event, handler, useCapture);
  232. });
  233. });
  234. return function removeEvents() {
  235. Array.prototype.forEach.call(events, function (event) {
  236. Array.prototype.forEach.call(els, function (el) {
  237. el.removeEventListener(event, handler, useCapture);
  238. });
  239. });
  240. };
  241. }
  242. var focusableElements = ['a[href]', 'area[href]', 'input:not([disabled]):not([type=hidden])', 'select:not([disabled])', 'textarea:not([disabled])', 'button:not([disabled])', 'object', 'embed', '[tabindex]:not(.modal)', 'audio[controls]', 'video[controls]', '[contenteditable]:not([contenteditable="false"])'];
  243. exports.focusableElements = focusableElements;