Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

242 строки
7.8 KiB

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