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

204 строки
5.4 KiB

  1. // ==============================
  2. // NO OP
  3. // ==============================
  4. var noop = function noop() {};
  5. // Class Name Prefixer
  6. // ==============================
  7. /**
  8. String representation of component state for styling with class names.
  9. Expects an array of strings OR a string/object pair:
  10. - className(['comp', 'comp-arg', 'comp-arg-2'])
  11. @returns 'react-select__comp react-select__comp-arg react-select__comp-arg-2'
  12. - className('comp', { some: true, state: false })
  13. @returns 'react-select__comp react-select__comp--some'
  14. */
  15. function applyPrefixToName(prefix, name) {
  16. if (!name) {
  17. return prefix;
  18. } else if (name[0] === '-') {
  19. return prefix + name;
  20. } else {
  21. return prefix + '__' + name;
  22. }
  23. }
  24. function classNames(prefix, state, className) {
  25. var arr = [className];
  26. if (state && prefix) {
  27. for (var key in state) {
  28. if (state.hasOwnProperty(key) && state[key]) {
  29. arr.push("" + applyPrefixToName(prefix, key));
  30. }
  31. }
  32. }
  33. return arr.filter(function (i) {
  34. return i;
  35. }).map(function (i) {
  36. return String(i).trim();
  37. }).join(' ');
  38. } // ==============================
  39. // Clean Value
  40. // ==============================
  41. var cleanValue = function cleanValue(value) {
  42. if (Array.isArray(value)) return value.filter(Boolean);
  43. if (typeof value === 'object' && value !== null) return [value];
  44. return [];
  45. }; // ==============================
  46. // Handle Input Change
  47. // ==============================
  48. function handleInputChange(inputValue, actionMeta, onInputChange) {
  49. if (onInputChange) {
  50. var newValue = onInputChange(inputValue, actionMeta);
  51. if (typeof newValue === 'string') return newValue;
  52. }
  53. return inputValue;
  54. } // ==============================
  55. // Scroll Helpers
  56. // ==============================
  57. function isDocumentElement(el) {
  58. return [document.documentElement, document.body, window].indexOf(el) > -1;
  59. } // Normalized Scroll Top
  60. // ------------------------------
  61. function getScrollTop(el) {
  62. if (isDocumentElement(el)) {
  63. return window.pageYOffset;
  64. }
  65. return el.scrollTop;
  66. }
  67. function scrollTo(el, top) {
  68. // with a scroll distance, we perform scroll on the element
  69. if (isDocumentElement(el)) {
  70. window.scrollTo(0, top);
  71. return;
  72. }
  73. el.scrollTop = top;
  74. } // Get Scroll Parent
  75. // ------------------------------
  76. function getScrollParent(element) {
  77. var style = getComputedStyle(element);
  78. var excludeStaticParent = style.position === 'absolute';
  79. var overflowRx = /(auto|scroll)/;
  80. var docEl = document.documentElement; // suck it, flow...
  81. if (style.position === 'fixed') return docEl;
  82. for (var parent = element; parent = parent.parentElement;) {
  83. style = getComputedStyle(parent);
  84. if (excludeStaticParent && style.position === 'static') {
  85. continue;
  86. }
  87. if (overflowRx.test(style.overflow + style.overflowY + style.overflowX)) {
  88. return parent;
  89. }
  90. }
  91. return docEl;
  92. } // Animated Scroll To
  93. // ------------------------------
  94. /**
  95. @param t: time (elapsed)
  96. @param b: initial value
  97. @param c: amount of change
  98. @param d: duration
  99. */
  100. function easeOutCubic(t, b, c, d) {
  101. return c * ((t = t / d - 1) * t * t + 1) + b;
  102. }
  103. function animatedScrollTo(element, to, duration, callback) {
  104. if (duration === void 0) {
  105. duration = 200;
  106. }
  107. if (callback === void 0) {
  108. callback = noop;
  109. }
  110. var start = getScrollTop(element);
  111. var change = to - start;
  112. var increment = 10;
  113. var currentTime = 0;
  114. function animateScroll() {
  115. currentTime += increment;
  116. var val = easeOutCubic(currentTime, start, change, duration);
  117. scrollTo(element, val);
  118. if (currentTime < duration) {
  119. window.requestAnimationFrame(animateScroll);
  120. } else {
  121. callback(element);
  122. }
  123. }
  124. animateScroll();
  125. } // Scroll Into View
  126. // ------------------------------
  127. function scrollIntoView(menuEl, focusedEl) {
  128. var menuRect = menuEl.getBoundingClientRect();
  129. var focusedRect = focusedEl.getBoundingClientRect();
  130. var overScroll = focusedEl.offsetHeight / 3;
  131. if (focusedRect.bottom + overScroll > menuRect.bottom) {
  132. scrollTo(menuEl, Math.min(focusedEl.offsetTop + focusedEl.clientHeight - menuEl.offsetHeight + overScroll, menuEl.scrollHeight));
  133. } else if (focusedRect.top - overScroll < menuRect.top) {
  134. scrollTo(menuEl, Math.max(focusedEl.offsetTop - overScroll, 0));
  135. }
  136. } // ==============================
  137. // Get bounding client object
  138. // ==============================
  139. // cannot get keys using array notation with DOMRect
  140. function getBoundingClientObj(element) {
  141. var rect = element.getBoundingClientRect();
  142. return {
  143. bottom: rect.bottom,
  144. height: rect.height,
  145. left: rect.left,
  146. right: rect.right,
  147. top: rect.top,
  148. width: rect.width
  149. };
  150. }
  151. // Touch Capability Detector
  152. // ==============================
  153. function isTouchCapable() {
  154. try {
  155. document.createEvent('TouchEvent');
  156. return true;
  157. } catch (e) {
  158. return false;
  159. }
  160. } // ==============================
  161. // Mobile Device Detector
  162. // ==============================
  163. function isMobileDevice() {
  164. try {
  165. return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
  166. } catch (e) {
  167. return false;
  168. }
  169. }
  170. export { getScrollParent as a, getScrollTop as b, animatedScrollTo as c, isMobileDevice as d, cleanValue as e, scrollIntoView as f, getBoundingClientObj as g, classNames as h, isTouchCapable as i, isDocumentElement as j, handleInputChange as k, noop as n, scrollTo as s };