@macrostrat/map-interface 1.0.12 → 1.2.0
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/CHANGELOG.md +13 -0
- package/dist/cjs/container.72611900.js +134 -0
- package/dist/cjs/container.72611900.js.map +1 -0
- package/dist/cjs/context-panel.8c4b009c.js +88 -0
- package/dist/cjs/context-panel.8c4b009c.js.map +1 -0
- package/dist/cjs/controls.7ce3e95c.js +79 -0
- package/dist/cjs/controls.7ce3e95c.js.map +1 -0
- package/dist/cjs/dev.7499151f.js +33 -0
- package/dist/cjs/dev.7499151f.js.map +1 -0
- package/dist/cjs/expansion-panel.08532cee.js +134 -0
- package/dist/cjs/expansion-panel.08532cee.js.map +1 -0
- package/dist/cjs/hash-string.62e84f08.js +67 -0
- package/dist/cjs/hash-string.62e84f08.js.map +1 -0
- package/dist/cjs/header.58c5c012.js +104 -0
- package/dist/cjs/header.58c5c012.js.map +1 -0
- package/dist/cjs/headers.20eae5f7.js +29 -0
- package/dist/cjs/headers.20eae5f7.js.map +1 -0
- package/dist/cjs/helpers.0f72ddaf.js +190 -0
- package/dist/cjs/helpers.0f72ddaf.js.map +1 -0
- package/dist/cjs/index.js +51 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/location-info.92e70042.js +119 -0
- package/dist/cjs/location-info.92e70042.js.map +1 -0
- package/dist/cjs/location-panel.c95f5e96.js +66 -0
- package/dist/cjs/location-panel.c95f5e96.js.map +1 -0
- package/dist/cjs/main.module.02c4de16.css +86 -0
- package/dist/cjs/main.module.02c4de16.css.map +1 -0
- package/dist/cjs/main.module.3f2b7c9f.js +38 -0
- package/dist/cjs/main.module.3f2b7c9f.js.map +1 -0
- package/dist/cjs/main.module.4ecbaaa5.js +62 -0
- package/dist/cjs/main.module.4ecbaaa5.js.map +1 -0
- package/dist/cjs/main.module.62939ea7.js +167 -0
- package/dist/cjs/main.module.62939ea7.js.map +1 -0
- package/dist/cjs/main.module.92978d8b.css +52 -0
- package/dist/cjs/main.module.92978d8b.css.map +1 -0
- package/dist/cjs/main.module.becc2fe7.css +92 -0
- package/dist/cjs/main.module.becc2fe7.css.map +1 -0
- package/dist/cjs/main.module.ccec47df.js +50 -0
- package/dist/cjs/main.module.ccec47df.js.map +1 -0
- package/dist/cjs/main.module.e958948e.js +26 -0
- package/dist/cjs/main.module.e958948e.js.map +1 -0
- package/dist/{index.css → cjs/main.module.f085a193.css} +9 -397
- package/dist/cjs/main.module.f085a193.css.map +1 -0
- package/dist/cjs/main.module.ff1b1aca.css +179 -0
- package/dist/cjs/main.module.ff1b1aca.css.map +1 -0
- package/dist/cjs/map-page.190b6723.js +182 -0
- package/dist/cjs/map-page.190b6723.js.map +1 -0
- package/dist/cjs/map-view.93363b41.js +167 -0
- package/dist/cjs/map-view.93363b41.js.map +1 -0
- package/dist/cjs/terrain.90f76b4e.js +59 -0
- package/dist/cjs/terrain.90f76b4e.js.map +1 -0
- package/dist/cjs/tile-extent.06a4b2ed.js +51 -0
- package/dist/cjs/tile-extent.06a4b2ed.js.map +1 -0
- package/dist/cjs/utils.09cef979.js +36 -0
- package/dist/cjs/utils.09cef979.js.map +1 -0
- package/dist/cjs/utils.26f02633.js +46 -0
- package/dist/cjs/utils.26f02633.js.map +1 -0
- package/dist/cjs/vector-tile-features.456f887b.js +268 -0
- package/dist/cjs/vector-tile-features.456f887b.js.map +1 -0
- package/dist/cjs/xray.a23f8660.js +89 -0
- package/dist/cjs/xray.a23f8660.js.map +1 -0
- package/dist/esm/container.16bde261.js +126 -0
- package/dist/esm/container.16bde261.js.map +1 -0
- package/dist/esm/context-panel.c288c5cd.js +81 -0
- package/dist/esm/context-panel.c288c5cd.js.map +1 -0
- package/dist/esm/controls.f757ce16.js +74 -0
- package/dist/esm/controls.f757ce16.js.map +1 -0
- package/dist/esm/dev.ccb6e774.js +13 -0
- package/dist/esm/dev.ccb6e774.js.map +1 -0
- package/dist/esm/expansion-panel.feff0e62.js +123 -0
- package/dist/esm/expansion-panel.feff0e62.js.map +1 -0
- package/dist/esm/hash-string.836601b2.js +61 -0
- package/dist/esm/hash-string.836601b2.js.map +1 -0
- package/dist/esm/header.0f535ab1.js +99 -0
- package/dist/esm/header.0f535ab1.js.map +1 -0
- package/dist/esm/headers.b25ff414.js +24 -0
- package/dist/esm/headers.b25ff414.js.map +1 -0
- package/dist/esm/helpers.fb1d7227.js +176 -0
- package/dist/esm/helpers.fb1d7227.js.map +1 -0
- package/dist/{types.d.ts → esm/index.d.ts} +104 -52
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +25 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/location-info.5543bb05.js +89 -0
- package/dist/esm/location-info.5543bb05.js.map +1 -0
- package/dist/esm/location-panel.0b1f4ed2.js +58 -0
- package/dist/esm/location-panel.0b1f4ed2.js.map +1 -0
- package/dist/esm/main.module.5eb366de.js +52 -0
- package/dist/esm/main.module.5eb366de.js.map +1 -0
- package/dist/esm/main.module.67a908da.js +40 -0
- package/dist/esm/main.module.67a908da.js.map +1 -0
- package/dist/esm/main.module.89579666.js +64 -0
- package/dist/esm/main.module.89579666.js.map +1 -0
- package/dist/esm/main.module.9c57cc95.js +28 -0
- package/dist/esm/main.module.9c57cc95.js.map +1 -0
- package/dist/esm/main.module.f70e002b.js +169 -0
- package/dist/esm/main.module.f70e002b.js.map +1 -0
- package/dist/esm/map-page.b953c404.js +175 -0
- package/dist/esm/map-page.b953c404.js.map +1 -0
- package/dist/esm/map-view.a3fe6257.js +161 -0
- package/dist/esm/map-view.a3fe6257.js.map +1 -0
- package/dist/esm/terrain.f65cf7c5.js +54 -0
- package/dist/esm/terrain.f65cf7c5.js.map +1 -0
- package/dist/esm/tile-extent.ca526996.js +46 -0
- package/dist/esm/tile-extent.ca526996.js.map +1 -0
- package/dist/esm/utils.122d1f2d.js +28 -0
- package/dist/esm/utils.122d1f2d.js.map +1 -0
- package/dist/esm/utils.d40349f0.js +40 -0
- package/dist/esm/utils.d40349f0.js.map +1 -0
- package/dist/esm/vector-tile-features.e1a24df0.js +258 -0
- package/dist/esm/vector-tile-features.e1a24df0.js.map +1 -0
- package/dist/esm/xray.c0663c25.js +83 -0
- package/dist/esm/xray.c0663c25.js.map +1 -0
- package/package.json +19 -36
- package/src/container.ts +29 -21
- package/src/context-panel/index.ts +7 -8
- package/src/context-panel/main.module.sass +1 -1
- package/src/dev/main.module.sass +16 -0
- package/src/dev/map-page.ts +32 -11
- package/src/dev/vector-tile-features.ts +44 -13
- package/src/helpers.ts +15 -13
- package/src/location-panel/header.ts +27 -8
- package/src/location-panel/index.ts +4 -2
- package/src/location-panel/main.module.sass +7 -0
- package/src/main.module.sass +4 -1
- package/src/map-view/index.ts +28 -32
- package/dist/index.cjs.css +0 -961
- package/dist/index.cjs.css.map +0 -1
- package/dist/index.cjs.js +0 -1965
- package/dist/index.cjs.js.map +0 -1
- package/dist/index.css.map +0 -1
- package/dist/index.js +0 -1956
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
package/src/helpers.ts
CHANGED
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
useMapEaseTo,
|
|
4
4
|
useMapDispatch,
|
|
5
5
|
useMapStatus,
|
|
6
|
+
useMapInitialized,
|
|
6
7
|
} from "@macrostrat/mapbox-react";
|
|
7
8
|
import { useMemo, useRef } from "react";
|
|
8
9
|
import { debounce } from "underscore";
|
|
@@ -86,6 +87,7 @@ export function MapPaddingManager({
|
|
|
86
87
|
export function MapMovedReporter({ onMapMoved = null }) {
|
|
87
88
|
const mapRef = useMapRef();
|
|
88
89
|
const dispatch = useMapDispatch();
|
|
90
|
+
const isInitialized = useMapInitialized();
|
|
89
91
|
|
|
90
92
|
const mapMovedCallback = useCallback(() => {
|
|
91
93
|
const map = mapRef.current;
|
|
@@ -93,7 +95,7 @@ export function MapMovedReporter({ onMapMoved = null }) {
|
|
|
93
95
|
const mapPosition = getMapPosition(map);
|
|
94
96
|
dispatch({ type: "map-moved", payload: mapPosition });
|
|
95
97
|
onMapMoved?.(mapPosition, map);
|
|
96
|
-
}, [
|
|
98
|
+
}, [onMapMoved, dispatch, isInitialized]);
|
|
97
99
|
|
|
98
100
|
useEffect(() => {
|
|
99
101
|
// Get the current value of the map. Useful for gradually moving away
|
|
@@ -120,6 +122,7 @@ export function MapLoadingReporter({
|
|
|
120
122
|
const mapRef = useMapRef();
|
|
121
123
|
const loadingRef = useRef(false);
|
|
122
124
|
const dispatch = useMapDispatch();
|
|
125
|
+
const isInitialized = useMapInitialized();
|
|
123
126
|
|
|
124
127
|
useEffect(() => {
|
|
125
128
|
const map = mapRef.current;
|
|
@@ -148,36 +151,35 @@ export function MapLoadingReporter({
|
|
|
148
151
|
map?.off("sourcedataloading", loadingCallback);
|
|
149
152
|
map?.off("idle", idleCallback);
|
|
150
153
|
};
|
|
151
|
-
}, [ignoredSources,
|
|
154
|
+
}, [ignoredSources, mapIsLoading, isInitialized]);
|
|
152
155
|
return null;
|
|
153
156
|
}
|
|
154
157
|
|
|
155
158
|
export function MapMarker({ position, setPosition, centerMarker = true }) {
|
|
156
159
|
const mapRef = useMapRef();
|
|
157
160
|
const markerRef = useRef(null);
|
|
161
|
+
const isInitialized = useMapInitialized();
|
|
158
162
|
|
|
159
163
|
useMapMarker(mapRef, markerRef, position);
|
|
160
164
|
|
|
161
|
-
|
|
162
|
-
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
const map = mapRef.current;
|
|
167
|
+
if (map == null || setPosition == null) return;
|
|
168
|
+
|
|
169
|
+
const handleMapClick = (event: mapboxgl.MapMouseEvent) => {
|
|
163
170
|
setPosition(event.lngLat, event, mapRef.current);
|
|
164
171
|
// We should integrate this with the "easeToCenter" hook
|
|
165
172
|
if (centerMarker) {
|
|
166
173
|
mapRef.current?.flyTo({ center: event.lngLat, duration: 800 });
|
|
167
174
|
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
map.on("click", handleMapClick);
|
|
171
178
|
|
|
172
|
-
useEffect(() => {
|
|
173
|
-
const map = mapRef.current;
|
|
174
|
-
if (map != null && setPosition != null) {
|
|
175
|
-
map.on("click", handleMapClick);
|
|
176
|
-
}
|
|
177
179
|
return () => {
|
|
178
180
|
map?.off("click", handleMapClick);
|
|
179
181
|
};
|
|
180
|
-
}, [
|
|
182
|
+
}, [setPosition, isInitialized]);
|
|
181
183
|
|
|
182
184
|
return null;
|
|
183
185
|
}
|
|
@@ -11,14 +11,16 @@ import {
|
|
|
11
11
|
|
|
12
12
|
const h = hyper.styled(styles);
|
|
13
13
|
|
|
14
|
-
function PositionButton({ position, showCopyLink = false }) {
|
|
14
|
+
function PositionButton({ position, bounds, showCopyLink = false }) {
|
|
15
15
|
const focusState = useFocusState(position);
|
|
16
16
|
|
|
17
17
|
const copyLinkIsVisible = isCentered(focusState) && showCopyLink;
|
|
18
18
|
|
|
19
19
|
return h("div.position-controls", [
|
|
20
|
-
h(LocationFocusButton, { location: position, focusState }, []),
|
|
21
|
-
h.if(copyLinkIsVisible)(CopyLinkButton, {
|
|
20
|
+
h(LocationFocusButton, { location: position, bounds, focusState }, []),
|
|
21
|
+
h.if(copyLinkIsVisible && position != null)(CopyLinkButton, {
|
|
22
|
+
itemName: "position",
|
|
23
|
+
}),
|
|
22
24
|
]);
|
|
23
25
|
}
|
|
24
26
|
|
|
@@ -66,26 +68,39 @@ function CopyLinkButton({ itemName, children, onClick, ...rest }) {
|
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
export interface InfoDrawerHeaderProps {
|
|
69
|
-
onClose
|
|
70
|
-
position
|
|
71
|
+
onClose?: () => void;
|
|
72
|
+
position?: mapboxgl.LngLat;
|
|
71
73
|
zoom?: number;
|
|
72
74
|
elevation?: number;
|
|
73
75
|
showCopyPositionButton?: boolean;
|
|
76
|
+
bounds?: mapboxgl.LngLatBounds;
|
|
74
77
|
}
|
|
75
78
|
|
|
76
79
|
export function InfoDrawerHeader(props: InfoDrawerHeaderProps) {
|
|
77
80
|
const {
|
|
78
81
|
onClose,
|
|
79
82
|
position,
|
|
83
|
+
bounds,
|
|
80
84
|
zoom = 7,
|
|
81
85
|
elevation,
|
|
82
86
|
showCopyPositionButton,
|
|
87
|
+
children,
|
|
83
88
|
} = props;
|
|
84
89
|
|
|
90
|
+
let leftButton = null;
|
|
91
|
+
if (bounds != null || position != null) {
|
|
92
|
+
leftButton = h(PositionButton, {
|
|
93
|
+
position,
|
|
94
|
+
bounds,
|
|
95
|
+
showCopyLink: showCopyPositionButton,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
85
99
|
return h("header.location-panel-header", [
|
|
86
|
-
|
|
100
|
+
leftButton,
|
|
101
|
+
children,
|
|
87
102
|
h("div.spacer"),
|
|
88
|
-
h(LngLatCoords, {
|
|
103
|
+
h.if(position != null)(LngLatCoords, {
|
|
89
104
|
position,
|
|
90
105
|
zoom,
|
|
91
106
|
className: "infodrawer-header-item",
|
|
@@ -94,6 +109,10 @@ export function InfoDrawerHeader(props: InfoDrawerHeaderProps) {
|
|
|
94
109
|
elevation,
|
|
95
110
|
className: "infodrawer-header-item",
|
|
96
111
|
}),
|
|
97
|
-
h(Button, {
|
|
112
|
+
h.if(onClose != null)(Button, {
|
|
113
|
+
minimal: true,
|
|
114
|
+
icon: "cross",
|
|
115
|
+
onClick: onClose,
|
|
116
|
+
}),
|
|
98
117
|
]);
|
|
99
118
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Card } from "@blueprintjs/core";
|
|
2
1
|
import hyper from "@macrostrat/hyper";
|
|
3
2
|
import { InfoDrawerHeader, InfoDrawerHeaderProps } from "./header";
|
|
4
3
|
import classNames from "classnames";
|
|
5
4
|
import styles from "./main.module.sass";
|
|
6
5
|
import { ErrorBoundary } from "@macrostrat/ui-components";
|
|
6
|
+
import { PanelCard } from "../container";
|
|
7
7
|
|
|
8
8
|
const h = hyper.styled(styles);
|
|
9
9
|
|
|
10
10
|
export function InfoDrawerContainer(props) {
|
|
11
11
|
const className = classNames("infodrawer", props.className);
|
|
12
|
-
return h(
|
|
12
|
+
return h(PanelCard, { ...props, className });
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
interface BaseInfoDrawerProps extends InfoDrawerHeaderProps {
|
|
@@ -42,6 +42,8 @@ export function BaseInfoDrawer(props: BaseInfoDrawerProps) {
|
|
|
42
42
|
]);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
export const DetailsPanel = BaseInfoDrawer;
|
|
46
|
+
|
|
45
47
|
export function LocationPanel(props) {
|
|
46
48
|
const { children, className, loading = false, ...rest } = props;
|
|
47
49
|
const cls = classNames("location-panel", className, { loading });
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
flex-direction: row
|
|
11
11
|
align-items: center
|
|
12
12
|
gap: 1em
|
|
13
|
+
min-height: 40px
|
|
13
14
|
border-bottom: 1px solid var(--panel-rule-color)
|
|
14
15
|
|
|
15
16
|
.spacer
|
|
@@ -21,6 +22,12 @@
|
|
|
21
22
|
.position-controls :global(.bp5-button)
|
|
22
23
|
font-size: 12px !important
|
|
23
24
|
|
|
25
|
+
// Text elements should
|
|
26
|
+
h1, h2, h3, h4, h5, h6, p
|
|
27
|
+
margin: 0
|
|
28
|
+
&:first-child
|
|
29
|
+
margin-left: 10px
|
|
30
|
+
|
|
24
31
|
.infodrawer-header-item
|
|
25
32
|
font-size: 12px
|
|
26
33
|
|
package/src/main.module.sass
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
width: 100%
|
|
6
6
|
height: 100%
|
|
7
7
|
overflow: hidden
|
|
8
|
+
--map-panel-border-radius: 4px
|
|
8
9
|
|
|
9
10
|
&.show-panel-outlines
|
|
10
11
|
.map-view-container
|
|
@@ -101,7 +102,7 @@
|
|
|
101
102
|
position: absolute
|
|
102
103
|
|
|
103
104
|
|
|
104
|
-
.context-panel-holder
|
|
105
|
+
.context-panel-holder > :global(.bp5-card)
|
|
105
106
|
padding: 10px
|
|
106
107
|
background-color: var(--panel-background-color)
|
|
107
108
|
|
|
@@ -109,6 +110,7 @@
|
|
|
109
110
|
padding: 10px
|
|
110
111
|
background-color: var(--panel-background-color)
|
|
111
112
|
overflow: hidden
|
|
113
|
+
border-radius: var(--map-panel-border-radius)
|
|
112
114
|
|
|
113
115
|
& > :last-child
|
|
114
116
|
margin-bottom: 0
|
|
@@ -394,6 +396,7 @@
|
|
|
394
396
|
display: flex
|
|
395
397
|
flex-direction: column
|
|
396
398
|
|
|
399
|
+
|
|
397
400
|
&.adaptive-width
|
|
398
401
|
width: var(--map-context-stack-width, none)
|
|
399
402
|
max-width: var(--map-context-stack-max-width, none)
|
package/src/map-view/index.ts
CHANGED
|
@@ -116,45 +116,41 @@ export function MapView(props: MapViewProps) {
|
|
|
116
116
|
const ref = useRef<HTMLDivElement>();
|
|
117
117
|
const parentRef = useRef<HTMLDivElement>();
|
|
118
118
|
|
|
119
|
-
// Keep track of map position for reloads
|
|
120
|
-
useEffect(() => {
|
|
121
|
-
console.log("Map updated", mapRef.current);
|
|
122
|
-
}, [mapRef.current]);
|
|
123
|
-
|
|
124
119
|
useEffect(() => {
|
|
125
120
|
if (style == null) return;
|
|
126
|
-
|
|
121
|
+
let map = mapRef.current;
|
|
122
|
+
if (map != null) {
|
|
127
123
|
console.log("Setting style", style);
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
map.setStyle(style);
|
|
125
|
+
} else {
|
|
126
|
+
console.log("Initializing map", style);
|
|
127
|
+
const map = initializeMap(ref.current, {
|
|
128
|
+
style,
|
|
129
|
+
projection,
|
|
130
|
+
mapPosition,
|
|
131
|
+
transformRequest,
|
|
132
|
+
...rest,
|
|
133
|
+
});
|
|
134
|
+
dispatch({ type: "set-map", payload: map });
|
|
135
|
+
map.setPadding(getMapPadding(ref, parentRef), { animate: false });
|
|
136
|
+
onMapLoaded?.(map);
|
|
130
137
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
projection,
|
|
134
|
-
mapPosition,
|
|
135
|
-
...rest,
|
|
136
|
-
});
|
|
137
|
-
map.setPadding(getMapPadding(ref, parentRef), { animate: false });
|
|
138
|
-
map.on("style.load", () => {
|
|
138
|
+
|
|
139
|
+
const loadCallback = () => {
|
|
139
140
|
onStyleLoaded?.(map);
|
|
140
141
|
dispatch({ type: "set-style-loaded", payload: true });
|
|
141
|
-
}
|
|
142
|
-
onMapLoaded?.(map);
|
|
143
|
-
dispatch({ type: "set-map", payload: map });
|
|
144
|
-
}, [style]);
|
|
142
|
+
};
|
|
145
143
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
// setMapPosition(map, mapPosition);
|
|
157
|
-
// }, [mapPosition]);
|
|
144
|
+
map = mapRef.current;
|
|
145
|
+
if (map.isStyleLoaded()) {
|
|
146
|
+
// Catch a race condition where the style is loaded before the callback is set
|
|
147
|
+
loadCallback();
|
|
148
|
+
}
|
|
149
|
+
map.on("style.load", loadCallback);
|
|
150
|
+
return () => {
|
|
151
|
+
map.off("style.load", loadCallback);
|
|
152
|
+
};
|
|
153
|
+
}, [style]);
|
|
158
154
|
|
|
159
155
|
const _computedMapPosition = useMapPosition();
|
|
160
156
|
const { mapUse3D, mapIsRotated } = mapViewInfo(_computedMapPosition);
|