@jbrowse/core 2.4.0 → 2.4.2
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/BaseFeatureWidget/BaseFeatureDetail.d.ts +1 -3
- package/BaseFeatureWidget/BaseFeatureDetail.js +13 -9
- package/BaseFeatureWidget/SequenceFeatureDetails.js +3 -10
- package/BaseFeatureWidget/SequencePanel.js +1 -1
- package/BaseFeatureWidget/index.d.ts +1 -1
- package/BaseFeatureWidget/index.js +8 -11
- package/PluginLoader.js +8 -8
- package/PluginManager.d.ts +2 -4
- package/PluginManager.js +2 -3
- package/ReExports/Attributes.d.ts +1 -2
- package/ReExports/Attributes.js +4 -3
- package/ReExports/BaseCard.d.ts +1 -2
- package/ReExports/BaseCard.js +4 -3
- package/ReExports/DataGrid.d.ts +1 -2
- package/ReExports/DataGrid.js +2 -2
- package/ReExports/FeatureDetails.d.ts +1 -2
- package/ReExports/FeatureDetails.js +4 -3
- package/ReExports/index.d.ts +1 -2
- package/ReExports/index.js +3 -2
- package/ReExports/modules.d.ts +2 -4
- package/ReExports/modules.js +2 -2
- package/assemblyManager/assembly.js +5 -5
- package/assemblyManager/assemblyConfigSchema.js +2 -2
- package/configuration/configurationSchema.d.ts +3 -1
- package/configuration/configurationSchema.js +1 -1
- package/configuration/configurationSlot.d.ts +1 -0
- package/configuration/util.js +1 -1
- package/data_adapters/BaseAdapter.js +1 -1
- package/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/data_adapters/dataAdapterCache.d.ts +3 -2
- package/data_adapters/dataAdapterCache.js +2 -3
- package/package.json +2 -3
- package/pluggableElementTypes/RpcMethodType.js +1 -1
- package/pluggableElementTypes/index.d.ts +11 -1
- package/pluggableElementTypes/index.js +23 -23
- package/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -2
- package/pluggableElementTypes/models/BaseTrackModel.js +8 -13
- package/pluggableElementTypes/models/baseTrackConfig.js +1 -1
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +2 -2
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +1 -3
- package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
- package/pluggableElementTypes/renderers/index.d.ts +7 -9
- package/pluggableElementTypes/renderers/index.js +15 -15
- package/pluggableElementTypes/renderers/util/serializableFilterChain.js +1 -1
- package/rpc/BaseRpcDriver.js +7 -8
- package/rpc/WebWorkerRpcDriver.js +18 -12
- package/rpc/coreRpcMethods.d.ts +9 -11
- package/rpc/coreRpcMethods.js +17 -17
- package/rpc/methods/CoreGetFeatureDetails.js +1 -1
- package/rpc/methods/util.d.ts +2 -2
- package/rpc/methods/util.js +2 -2
- package/rpc/remoteAbortSignals.js +0 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/App.js +1 -1
- package/ui/AppLogo.js +1 -6
- package/ui/ColorPicker.js +1 -1
- package/ui/Dialog.js +1 -1
- package/ui/DrawerWidget.js +4 -4
- package/ui/EditableTypography.js +1 -1
- package/ui/FileSelector/FileSelector.d.ts +2 -2
- package/ui/FileSelector/FileSelector.js +24 -35
- package/ui/FileSelector/index.d.ts +1 -2
- package/ui/FileSelector/index.js +3 -2
- package/ui/LoadingEllipses.js +4 -4
- package/ui/Menu.js +45 -32
- package/ui/ResizeBar.js +6 -1
- package/ui/ResizeHandle.js +3 -6
- package/ui/ViewContainer.d.ts +2 -3
- package/ui/ViewContainer.js +7 -41
- package/ui/ViewContainerTitle.d.ts +6 -0
- package/ui/ViewContainerTitle.js +42 -0
- package/ui/theme.js +7 -7
- package/util/Base1DUtils.js +16 -14
- package/util/Base1DViewModel.d.ts +1 -1
- package/util/Base1DViewModel.js +9 -8
- package/util/aborting.js +1 -1
- package/util/analytics.js +1 -1
- package/util/blockTypes.js +10 -10
- package/util/color/index.d.ts +1 -2
- package/util/color/index.js +4 -3
- package/util/idMaker.js +5 -8
- package/util/index.d.ts +11 -9
- package/util/index.js +42 -50
- package/util/io/RemoteFileWithRangeCache.js +2 -2
- package/util/io/index.d.ts +4 -3
- package/util/io/index.js +14 -9
- package/util/jexl.js +3 -1
- package/util/layouts/GranularRectLayout.js +10 -4
- package/util/layouts/MultiLayout.js +1 -1
- package/util/layouts/SceneGraph.js +3 -7
- package/util/mst-reflection.d.ts +12 -17
- package/util/mst-reflection.js +13 -12
- package/util/offscreenCanvasPonyfill.js +4 -3
- package/util/offscreenCanvasUtils.js +1 -0
- package/util/tracks.d.ts +1 -1
- package/util/tracks.js +0 -1
- package/util/types/index.d.ts +2 -1
- package/util/types/index.js +3 -3
- package/util/types/mst.js +3 -3
- package/util/useMeasure.d.ts +5 -0
- package/util/useMeasure.js +34 -0
|
@@ -64,7 +64,7 @@ class LayoutRow {
|
|
|
64
64
|
offset: left - rectWidth,
|
|
65
65
|
min: left,
|
|
66
66
|
max: right,
|
|
67
|
-
bits:
|
|
67
|
+
bits: Array.from({ length: 3 * rectWidth }),
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
addRect(rect, data) {
|
|
@@ -85,7 +85,10 @@ class LayoutRow {
|
|
|
85
85
|
this.rowState = this.initialize(left, right);
|
|
86
86
|
}
|
|
87
87
|
else if (additionalLength > 0) {
|
|
88
|
-
this.rowState.bits =
|
|
88
|
+
this.rowState.bits = [
|
|
89
|
+
...this.rowState.bits,
|
|
90
|
+
...Array.from({ length: additionalLength }),
|
|
91
|
+
];
|
|
89
92
|
}
|
|
90
93
|
}
|
|
91
94
|
// expand leftward if necessary
|
|
@@ -97,7 +100,10 @@ class LayoutRow {
|
|
|
97
100
|
this.rowState = this.initialize(left, right);
|
|
98
101
|
}
|
|
99
102
|
else {
|
|
100
|
-
this.rowState.bits =
|
|
103
|
+
this.rowState.bits = [
|
|
104
|
+
...Array.from({ length: additionalLength }),
|
|
105
|
+
...this.rowState.bits,
|
|
106
|
+
];
|
|
101
107
|
this.rowState.offset -= additionalLength;
|
|
102
108
|
}
|
|
103
109
|
}
|
|
@@ -370,7 +376,7 @@ class GranularRectLayout {
|
|
|
370
376
|
return this.getTotalHeight();
|
|
371
377
|
}
|
|
372
378
|
getRectangles() {
|
|
373
|
-
return new Map(
|
|
379
|
+
return new Map([...this.rectangles.entries()].map(([id, rect]) => {
|
|
374
380
|
const { l, r, originalHeight, top } = rect;
|
|
375
381
|
const t = (top || 0) * this.pitchY;
|
|
376
382
|
const b = t + originalHeight;
|
|
@@ -32,13 +32,9 @@ class SceneGraph {
|
|
|
32
32
|
addChild(nameOrSceneGraph, left, top, width, height,
|
|
33
33
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
34
|
data) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
child = new SceneGraph(nameOrSceneGraph, left, top, width, height, data);
|
|
41
|
-
}
|
|
35
|
+
const child = nameOrSceneGraph instanceof SceneGraph
|
|
36
|
+
? nameOrSceneGraph
|
|
37
|
+
: new SceneGraph(nameOrSceneGraph, left, top, width, height, data);
|
|
42
38
|
if (!(child instanceof SceneGraph)) {
|
|
43
39
|
throw new TypeError('argument to addChild must be an array or a SceneGraph');
|
|
44
40
|
}
|
package/util/mst-reflection.d.ts
CHANGED
|
@@ -1,29 +1,24 @@
|
|
|
1
|
+
import { IAnyType, IModelReflectionPropertiesData, IAnyComplexType, ISimpleType, UnionStringArray } from 'mobx-state-tree';
|
|
2
|
+
export interface ILiteralType<T> extends ISimpleType<T> {
|
|
3
|
+
value: T;
|
|
4
|
+
}
|
|
1
5
|
/**
|
|
2
6
|
* get the inner type of an MST optional, array, or late type object
|
|
3
|
-
*
|
|
4
|
-
* @param {IModelType} type
|
|
5
|
-
* @returns {IModelType}
|
|
6
7
|
*/
|
|
7
|
-
export function getSubType(type:
|
|
8
|
+
export declare function getSubType(type: IAnyType): IAnyType;
|
|
8
9
|
/**
|
|
9
|
-
* get the array of
|
|
10
|
-
* @param {MST Union Type obj} unionType
|
|
11
|
-
* @returns {Array<IModelType>}
|
|
10
|
+
* get the array of the subtypes in a union
|
|
12
11
|
*/
|
|
13
|
-
export function getUnionSubTypes(unionType:
|
|
12
|
+
export declare function getUnionSubTypes(unionType: IAnyType): IAnyType[];
|
|
14
13
|
/**
|
|
15
14
|
* get the type of one of the properties of the given MST model type
|
|
16
|
-
*
|
|
17
|
-
* @param {IModelType} type
|
|
18
|
-
* @param {string} propertyName
|
|
19
|
-
* @returns {IModelType}
|
|
20
15
|
*/
|
|
21
|
-
export function getPropertyType(type:
|
|
16
|
+
export declare function getPropertyType(type: IModelReflectionPropertiesData, propertyName: string): IAnyType;
|
|
22
17
|
/**
|
|
23
18
|
* get the base type from inside an MST optional type
|
|
24
|
-
* @param {*} type
|
|
25
19
|
*/
|
|
26
|
-
export function getDefaultValue(type:
|
|
20
|
+
export declare function getDefaultValue(type: IAnyType): any;
|
|
21
|
+
export type IEnumerationType<T extends string> = ISimpleType<UnionStringArray<T[]>>;
|
|
27
22
|
/** get the string values of an MST enumeration type */
|
|
28
|
-
export function getEnumerationValues(type:
|
|
29
|
-
export function resolveLateType(maybeLate:
|
|
23
|
+
export declare function getEnumerationValues(type: IAnyComplexType): string[];
|
|
24
|
+
export declare function resolveLateType(maybeLate: IAnyType): any;
|
package/util/mst-reflection.js
CHANGED
|
@@ -5,19 +5,20 @@ exports.resolveLateType = exports.getEnumerationValues = exports.getDefaultValue
|
|
|
5
5
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
6
6
|
/**
|
|
7
7
|
* get the inner type of an MST optional, array, or late type object
|
|
8
|
-
*
|
|
9
|
-
* @param {IModelType} type
|
|
10
|
-
* @returns {IModelType}
|
|
11
8
|
*/
|
|
12
9
|
function getSubType(type) {
|
|
13
10
|
let t;
|
|
14
11
|
if ((0, mobx_state_tree_1.isOptionalType)(type)) {
|
|
12
|
+
// @ts-expect-error
|
|
15
13
|
t = type._subtype || type.type;
|
|
16
14
|
}
|
|
17
15
|
else if ((0, mobx_state_tree_1.isArrayType)(type) || (0, mobx_state_tree_1.isMapType)(type)) {
|
|
16
|
+
// @ts-expect-error
|
|
18
17
|
t = type._subtype || type._subType || type.subType;
|
|
18
|
+
// @ts-expect-error
|
|
19
19
|
}
|
|
20
20
|
else if (typeof type.getSubType === 'function') {
|
|
21
|
+
// @ts-expect-error
|
|
21
22
|
return type.getSubType();
|
|
22
23
|
}
|
|
23
24
|
else {
|
|
@@ -31,17 +32,20 @@ function getSubType(type) {
|
|
|
31
32
|
}
|
|
32
33
|
exports.getSubType = getSubType;
|
|
33
34
|
/**
|
|
34
|
-
* get the array of
|
|
35
|
-
* @param {MST Union Type obj} unionType
|
|
36
|
-
* @returns {Array<IModelType>}
|
|
35
|
+
* get the array of the subtypes in a union
|
|
37
36
|
*/
|
|
38
37
|
function getUnionSubTypes(unionType) {
|
|
39
38
|
if (!(0, mobx_state_tree_1.isUnionType)(unionType)) {
|
|
40
39
|
throw new TypeError('not an MST union type');
|
|
41
40
|
}
|
|
42
|
-
const t =
|
|
41
|
+
const t =
|
|
42
|
+
// @ts-expect-error
|
|
43
|
+
unionType._types ||
|
|
44
|
+
// @ts-expect-error
|
|
43
45
|
unionType.types ||
|
|
46
|
+
// @ts-expect-error
|
|
44
47
|
getSubType(unionType)._types ||
|
|
48
|
+
// @ts-expect-error
|
|
45
49
|
getSubType(unionType).types;
|
|
46
50
|
if (!t) {
|
|
47
51
|
// debugger
|
|
@@ -52,10 +56,6 @@ function getUnionSubTypes(unionType) {
|
|
|
52
56
|
exports.getUnionSubTypes = getUnionSubTypes;
|
|
53
57
|
/**
|
|
54
58
|
* get the type of one of the properties of the given MST model type
|
|
55
|
-
*
|
|
56
|
-
* @param {IModelType} type
|
|
57
|
-
* @param {string} propertyName
|
|
58
|
-
* @returns {IModelType}
|
|
59
59
|
*/
|
|
60
60
|
function getPropertyType(type, propertyName) {
|
|
61
61
|
const propertyType = type.properties[propertyName];
|
|
@@ -64,12 +64,12 @@ function getPropertyType(type, propertyName) {
|
|
|
64
64
|
exports.getPropertyType = getPropertyType;
|
|
65
65
|
/**
|
|
66
66
|
* get the base type from inside an MST optional type
|
|
67
|
-
* @param {*} type
|
|
68
67
|
*/
|
|
69
68
|
function getDefaultValue(type) {
|
|
70
69
|
if (!(0, mobx_state_tree_1.isOptionalType)(type)) {
|
|
71
70
|
throw new TypeError('type must be an optional type');
|
|
72
71
|
}
|
|
72
|
+
// @ts-expect-error
|
|
73
73
|
return type._defaultValue || type.defaultValue;
|
|
74
74
|
}
|
|
75
75
|
exports.getDefaultValue = getDefaultValue;
|
|
@@ -84,6 +84,7 @@ function resolveLateType(maybeLate) {
|
|
|
84
84
|
if (!(0, mobx_state_tree_1.isUnionType)(maybeLate) &&
|
|
85
85
|
!(0, mobx_state_tree_1.isArrayType)(maybeLate) &&
|
|
86
86
|
(0, mobx_state_tree_1.isLateType)(maybeLate)) {
|
|
87
|
+
// @ts-expect-error
|
|
87
88
|
return maybeLate.getSubType();
|
|
88
89
|
}
|
|
89
90
|
return maybeLate;
|
|
@@ -33,19 +33,20 @@ if (weHave.realOffscreenCanvas) {
|
|
|
33
33
|
else if (weHave.node) {
|
|
34
34
|
// use node-canvas if we are running in node (i.e. automated tests)
|
|
35
35
|
exports.createCanvas = (...args) => {
|
|
36
|
-
// @ts-
|
|
36
|
+
// @ts-expect-error
|
|
37
37
|
// eslint-disable-next-line no-undef
|
|
38
38
|
return nodeCreateCanvas(...args);
|
|
39
39
|
};
|
|
40
40
|
exports.createImageBitmap = async (canvas, ...otherargs) => {
|
|
41
|
-
if (otherargs.length) {
|
|
41
|
+
if (otherargs.length > 0) {
|
|
42
42
|
throw new Error('only one-argument uses of createImageBitmap are supported by the node offscreencanvas ponyfill');
|
|
43
43
|
}
|
|
44
44
|
const dataUri = canvas.toDataURL();
|
|
45
|
-
// @ts-
|
|
45
|
+
// @ts-expect-error
|
|
46
46
|
// eslint-disable-next-line no-undef
|
|
47
47
|
const img = new nodeImage();
|
|
48
48
|
return new Promise((resolve, reject) => {
|
|
49
|
+
// need onload for jest
|
|
49
50
|
img.onload = () => resolve(img);
|
|
50
51
|
img.onerror = reject;
|
|
51
52
|
img.src = dataUri;
|
|
@@ -79,6 +79,7 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
|
|
|
79
79
|
exports.renderToAbstractCanvas = renderToAbstractCanvas;
|
|
80
80
|
async function getSerializedSvg(results) {
|
|
81
81
|
const { width, height, canvasRecordedData } = results;
|
|
82
|
+
// @ts-ignore needs to be ignore not expect error, produces error in build step
|
|
82
83
|
const C2S = await Promise.resolve().then(() => __importStar(require('canvas2svg')));
|
|
83
84
|
const ctx = new C2S.default(width, height);
|
|
84
85
|
const seq = new canvas_sequencer_1.CanvasSequence(canvasRecordedData);
|
package/util/tracks.d.ts
CHANGED
package/util/tracks.js
CHANGED
|
@@ -141,7 +141,6 @@ function guessAdapter(file, index, adapterHint, model) {
|
|
|
141
141
|
exports.guessAdapter = guessAdapter;
|
|
142
142
|
function guessTrackType(adapterType, model) {
|
|
143
143
|
if (model) {
|
|
144
|
-
// @ts-ignore
|
|
145
144
|
const session = (0, index_1.getSession)(model);
|
|
146
145
|
const trackTypeGuesser = (0, index_1.getEnv)(session).pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', (_adapterName) => {
|
|
147
146
|
return undefined;
|
package/util/types/index.d.ts
CHANGED
|
@@ -22,7 +22,6 @@ export interface SnackAction {
|
|
|
22
22
|
onClick: () => void;
|
|
23
23
|
}
|
|
24
24
|
export type AssemblyManager = Instance<ReturnType<typeof assemblyManager>>;
|
|
25
|
-
export type { TextSearchManager };
|
|
26
25
|
export interface BasePlugin {
|
|
27
26
|
version?: string;
|
|
28
27
|
name: string;
|
|
@@ -195,6 +194,7 @@ export interface AbstractMenuManager {
|
|
|
195
194
|
export declare function isAbstractMenuManager(thing: unknown): thing is AbstractMenuManager;
|
|
196
195
|
export interface NoAssemblyRegion extends SnapshotIn<typeof MUNoAssemblyRegion> {
|
|
197
196
|
}
|
|
197
|
+
/** a description of a specific genomic region. assemblyName, refName, start, end, and reversed */
|
|
198
198
|
export interface Region extends SnapshotIn<typeof MUIRegion> {
|
|
199
199
|
}
|
|
200
200
|
export interface AugmentedRegion extends Region {
|
|
@@ -230,3 +230,4 @@ export type PreBlobLocation = {
|
|
|
230
230
|
blob: File;
|
|
231
231
|
};
|
|
232
232
|
export type PreFileLocation = PreUriLocation | PreLocalPathLocation | PreBlobLocation;
|
|
233
|
+
export { type default as TextSearchManager } from '../../TextSearch/TextSearchManager';
|
package/util/types/index.js
CHANGED
|
@@ -37,7 +37,7 @@ function isSessionModelWithConfigEditing(thing) {
|
|
|
37
37
|
exports.isSessionModelWithConfigEditing = isSessionModelWithConfigEditing;
|
|
38
38
|
function isSessionWithAddTracks(thing) {
|
|
39
39
|
return (
|
|
40
|
-
// @ts-
|
|
40
|
+
// @ts-expect-error
|
|
41
41
|
isSessionModel(thing) && 'addTrackConf' in thing && !thing.disableAddTracks);
|
|
42
42
|
}
|
|
43
43
|
exports.isSessionWithAddTracks = isSessionWithAddTracks;
|
|
@@ -71,7 +71,7 @@ function isTrackModel(thing) {
|
|
|
71
71
|
return (typeof thing === 'object' &&
|
|
72
72
|
thing !== null &&
|
|
73
73
|
'configuration' in thing &&
|
|
74
|
-
// @ts-
|
|
74
|
+
// @ts-expect-error
|
|
75
75
|
thing.configuration.trackId);
|
|
76
76
|
}
|
|
77
77
|
exports.isTrackModel = isTrackModel;
|
|
@@ -79,7 +79,7 @@ function isDisplayModel(thing) {
|
|
|
79
79
|
return (typeof thing === 'object' &&
|
|
80
80
|
thing !== null &&
|
|
81
81
|
'configuration' in thing &&
|
|
82
|
-
// @ts-
|
|
82
|
+
// @ts-expect-error
|
|
83
83
|
thing.configuration.displayId);
|
|
84
84
|
}
|
|
85
85
|
exports.isDisplayModel = isDisplayModel;
|
package/util/types/mst.js
CHANGED
|
@@ -70,16 +70,16 @@ exports.UriLocation = mobx_state_tree_1.types.snapshotProcessor(exports.UriLocat
|
|
|
70
70
|
},
|
|
71
71
|
});
|
|
72
72
|
exports.FileLocation = mobx_state_tree_1.types.snapshotProcessor(mobx_state_tree_1.types.union(exports.LocalPathLocation, exports.UriLocation, exports.BlobLocation), {
|
|
73
|
-
// @ts-
|
|
73
|
+
// @ts-expect-error
|
|
74
74
|
preProcessor(snap) {
|
|
75
75
|
if (!snap) {
|
|
76
76
|
return undefined;
|
|
77
77
|
}
|
|
78
|
-
// @ts-
|
|
78
|
+
// @ts-expect-error
|
|
79
79
|
// xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
|
|
80
80
|
const { locationType, ...rest } = snap;
|
|
81
81
|
if (!locationType) {
|
|
82
|
-
// @ts-
|
|
82
|
+
// @ts-expect-error
|
|
83
83
|
const { uri, localPath, blob } = rest;
|
|
84
84
|
let locationType = '';
|
|
85
85
|
if (uri !== undefined) {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
function useMeasure() {
|
|
5
|
+
const ref = (0, react_1.useRef)(null);
|
|
6
|
+
const [dims, setDims] = (0, react_1.useState)({
|
|
7
|
+
width: undefined,
|
|
8
|
+
height: undefined,
|
|
9
|
+
});
|
|
10
|
+
(0, react_1.useEffect)(() => {
|
|
11
|
+
if (!ref.current) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const RS = typeof window !== 'undefined' && 'ResizeObserver' in window
|
|
15
|
+
? window.ResizeObserver
|
|
16
|
+
: undefined;
|
|
17
|
+
if (!RS) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const observer = new RS(entries => {
|
|
21
|
+
setDims({
|
|
22
|
+
width: entries[0].contentRect.width,
|
|
23
|
+
height: entries[0].contentRect.height,
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
observer.observe(ref.current);
|
|
27
|
+
// Callback fired when component is unmounted
|
|
28
|
+
return () => {
|
|
29
|
+
observer.disconnect();
|
|
30
|
+
};
|
|
31
|
+
}, []);
|
|
32
|
+
return [ref, dims];
|
|
33
|
+
}
|
|
34
|
+
exports.default = useMeasure;
|