UNPKG

19.6 kBJavaScriptView Raw
1import {createElement as $hgUW1$createElement, Component as $hgUW1$Component} from "react";
2
3var $parcel$global =
4typeof globalThis !== 'undefined'
5 ? globalThis
6 : typeof self !== 'undefined'
7 ? self
8 : typeof window !== 'undefined'
9 ? window
10 : typeof global !== 'undefined'
11 ? global
12 : {};
13
14var $3e40d2fd7fdb47d2$exports = {};
15/**
16 * Detect Element Resize.
17 * https://github.com/sdecima/javascript-detect-element-resize
18 * Sebastian Decima
19 *
20 * Forked from version 0.5.3; includes the following modifications:
21 * 1) Guard against unsafe 'window' and 'document' references (to support SSR).
22 * 2) Defer initialization code via a top-level function wrapper (to support SSR).
23 * 3) Avoid unnecessary reflows by not measuring size for scroll events bubbling from children.
24 * 4) Add nonce for style element.
25 **/ // Check `document` and `window` in case of server-side rendering
26let $3e40d2fd7fdb47d2$var$windowObject;
27if (typeof window !== "undefined") $3e40d2fd7fdb47d2$var$windowObject = window;
28else if (typeof self !== "undefined") // eslint-disable-next-line no-restricted-globals
29$3e40d2fd7fdb47d2$var$windowObject = self;
30else $3e40d2fd7fdb47d2$var$windowObject = $parcel$global;
31let $3e40d2fd7fdb47d2$var$cancelFrame = null;
32let $3e40d2fd7fdb47d2$var$requestFrame = null;
33const $3e40d2fd7fdb47d2$var$TIMEOUT_DURATION = 20;
34const $3e40d2fd7fdb47d2$var$clearTimeoutFn = $3e40d2fd7fdb47d2$var$windowObject.clearTimeout;
35const $3e40d2fd7fdb47d2$var$setTimeoutFn = $3e40d2fd7fdb47d2$var$windowObject.setTimeout;
36const $3e40d2fd7fdb47d2$var$cancelAnimationFrameFn = $3e40d2fd7fdb47d2$var$windowObject.cancelAnimationFrame || $3e40d2fd7fdb47d2$var$windowObject.mozCancelAnimationFrame || $3e40d2fd7fdb47d2$var$windowObject.webkitCancelAnimationFrame;
37const $3e40d2fd7fdb47d2$var$requestAnimationFrameFn = $3e40d2fd7fdb47d2$var$windowObject.requestAnimationFrame || $3e40d2fd7fdb47d2$var$windowObject.mozRequestAnimationFrame || $3e40d2fd7fdb47d2$var$windowObject.webkitRequestAnimationFrame;
38if ($3e40d2fd7fdb47d2$var$cancelAnimationFrameFn == null || $3e40d2fd7fdb47d2$var$requestAnimationFrameFn == null) {
39 // For environments that don't support animation frame,
40 // fallback to a setTimeout based approach.
41 $3e40d2fd7fdb47d2$var$cancelFrame = $3e40d2fd7fdb47d2$var$clearTimeoutFn;
42 $3e40d2fd7fdb47d2$var$requestFrame = function requestAnimationFrameViaSetTimeout(callback) {
43 return $3e40d2fd7fdb47d2$var$setTimeoutFn(callback, $3e40d2fd7fdb47d2$var$TIMEOUT_DURATION);
44 };
45} else {
46 // Counter intuitively, environments that support animation frames can be trickier.
47 // Chrome's "Throttle non-visible cross-origin iframes" flag can prevent rAFs from being called.
48 // In this case, we should fallback to a setTimeout() implementation.
49 $3e40d2fd7fdb47d2$var$cancelFrame = function cancelFrame([animationFrameID, timeoutID]) {
50 $3e40d2fd7fdb47d2$var$cancelAnimationFrameFn(animationFrameID);
51 $3e40d2fd7fdb47d2$var$clearTimeoutFn(timeoutID);
52 };
53 $3e40d2fd7fdb47d2$var$requestFrame = function requestAnimationFrameWithSetTimeoutFallback(callback) {
54 const animationFrameID = $3e40d2fd7fdb47d2$var$requestAnimationFrameFn(function animationFrameCallback() {
55 $3e40d2fd7fdb47d2$var$clearTimeoutFn(timeoutID);
56 callback();
57 });
58 const timeoutID = $3e40d2fd7fdb47d2$var$setTimeoutFn(function timeoutCallback() {
59 $3e40d2fd7fdb47d2$var$cancelAnimationFrameFn(animationFrameID);
60 callback();
61 }, $3e40d2fd7fdb47d2$var$TIMEOUT_DURATION);
62 return [
63 animationFrameID,
64 timeoutID
65 ];
66 };
67}
68function $3e40d2fd7fdb47d2$var$createDetectElementResize(nonce) {
69 let animationKeyframes;
70 let animationName;
71 let animationStartEvent;
72 let animationStyle;
73 let checkTriggers;
74 let resetTriggers;
75 let scrollListener;
76 const attachEvent = typeof document !== "undefined" && document.attachEvent;
77 if (!attachEvent) {
78 resetTriggers = function(element) {
79 const triggers = element.__resizeTriggers__, expand = triggers.firstElementChild, contract = triggers.lastElementChild, expandChild = expand.firstElementChild;
80 contract.scrollLeft = contract.scrollWidth;
81 contract.scrollTop = contract.scrollHeight;
82 expandChild.style.width = expand.offsetWidth + 1 + "px";
83 expandChild.style.height = expand.offsetHeight + 1 + "px";
84 expand.scrollLeft = expand.scrollWidth;
85 expand.scrollTop = expand.scrollHeight;
86 };
87 checkTriggers = function(element) {
88 return element.offsetWidth !== element.__resizeLast__.width || element.offsetHeight !== element.__resizeLast__.height;
89 };
90 scrollListener = function(e) {
91 // Don't measure (which forces) reflow for scrolls that happen inside of children!
92 if (e.target.className && typeof e.target.className.indexOf === "function" && e.target.className.indexOf("contract-trigger") < 0 && e.target.className.indexOf("expand-trigger") < 0) return;
93 const element = this;
94 resetTriggers(this);
95 if (this.__resizeRAF__) $3e40d2fd7fdb47d2$var$cancelFrame(this.__resizeRAF__);
96 this.__resizeRAF__ = $3e40d2fd7fdb47d2$var$requestFrame(function animationFrame() {
97 if (checkTriggers(element)) {
98 element.__resizeLast__.width = element.offsetWidth;
99 element.__resizeLast__.height = element.offsetHeight;
100 element.__resizeListeners__.forEach(function forEachResizeListener(fn) {
101 fn.call(element, e);
102 });
103 }
104 });
105 };
106 /* Detect CSS Animations support to detect element display/re-attach */ let animation = false;
107 let keyframeprefix = "";
108 animationStartEvent = "animationstart";
109 const domPrefixes = "Webkit Moz O ms".split(" ");
110 let startEvents = "webkitAnimationStart animationstart oAnimationStart MSAnimationStart".split(" ");
111 let pfx = "";
112 {
113 const elm = document.createElement("fakeelement");
114 if (elm.style.animationName !== undefined) animation = true;
115 if (animation === false) {
116 for(let i = 0; i < domPrefixes.length; i++)if (elm.style[domPrefixes[i] + "AnimationName"] !== undefined) {
117 pfx = domPrefixes[i];
118 keyframeprefix = "-" + pfx.toLowerCase() + "-";
119 animationStartEvent = startEvents[i];
120 animation = true;
121 break;
122 }
123 }
124 }
125 animationName = "resizeanim";
126 animationKeyframes = "@" + keyframeprefix + "keyframes " + animationName + " { from { opacity: 0; } to { opacity: 0; } } ";
127 animationStyle = keyframeprefix + "animation: 1ms " + animationName + "; ";
128 }
129 const createStyles = function(doc) {
130 if (!doc.getElementById("detectElementResize")) {
131 //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360
132 const css = (animationKeyframes ? animationKeyframes : "") + ".resize-triggers { " + (animationStyle ? animationStyle : "") + "visibility: hidden; opacity: 0; } " + '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: " "; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; z-index: -1; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }', head = doc.head || doc.getElementsByTagName("head")[0], style = doc.createElement("style");
133 style.id = "detectElementResize";
134 style.type = "text/css";
135 if (nonce != null) style.setAttribute("nonce", nonce);
136 if (style.styleSheet) style.styleSheet.cssText = css;
137 else style.appendChild(doc.createTextNode(css));
138 head.appendChild(style);
139 }
140 };
141 const addResizeListener = function(element, fn) {
142 if (attachEvent) element.attachEvent("onresize", fn);
143 else {
144 if (!element.__resizeTriggers__) {
145 const doc = element.ownerDocument;
146 const elementStyle = $3e40d2fd7fdb47d2$var$windowObject.getComputedStyle(element);
147 if (elementStyle && elementStyle.position === "static") element.style.position = "relative";
148 createStyles(doc);
149 element.__resizeLast__ = {};
150 element.__resizeListeners__ = [];
151 (element.__resizeTriggers__ = doc.createElement("div")).className = "resize-triggers";
152 const expandTrigger = doc.createElement("div");
153 expandTrigger.className = "expand-trigger";
154 expandTrigger.appendChild(doc.createElement("div"));
155 const contractTrigger = doc.createElement("div");
156 contractTrigger.className = "contract-trigger";
157 element.__resizeTriggers__.appendChild(expandTrigger);
158 element.__resizeTriggers__.appendChild(contractTrigger);
159 element.appendChild(element.__resizeTriggers__);
160 resetTriggers(element);
161 element.addEventListener("scroll", scrollListener, true);
162 /* Listen for a css animation to detect element display/re-attach */ if (animationStartEvent) {
163 element.__resizeTriggers__.__animationListener__ = function animationListener(e) {
164 if (e.animationName === animationName) resetTriggers(element);
165 };
166 element.__resizeTriggers__.addEventListener(animationStartEvent, element.__resizeTriggers__.__animationListener__);
167 }
168 }
169 element.__resizeListeners__.push(fn);
170 }
171 };
172 const removeResizeListener = function(element, fn) {
173 if (attachEvent) element.detachEvent("onresize", fn);
174 else {
175 element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
176 if (!element.__resizeListeners__.length) {
177 element.removeEventListener("scroll", scrollListener, true);
178 if (element.__resizeTriggers__.__animationListener__) {
179 element.__resizeTriggers__.removeEventListener(animationStartEvent, element.__resizeTriggers__.__animationListener__);
180 element.__resizeTriggers__.__animationListener__ = null;
181 }
182 try {
183 element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);
184 } catch (e) {
185 // Preact compat; see developit/preact-compat/issues/228
186 }
187 }
188 }
189 };
190 return {
191 addResizeListener: addResizeListener,
192 removeResizeListener: removeResizeListener
193 };
194}
195$3e40d2fd7fdb47d2$exports = {
196 createDetectElementResize: $3e40d2fd7fdb47d2$var$createDetectElementResize
197};
198
199
200function $6e2bb92d9db3b0c8$var$_defineProperty(obj, key, value) {
201 key = $6e2bb92d9db3b0c8$var$_toPropertyKey(key);
202 if (key in obj) Object.defineProperty(obj, key, {
203 value: value,
204 enumerable: true,
205 configurable: true,
206 writable: true
207 });
208 else obj[key] = value;
209 return obj;
210}
211function $6e2bb92d9db3b0c8$var$_toPropertyKey(arg) {
212 var key = $6e2bb92d9db3b0c8$var$_toPrimitive(arg, "string");
213 return typeof key === "symbol" ? key : String(key);
214}
215function $6e2bb92d9db3b0c8$var$_toPrimitive(input, hint) {
216 if (typeof input !== "object" || input === null) return input;
217 var prim = input[Symbol.toPrimitive];
218 if (prim !== undefined) {
219 var res = prim.call(input, hint || "default");
220 if (typeof res !== "object") return res;
221 throw new TypeError("@@toPrimitive must return a primitive value.");
222 }
223 return (hint === "string" ? String : Number)(input);
224}
225class $6e2bb92d9db3b0c8$export$9d94f4ee1d930ff extends (0, $hgUW1$Component) {
226 constructor(...args){
227 super(...args);
228 $6e2bb92d9db3b0c8$var$_defineProperty(this, "state", {
229 height: this.props.defaultHeight || 0,
230 scaledHeight: this.props.defaultHeight || 0,
231 scaledWidth: this.props.defaultWidth || 0,
232 width: this.props.defaultWidth || 0
233 });
234 $6e2bb92d9db3b0c8$var$_defineProperty(this, "_autoSizer", null);
235 $6e2bb92d9db3b0c8$var$_defineProperty(this, "_detectElementResize", null);
236 $6e2bb92d9db3b0c8$var$_defineProperty(this, "_parentNode", null);
237 $6e2bb92d9db3b0c8$var$_defineProperty(this, "_resizeObserver", null);
238 $6e2bb92d9db3b0c8$var$_defineProperty(this, "_onResize", ()=>{
239 const { disableHeight: disableHeight , disableWidth: disableWidth , onResize: onResize } = this.props;
240 if (this._parentNode) {
241 var _style$paddingLeft, _style$paddingRight, _style$paddingTop, _style$paddingBottom;
242 // Guard against AutoSizer component being removed from the DOM immediately after being added.
243 // This can result in invalid style values which can result in NaN values if we don't handle them.
244 // See issue #150 for more context.
245 const style = window.getComputedStyle(this._parentNode) || {};
246 const paddingLeft = parseInt((_style$paddingLeft = style.paddingLeft) !== null && _style$paddingLeft !== void 0 ? _style$paddingLeft : "0", 10);
247 const paddingRight = parseInt((_style$paddingRight = style.paddingRight) !== null && _style$paddingRight !== void 0 ? _style$paddingRight : "0", 10);
248 const paddingTop = parseInt((_style$paddingTop = style.paddingTop) !== null && _style$paddingTop !== void 0 ? _style$paddingTop : "0", 10);
249 const paddingBottom = parseInt((_style$paddingBottom = style.paddingBottom) !== null && _style$paddingBottom !== void 0 ? _style$paddingBottom : "0", 10);
250 const rect = this._parentNode.getBoundingClientRect();
251 const scaledHeight = rect.height - paddingTop - paddingBottom;
252 const scaledWidth = rect.width - paddingLeft - paddingRight;
253 const height = this._parentNode.offsetHeight - paddingTop - paddingBottom;
254 const width = this._parentNode.offsetWidth - paddingLeft - paddingRight;
255 if (!disableHeight && (this.state.height !== height || this.state.scaledHeight !== scaledHeight) || !disableWidth && (this.state.width !== width || this.state.scaledWidth !== scaledWidth)) {
256 this.setState({
257 height: height,
258 width: width,
259 scaledHeight: scaledHeight,
260 scaledWidth: scaledWidth
261 });
262 if (typeof onResize === "function") onResize({
263 height: height,
264 scaledHeight: scaledHeight,
265 scaledWidth: scaledWidth,
266 width: width
267 });
268 }
269 }
270 });
271 $6e2bb92d9db3b0c8$var$_defineProperty(this, "_setRef", (autoSizer)=>{
272 this._autoSizer = autoSizer;
273 });
274 }
275 componentDidMount() {
276 const { nonce: nonce } = this.props;
277 if (this._autoSizer && this._autoSizer.parentNode && this._autoSizer.parentNode.ownerDocument && this._autoSizer.parentNode.ownerDocument.defaultView && this._autoSizer.parentNode instanceof this._autoSizer.parentNode.ownerDocument.defaultView.HTMLElement) {
278 // Delay access of parentNode until mount.
279 // This handles edge-cases where the component has already been unmounted before its ref has been set,
280 // As well as libraries like react-lite which have a slightly different lifecycle.
281 this._parentNode = this._autoSizer.parentNode;
282 // Defer requiring resize handler in order to support server-side rendering.
283 // See issue #41
284 if (this._parentNode != null) {
285 if (typeof ResizeObserver !== "undefined") {
286 this._resizeObserver = new ResizeObserver(()=>{
287 // Guard against "ResizeObserver loop limit exceeded" error;
288 // could be triggered if the state update causes the ResizeObserver handler to run long.
289 // See https://github.com/bvaughn/react-virtualized-auto-sizer/issues/55
290 setTimeout(this._onResize, 0);
291 });
292 this._resizeObserver.observe(this._parentNode);
293 } else {
294 this._detectElementResize = (0, $3e40d2fd7fdb47d2$exports.createDetectElementResize)(nonce);
295 this._detectElementResize.addResizeListener(this._parentNode, this._onResize);
296 }
297 this._onResize();
298 }
299 }
300 }
301 componentWillUnmount() {
302 if (this._parentNode) {
303 if (this._detectElementResize) this._detectElementResize.removeResizeListener(this._parentNode, this._onResize);
304 if (this._resizeObserver) {
305 this._resizeObserver.observe(this._parentNode);
306 this._resizeObserver.disconnect();
307 }
308 }
309 }
310 render() {
311 const { children: children , defaultHeight: defaultHeight , defaultWidth: defaultWidth , disableHeight: disableHeight , disableWidth: disableWidth , nonce: nonce , onResize: onResize , style: style , tagName: tagName = "div" , ...rest } = this.props;
312 const { height: height , scaledHeight: scaledHeight , scaledWidth: scaledWidth , width: width } = this.state;
313 // Outer div should not force width/height since that may prevent containers from shrinking.
314 // Inner component should overflow and use calculated width/height.
315 // See issue #68 for more information.
316 const outerStyle = {
317 overflow: "visible"
318 };
319 const childParams = {};
320 // Avoid rendering children before the initial measurements have been collected.
321 // At best this would just be wasting cycles.
322 let bailoutOnChildren = false;
323 if (!disableHeight) {
324 if (height === 0) bailoutOnChildren = true;
325 outerStyle.height = 0;
326 childParams.height = height;
327 childParams.scaledHeight = scaledHeight;
328 }
329 if (!disableWidth) {
330 if (width === 0) bailoutOnChildren = true;
331 outerStyle.width = 0;
332 childParams.width = width;
333 childParams.scaledWidth = scaledWidth;
334 }
335 return (0, $hgUW1$createElement)(tagName, {
336 ref: this._setRef,
337 style: {
338 ...outerStyle,
339 ...style
340 },
341 ...rest
342 }, !bailoutOnChildren && children(childParams));
343 }
344}
345$6e2bb92d9db3b0c8$var$_defineProperty($6e2bb92d9db3b0c8$export$9d94f4ee1d930ff, "defaultProps", {
346 onResize: ()=>{},
347 disableHeight: false,
348 disableWidth: false,
349 style: {}
350});
351
352
353var $149c1bd638913645$export$2e2bcd8739ae039 = (0, $6e2bb92d9db3b0c8$export$9d94f4ee1d930ff);
354
355
356export {$149c1bd638913645$export$2e2bcd8739ae039 as default};
357//# sourceMappingURL=react-virtualized-auto-sizer.module.js.map