UNPKG

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