virtua 0.52.10 → 0.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +286 -193
- package/lib/angular/VList.d.ts +3 -1
- package/lib/angular/VMasonry.d.ts +119 -0
- package/lib/angular/Virtualizer.d.ts +3 -1
- package/lib/angular/WindowVirtualizer.d.ts +3 -1
- package/lib/angular/index.d.ts +1 -0
- package/lib/angular/index.js +732 -333
- package/lib/angular/index.js.map +1 -1
- package/lib/core/index.cjs +180 -104
- package/lib/core/index.cjs.map +1 -1
- package/lib/core/index.d.ts +1 -0
- package/lib/core/index.js +257 -181
- package/lib/core/index.js.map +1 -1
- package/lib/core/layouts/masonry.d.ts +1 -0
- package/lib/index.cjs +562 -385
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +579 -404
- package/lib/index.js.map +1 -1
- package/lib/react/VMasonry.d.ts +109 -0
- package/lib/react/Virtualizer.d.ts +3 -1
- package/lib/react/WindowVirtualizer.d.ts +3 -1
- package/lib/react/index.d.ts +2 -0
- package/lib/react/types.d.ts +1 -1
- package/lib/solid/VMasonry.d.ts +111 -0
- package/lib/solid/Virtualizer.d.ts +3 -1
- package/lib/solid/WindowVirtualizer.d.ts +3 -1
- package/lib/solid/index.cjs +726 -514
- package/lib/solid/index.cjs.map +1 -1
- package/lib/solid/index.d.ts +2 -0
- package/lib/solid/index.js +697 -494
- package/lib/solid/index.js.map +1 -1
- package/lib/solid/index.jsx +343 -8
- package/lib/solid/index.jsx.map +1 -1
- package/lib/solid/types.d.ts +1 -1
- package/lib/svelte/MasonryItem.svelte +49 -0
- package/lib/svelte/VGrid.svelte +1 -1
- package/lib/svelte/VList.svelte +1 -1
- package/lib/svelte/VMasonry.svelte +196 -0
- package/lib/svelte/VMasonry.type.d.ts +108 -0
- package/lib/svelte/Virtualizer.svelte +1 -1
- package/lib/svelte/Virtualizer.type.d.ts +3 -1
- package/lib/svelte/WindowVirtualizer.svelte +1 -1
- package/lib/svelte/WindowVirtualizer.type.d.ts +3 -1
- package/lib/svelte/index.d.ts +2 -0
- package/lib/svelte/index.js +2 -1
- package/lib/svelte/types.d.ts +2 -2
- package/lib/vue/VMasonry.d.ts +114 -0
- package/lib/vue/Virtualizer.d.ts +3 -1
- package/lib/vue/WindowVirtualizer.d.ts +3 -1
- package/lib/vue/index.cjs +632 -403
- package/lib/vue/index.cjs.map +1 -1
- package/lib/vue/index.d.ts +2 -0
- package/lib/vue/index.js +679 -455
- package/lib/vue/index.js.map +1 -1
- package/package.json +6 -16
package/lib/solid/index.jsx
CHANGED
|
@@ -903,6 +903,167 @@ var getBoxStyle = (from, to, inset, edge, zIndex) => {
|
|
|
903
903
|
return style;
|
|
904
904
|
};
|
|
905
905
|
|
|
906
|
+
//#endregion
|
|
907
|
+
//#region src/core/layouts/masonry.ts
|
|
908
|
+
var createMasonryLayout = (length, lanesOpt, gap = 0, itemSize, snapshot) => {
|
|
909
|
+
let lanes = max(lanesOpt, 1);
|
|
910
|
+
let nextLanes = lanes;
|
|
911
|
+
let nextGap = gap;
|
|
912
|
+
let defaultItemSize = snapshot && snapshot[1] || itemSize || 40;
|
|
913
|
+
let computedIndex = -1;
|
|
914
|
+
let estimatingIndexes = itemSize ? undefined : new Set();
|
|
915
|
+
let isEstimating = !itemSize;
|
|
916
|
+
const restoredSizes = snapshot && snapshot[0];
|
|
917
|
+
const sizes = restoredSizes ? fill(restoredSizes.slice(0, min(length, restoredSizes.length)), max(0, length - restoredSizes.length)) : fill([], length);
|
|
918
|
+
const offsets = [];
|
|
919
|
+
const laneIndexes = [];
|
|
920
|
+
const highs = [];
|
|
921
|
+
const getSize = (index) => {
|
|
922
|
+
const size = sizes[index];
|
|
923
|
+
return size === -1 ? defaultItemSize : size;
|
|
924
|
+
};
|
|
925
|
+
const compute = (index) => {
|
|
926
|
+
index = min(index, length - 1);
|
|
927
|
+
if (computedIndex >= index) return;
|
|
928
|
+
const bottoms = [];
|
|
929
|
+
const lastIndexes = [];
|
|
930
|
+
for (let l = 0; l < lanes; l++) {
|
|
931
|
+
bottoms.push(0);
|
|
932
|
+
lastIndexes.push(-1);
|
|
933
|
+
}
|
|
934
|
+
for (let j = computedIndex, remaining = lanes; j >= 0 && remaining; j--) {
|
|
935
|
+
const l = laneIndexes[j];
|
|
936
|
+
if (lastIndexes[l] === -1) {
|
|
937
|
+
lastIndexes[l] = j;
|
|
938
|
+
bottoms[l] = offsets[j] + getSize(j);
|
|
939
|
+
remaining--;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
while (computedIndex < index) {
|
|
943
|
+
const i = ++computedIndex;
|
|
944
|
+
let lane = 0;
|
|
945
|
+
let offset = Infinity;
|
|
946
|
+
let lastIndex = Infinity;
|
|
947
|
+
for (let l = 0; l < lanes; l++) {
|
|
948
|
+
const candidate = bottoms[l] + (lastIndexes[l] >= 0 ? gap : 0);
|
|
949
|
+
if (candidate < offset || candidate === offset && lastIndexes[l] < lastIndex) {
|
|
950
|
+
lane = l;
|
|
951
|
+
offset = candidate;
|
|
952
|
+
lastIndex = lastIndexes[l];
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
offsets[i] = offset;
|
|
956
|
+
laneIndexes[i] = lane;
|
|
957
|
+
bottoms[lane] = offset + getSize(i);
|
|
958
|
+
lastIndexes[lane] = i;
|
|
959
|
+
highs[i] = max(i ? highs[i - 1] : 0, bottoms[lane]);
|
|
960
|
+
}
|
|
961
|
+
};
|
|
962
|
+
const getOffset = (index) => {
|
|
963
|
+
if (index >= length) return getTotalSize();
|
|
964
|
+
compute(index);
|
|
965
|
+
return offsets[index];
|
|
966
|
+
};
|
|
967
|
+
const getHigh = (index) => {
|
|
968
|
+
compute(index);
|
|
969
|
+
return highs[index];
|
|
970
|
+
};
|
|
971
|
+
const getTotalSize = () => length ? getHigh(length - 1) : 0;
|
|
972
|
+
const findStart = (offset) => {
|
|
973
|
+
if (!length) return 0;
|
|
974
|
+
const index = findIndex(getHigh, length, offset);
|
|
975
|
+
return getHigh(index) <= offset ? index + 1 : index;
|
|
976
|
+
};
|
|
977
|
+
return {
|
|
978
|
+
$getRange: (startOffset, endOffset) => {
|
|
979
|
+
const end = findIndex(getOffset, length, endOffset);
|
|
980
|
+
return [min(findStart(startOffset), end), end];
|
|
981
|
+
},
|
|
982
|
+
$findIndex: (offset) => findIndex(getOffset, length, offset),
|
|
983
|
+
$getItemOffset: getOffset,
|
|
984
|
+
$getItemSize: getSize,
|
|
985
|
+
$isSizeEqual: (index, size = -1) => sizes[index] === size,
|
|
986
|
+
$resize: (resizes, shouldKeep, scrollOffset, viewportSize) => {
|
|
987
|
+
let anchorIndex = findStart(scrollOffset);
|
|
988
|
+
while (anchorIndex > 0 && !shouldKeep(anchorIndex - 1)) {
|
|
989
|
+
anchorIndex--;
|
|
990
|
+
}
|
|
991
|
+
while (anchorIndex < length && shouldKeep(anchorIndex)) {
|
|
992
|
+
anchorIndex++;
|
|
993
|
+
}
|
|
994
|
+
const prevAnchorOffset = getOffset(anchorIndex);
|
|
995
|
+
for (const [index, size] of resizes) {
|
|
996
|
+
sizes[index] = size;
|
|
997
|
+
estimatingIndexes && estimatingIndexes.add(index);
|
|
998
|
+
computedIndex = min(index - 1, computedIndex);
|
|
999
|
+
}
|
|
1000
|
+
let jump = getOffset(anchorIndex) - prevAnchorOffset;
|
|
1001
|
+
if (estimatingIndexes && viewportSize) {
|
|
1002
|
+
const measuredSizes = [];
|
|
1003
|
+
let totalMeasuredSize = 0;
|
|
1004
|
+
estimatingIndexes.forEach((index) => {
|
|
1005
|
+
const size = sizes[index];
|
|
1006
|
+
if (size > 0) {
|
|
1007
|
+
measuredSizes.push(size);
|
|
1008
|
+
totalMeasuredSize += size + gap;
|
|
1009
|
+
}
|
|
1010
|
+
});
|
|
1011
|
+
if (totalMeasuredSize > viewportSize * lanes) {
|
|
1012
|
+
sort(measuredSizes);
|
|
1013
|
+
const len = measuredSizes.length;
|
|
1014
|
+
const mid = len / 2 | 0;
|
|
1015
|
+
const median = len % 2 === 0 ? (measuredSizes[mid - 1] + measuredSizes[mid]) / 2 : measuredSizes[mid];
|
|
1016
|
+
const startIndex = findStart(scrollOffset + jump);
|
|
1017
|
+
const prevStartOffset = getOffset(startIndex);
|
|
1018
|
+
defaultItemSize = median;
|
|
1019
|
+
computedIndex = -1;
|
|
1020
|
+
jump += getOffset(startIndex) - prevStartOffset;
|
|
1021
|
+
estimatingIndexes = undefined;
|
|
1022
|
+
isEstimating = false;
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
return jump;
|
|
1026
|
+
},
|
|
1027
|
+
$getTotalSize: getTotalSize,
|
|
1028
|
+
$getLength: () => length,
|
|
1029
|
+
$setLength: (nextLength) => {
|
|
1030
|
+
const diff = nextLength - length;
|
|
1031
|
+
computedIndex = min(nextLength - 1, computedIndex);
|
|
1032
|
+
length = nextLength;
|
|
1033
|
+
if (diff > 0) {
|
|
1034
|
+
fill(sizes, diff);
|
|
1035
|
+
} else {
|
|
1036
|
+
sizes.splice(diff);
|
|
1037
|
+
}
|
|
1038
|
+
return 0;
|
|
1039
|
+
},
|
|
1040
|
+
$relayout: (_, scrollOffset) => {
|
|
1041
|
+
if (nextLanes === lanes && nextGap === gap) {
|
|
1042
|
+
return;
|
|
1043
|
+
}
|
|
1044
|
+
const startIndex = findStart(scrollOffset);
|
|
1045
|
+
const prevStartOffset = getOffset(startIndex);
|
|
1046
|
+
lanes = nextLanes;
|
|
1047
|
+
gap = nextGap;
|
|
1048
|
+
computedIndex = -1;
|
|
1049
|
+
estimatingIndexes = itemSize ? undefined : new Set();
|
|
1050
|
+
return getOffset(startIndex) - prevStartOffset;
|
|
1051
|
+
},
|
|
1052
|
+
$setOptions: (lanes, gap = 0) => {
|
|
1053
|
+
nextLanes = max(lanes, 1);
|
|
1054
|
+
nextGap = gap;
|
|
1055
|
+
},
|
|
1056
|
+
$isEstimating: () => isEstimating,
|
|
1057
|
+
$snapshot: () => [sizes.slice(), defaultItemSize],
|
|
1058
|
+
$getLanes: () => lanes,
|
|
1059
|
+
$getGap: () => gap,
|
|
1060
|
+
$getItemLane: (index) => {
|
|
1061
|
+
compute(index);
|
|
1062
|
+
return laneIndexes[index];
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
};
|
|
1066
|
+
|
|
906
1067
|
//#endregion
|
|
907
1068
|
//#region src/core/observer.ts
|
|
908
1069
|
var createResizeObserver = (cb) => {
|
|
@@ -1071,10 +1232,8 @@ var createScrollObserver = (store, viewport, scroller, isHorizontal, isRtl, onMo
|
|
|
1071
1232
|
};
|
|
1072
1233
|
if (smooth) {
|
|
1073
1234
|
store.$update(8, getTargetOffset());
|
|
1074
|
-
microtask(start);
|
|
1075
|
-
} else {
|
|
1076
|
-
start();
|
|
1077
1235
|
}
|
|
1236
|
+
start();
|
|
1078
1237
|
}
|
|
1079
1238
|
};
|
|
1080
1239
|
};
|
|
@@ -1279,9 +1438,8 @@ var createContainerGridDriver = (rowStore, colStore) => {
|
|
|
1279
1438
|
(isHorizontal ? colScrollObserver : rowScrollObserver)._scroll(getTargetOffset);
|
|
1280
1439
|
}
|
|
1281
1440
|
},
|
|
1282
|
-
$observe(containerElement) {
|
|
1283
|
-
|
|
1284
|
-
resizeObserver._observe(viewport);
|
|
1441
|
+
$observe(containerElement, viewport = containerElement.parentElement) {
|
|
1442
|
+
resizeObserver._observe(viewportElement = viewport);
|
|
1285
1443
|
const observe = (store, isHorizontal) => createScrollObserver(store, viewport, viewport, isHorizontal, isHorizontal && getComputedStyle(viewport).direction === "rtl", () => {
|
|
1286
1444
|
const overflowKey = isHorizontal ? "overflowX" : "overflowY";
|
|
1287
1445
|
const style = viewport.style;
|
|
@@ -1602,7 +1760,7 @@ var VList = (props) => {
|
|
|
1602
1760
|
"style"
|
|
1603
1761
|
]);
|
|
1604
1762
|
return <div {...others} style={{
|
|
1605
|
-
display:
|
|
1763
|
+
display: "block",
|
|
1606
1764
|
[local.horizontal ? "overflow-x" : "overflow-y"]: "auto",
|
|
1607
1765
|
contain: "strict",
|
|
1608
1766
|
width: "100%",
|
|
@@ -1918,5 +2076,182 @@ var VGrid = (props) => {
|
|
|
1918
2076
|
};
|
|
1919
2077
|
|
|
1920
2078
|
//#endregion
|
|
1921
|
-
|
|
2079
|
+
//#region src/solid/VMasonry.tsx
|
|
2080
|
+
var toCrossValue = (fraction, px) => px ? `calc(${fraction * 100}% + ${px}px)` : fraction * 100 + "%";
|
|
2081
|
+
var MasonryItem = (props) => {
|
|
2082
|
+
let elementRef;
|
|
2083
|
+
createEffect(() => {
|
|
2084
|
+
if (!elementRef) return;
|
|
2085
|
+
onCleanup(props._resizer(elementRef, props._index));
|
|
2086
|
+
});
|
|
2087
|
+
const style = createMemo(() => ({
|
|
2088
|
+
contain: "layout style",
|
|
2089
|
+
position: "absolute",
|
|
2090
|
+
top: props._offset + "px",
|
|
2091
|
+
"inset-inline-start": props._crossOffset,
|
|
2092
|
+
width: props._crossSize,
|
|
2093
|
+
visibility: props._hide ? "hidden" : undefined
|
|
2094
|
+
}));
|
|
2095
|
+
return <div ref={elementRef} style={style()}>
|
|
2096
|
+
{props._children}
|
|
2097
|
+
</div>;
|
|
2098
|
+
};
|
|
2099
|
+
var VMasonry = (props) => {
|
|
2100
|
+
let containerRef;
|
|
2101
|
+
const { itemSize, cache } = props;
|
|
2102
|
+
const [, others] = splitProps(props, [
|
|
2103
|
+
"ref",
|
|
2104
|
+
"data",
|
|
2105
|
+
"children",
|
|
2106
|
+
"lanes",
|
|
2107
|
+
"gap",
|
|
2108
|
+
"itemSize",
|
|
2109
|
+
"bufferSize",
|
|
2110
|
+
"keepMounted",
|
|
2111
|
+
"cache",
|
|
2112
|
+
"onScroll",
|
|
2113
|
+
"onScrollEnd",
|
|
2114
|
+
"style"
|
|
2115
|
+
]);
|
|
2116
|
+
const layout = createMasonryLayout(props.data.length, props.lanes, props.gap, itemSize, cache);
|
|
2117
|
+
const store = createVirtualStore(layout);
|
|
2118
|
+
const driver = createContainerDriver(store, false);
|
|
2119
|
+
const [stateVersion, setRerender] = createSignal(store.$getStateVersion());
|
|
2120
|
+
store.$subscribe(1, () => {
|
|
2121
|
+
setRerender(store.$getStateVersion());
|
|
2122
|
+
});
|
|
2123
|
+
store.$subscribe(4, () => {
|
|
2124
|
+
props.onScroll?.(store.$getScrollOffset());
|
|
2125
|
+
});
|
|
2126
|
+
store.$subscribe(8, () => {
|
|
2127
|
+
props.onScrollEnd?.();
|
|
2128
|
+
});
|
|
2129
|
+
createComputed(() => {
|
|
2130
|
+
layout.$setOptions(props.lanes, props.gap);
|
|
2131
|
+
store.$update(9, undefined);
|
|
2132
|
+
});
|
|
2133
|
+
const range = createMemo((prev) => {
|
|
2134
|
+
stateVersion();
|
|
2135
|
+
const next = store.$getRange(props.bufferSize);
|
|
2136
|
+
if (prev && isSameRange(prev, next)) {
|
|
2137
|
+
return prev;
|
|
2138
|
+
}
|
|
2139
|
+
return next;
|
|
2140
|
+
});
|
|
2141
|
+
const isScrolling = createMemo(() => stateVersion() && store.$isScrolling());
|
|
2142
|
+
const totalSize = createMemo(() => stateVersion() && store.$getTotalSize());
|
|
2143
|
+
const lanes = createMemo(() => stateVersion() && layout.$getLanes());
|
|
2144
|
+
const gap = createMemo(() => stateVersion() && layout.$getGap());
|
|
2145
|
+
const crossSize = createMemo(() => toCrossValue(1 / lanes(), gap() / lanes() - gap()));
|
|
2146
|
+
const ref = props.ref;
|
|
2147
|
+
if (!isServer && ref) {
|
|
2148
|
+
ref({
|
|
2149
|
+
get cache() {
|
|
2150
|
+
return layout.$snapshot();
|
|
2151
|
+
},
|
|
2152
|
+
get scrollOffset() {
|
|
2153
|
+
return store.$getScrollOffset();
|
|
2154
|
+
},
|
|
2155
|
+
get scrollSize() {
|
|
2156
|
+
return getScrollSize(store);
|
|
2157
|
+
},
|
|
2158
|
+
get viewportSize() {
|
|
2159
|
+
return store.$getViewportSize();
|
|
2160
|
+
},
|
|
2161
|
+
getItemOffset: store.$getItemOffset,
|
|
2162
|
+
getItemSize: store.$getItemSize,
|
|
2163
|
+
scrollToIndex: (index, opts) => scrollToIndex(driver, store, index, opts),
|
|
2164
|
+
scrollTo: (offset) => scrollTo(driver, offset),
|
|
2165
|
+
scrollBy: (offset) => scrollBy(driver, store, offset)
|
|
2166
|
+
});
|
|
2167
|
+
onCleanup(() => ref());
|
|
2168
|
+
}
|
|
2169
|
+
onMount(() => {
|
|
2170
|
+
driver.$observe(containerRef);
|
|
2171
|
+
onCleanup(() => {
|
|
2172
|
+
store.$dispose();
|
|
2173
|
+
driver.$dispose();
|
|
2174
|
+
});
|
|
2175
|
+
});
|
|
2176
|
+
createEffect(on(stateVersion, () => {
|
|
2177
|
+
driver.$effect();
|
|
2178
|
+
}));
|
|
2179
|
+
const dataSlice = createMemo(() => {
|
|
2180
|
+
const count = props.data.length;
|
|
2181
|
+
untrack(() => {
|
|
2182
|
+
if (count !== store.$getItemsLength()) {
|
|
2183
|
+
store.$update(5, [count]);
|
|
2184
|
+
}
|
|
2185
|
+
});
|
|
2186
|
+
const items = [];
|
|
2187
|
+
const indexes = [];
|
|
2188
|
+
if (props.keepMounted) {
|
|
2189
|
+
const mounted = new Set(props.keepMounted);
|
|
2190
|
+
for (let [i, j] = range(); i <= j; i++) {
|
|
2191
|
+
mounted.add(i);
|
|
2192
|
+
}
|
|
2193
|
+
sort([...mounted]).forEach((index) => {
|
|
2194
|
+
if (index < count) {
|
|
2195
|
+
items.push(props.data[index]);
|
|
2196
|
+
indexes.push(index);
|
|
2197
|
+
}
|
|
2198
|
+
});
|
|
2199
|
+
} else {
|
|
2200
|
+
for (let [i, j] = range(); i <= j; i++) {
|
|
2201
|
+
items.push(props.data[i]);
|
|
2202
|
+
indexes.push(i);
|
|
2203
|
+
}
|
|
2204
|
+
}
|
|
2205
|
+
return {
|
|
2206
|
+
_items: items,
|
|
2207
|
+
_indexes: indexes
|
|
2208
|
+
};
|
|
2209
|
+
});
|
|
2210
|
+
const renderItem = (data, index) => {
|
|
2211
|
+
const offset = createMemo(() => {
|
|
2212
|
+
stateVersion();
|
|
2213
|
+
return store.$getItemOffset(index());
|
|
2214
|
+
});
|
|
2215
|
+
const lane = createMemo(() => {
|
|
2216
|
+
stateVersion();
|
|
2217
|
+
return layout.$getItemLane(index());
|
|
2218
|
+
});
|
|
2219
|
+
const hide = createMemo(() => {
|
|
2220
|
+
stateVersion();
|
|
2221
|
+
return store.$isUnmeasuredItem(index());
|
|
2222
|
+
});
|
|
2223
|
+
const children = createMemo(() => {
|
|
2224
|
+
return untrack(() => props.children(data, index));
|
|
2225
|
+
});
|
|
2226
|
+
return <MasonryItem _index={index()} _resizer={driver.$observeItem} _offset={offset()} _crossOffset={toCrossValue(lane() / lanes(), lane() * gap() / lanes())} _crossSize={crossSize()} _hide={hide()} _children={children()} />;
|
|
2227
|
+
};
|
|
2228
|
+
return <div {...others} style={{
|
|
2229
|
+
display: "block",
|
|
2230
|
+
"overflow-y": "auto",
|
|
2231
|
+
contain: "strict",
|
|
2232
|
+
width: "100%",
|
|
2233
|
+
height: "100%",
|
|
2234
|
+
...props.style
|
|
2235
|
+
}}>
|
|
2236
|
+
<div ref={containerRef} style={{
|
|
2237
|
+
contain: "size style",
|
|
2238
|
+
"overflow-anchor": "none",
|
|
2239
|
+
flex: "none",
|
|
2240
|
+
position: "relative",
|
|
2241
|
+
width: "100%",
|
|
2242
|
+
height: totalSize() + "px",
|
|
2243
|
+
"pointer-events": isScrolling() ? "none" : undefined
|
|
2244
|
+
}}>
|
|
2245
|
+
<For each={dataSlice()._items}>
|
|
2246
|
+
{(data, index) => {
|
|
2247
|
+
const itemIndex = createMemo(() => dataSlice()._indexes[index()]);
|
|
2248
|
+
return renderItem(data, itemIndex);
|
|
2249
|
+
}}
|
|
2250
|
+
</For>
|
|
2251
|
+
</div>
|
|
2252
|
+
</div>;
|
|
2253
|
+
};
|
|
2254
|
+
|
|
2255
|
+
//#endregion
|
|
2256
|
+
export { VGrid, VList, VMasonry, Virtualizer, WindowVirtualizer };
|
|
1922
2257
|
//# sourceMappingURL=index.jsx.map
|