@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.
Files changed (134) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/container.72611900.js +134 -0
  3. package/dist/cjs/container.72611900.js.map +1 -0
  4. package/dist/cjs/context-panel.8c4b009c.js +88 -0
  5. package/dist/cjs/context-panel.8c4b009c.js.map +1 -0
  6. package/dist/cjs/controls.7ce3e95c.js +79 -0
  7. package/dist/cjs/controls.7ce3e95c.js.map +1 -0
  8. package/dist/cjs/dev.7499151f.js +33 -0
  9. package/dist/cjs/dev.7499151f.js.map +1 -0
  10. package/dist/cjs/expansion-panel.08532cee.js +134 -0
  11. package/dist/cjs/expansion-panel.08532cee.js.map +1 -0
  12. package/dist/cjs/hash-string.62e84f08.js +67 -0
  13. package/dist/cjs/hash-string.62e84f08.js.map +1 -0
  14. package/dist/cjs/header.58c5c012.js +104 -0
  15. package/dist/cjs/header.58c5c012.js.map +1 -0
  16. package/dist/cjs/headers.20eae5f7.js +29 -0
  17. package/dist/cjs/headers.20eae5f7.js.map +1 -0
  18. package/dist/cjs/helpers.0f72ddaf.js +190 -0
  19. package/dist/cjs/helpers.0f72ddaf.js.map +1 -0
  20. package/dist/cjs/index.js +51 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/location-info.92e70042.js +119 -0
  23. package/dist/cjs/location-info.92e70042.js.map +1 -0
  24. package/dist/cjs/location-panel.c95f5e96.js +66 -0
  25. package/dist/cjs/location-panel.c95f5e96.js.map +1 -0
  26. package/dist/cjs/main.module.02c4de16.css +86 -0
  27. package/dist/cjs/main.module.02c4de16.css.map +1 -0
  28. package/dist/cjs/main.module.3f2b7c9f.js +38 -0
  29. package/dist/cjs/main.module.3f2b7c9f.js.map +1 -0
  30. package/dist/cjs/main.module.4ecbaaa5.js +62 -0
  31. package/dist/cjs/main.module.4ecbaaa5.js.map +1 -0
  32. package/dist/cjs/main.module.62939ea7.js +167 -0
  33. package/dist/cjs/main.module.62939ea7.js.map +1 -0
  34. package/dist/cjs/main.module.92978d8b.css +52 -0
  35. package/dist/cjs/main.module.92978d8b.css.map +1 -0
  36. package/dist/cjs/main.module.becc2fe7.css +92 -0
  37. package/dist/cjs/main.module.becc2fe7.css.map +1 -0
  38. package/dist/cjs/main.module.ccec47df.js +50 -0
  39. package/dist/cjs/main.module.ccec47df.js.map +1 -0
  40. package/dist/cjs/main.module.e958948e.js +26 -0
  41. package/dist/cjs/main.module.e958948e.js.map +1 -0
  42. package/dist/{index.css → cjs/main.module.f085a193.css} +9 -397
  43. package/dist/cjs/main.module.f085a193.css.map +1 -0
  44. package/dist/cjs/main.module.ff1b1aca.css +179 -0
  45. package/dist/cjs/main.module.ff1b1aca.css.map +1 -0
  46. package/dist/cjs/map-page.190b6723.js +182 -0
  47. package/dist/cjs/map-page.190b6723.js.map +1 -0
  48. package/dist/cjs/map-view.93363b41.js +167 -0
  49. package/dist/cjs/map-view.93363b41.js.map +1 -0
  50. package/dist/cjs/terrain.90f76b4e.js +59 -0
  51. package/dist/cjs/terrain.90f76b4e.js.map +1 -0
  52. package/dist/cjs/tile-extent.06a4b2ed.js +51 -0
  53. package/dist/cjs/tile-extent.06a4b2ed.js.map +1 -0
  54. package/dist/cjs/utils.09cef979.js +36 -0
  55. package/dist/cjs/utils.09cef979.js.map +1 -0
  56. package/dist/cjs/utils.26f02633.js +46 -0
  57. package/dist/cjs/utils.26f02633.js.map +1 -0
  58. package/dist/cjs/vector-tile-features.456f887b.js +268 -0
  59. package/dist/cjs/vector-tile-features.456f887b.js.map +1 -0
  60. package/dist/cjs/xray.a23f8660.js +89 -0
  61. package/dist/cjs/xray.a23f8660.js.map +1 -0
  62. package/dist/esm/container.16bde261.js +126 -0
  63. package/dist/esm/container.16bde261.js.map +1 -0
  64. package/dist/esm/context-panel.c288c5cd.js +81 -0
  65. package/dist/esm/context-panel.c288c5cd.js.map +1 -0
  66. package/dist/esm/controls.f757ce16.js +74 -0
  67. package/dist/esm/controls.f757ce16.js.map +1 -0
  68. package/dist/esm/dev.ccb6e774.js +13 -0
  69. package/dist/esm/dev.ccb6e774.js.map +1 -0
  70. package/dist/esm/expansion-panel.feff0e62.js +123 -0
  71. package/dist/esm/expansion-panel.feff0e62.js.map +1 -0
  72. package/dist/esm/hash-string.836601b2.js +61 -0
  73. package/dist/esm/hash-string.836601b2.js.map +1 -0
  74. package/dist/esm/header.0f535ab1.js +99 -0
  75. package/dist/esm/header.0f535ab1.js.map +1 -0
  76. package/dist/esm/headers.b25ff414.js +24 -0
  77. package/dist/esm/headers.b25ff414.js.map +1 -0
  78. package/dist/esm/helpers.fb1d7227.js +176 -0
  79. package/dist/esm/helpers.fb1d7227.js.map +1 -0
  80. package/dist/{types.d.ts → esm/index.d.ts} +104 -52
  81. package/dist/esm/index.d.ts.map +1 -0
  82. package/dist/esm/index.js +25 -0
  83. package/dist/esm/index.js.map +1 -0
  84. package/dist/esm/location-info.5543bb05.js +89 -0
  85. package/dist/esm/location-info.5543bb05.js.map +1 -0
  86. package/dist/esm/location-panel.0b1f4ed2.js +58 -0
  87. package/dist/esm/location-panel.0b1f4ed2.js.map +1 -0
  88. package/dist/esm/main.module.5eb366de.js +52 -0
  89. package/dist/esm/main.module.5eb366de.js.map +1 -0
  90. package/dist/esm/main.module.67a908da.js +40 -0
  91. package/dist/esm/main.module.67a908da.js.map +1 -0
  92. package/dist/esm/main.module.89579666.js +64 -0
  93. package/dist/esm/main.module.89579666.js.map +1 -0
  94. package/dist/esm/main.module.9c57cc95.js +28 -0
  95. package/dist/esm/main.module.9c57cc95.js.map +1 -0
  96. package/dist/esm/main.module.f70e002b.js +169 -0
  97. package/dist/esm/main.module.f70e002b.js.map +1 -0
  98. package/dist/esm/map-page.b953c404.js +175 -0
  99. package/dist/esm/map-page.b953c404.js.map +1 -0
  100. package/dist/esm/map-view.a3fe6257.js +161 -0
  101. package/dist/esm/map-view.a3fe6257.js.map +1 -0
  102. package/dist/esm/terrain.f65cf7c5.js +54 -0
  103. package/dist/esm/terrain.f65cf7c5.js.map +1 -0
  104. package/dist/esm/tile-extent.ca526996.js +46 -0
  105. package/dist/esm/tile-extent.ca526996.js.map +1 -0
  106. package/dist/esm/utils.122d1f2d.js +28 -0
  107. package/dist/esm/utils.122d1f2d.js.map +1 -0
  108. package/dist/esm/utils.d40349f0.js +40 -0
  109. package/dist/esm/utils.d40349f0.js.map +1 -0
  110. package/dist/esm/vector-tile-features.e1a24df0.js +258 -0
  111. package/dist/esm/vector-tile-features.e1a24df0.js.map +1 -0
  112. package/dist/esm/xray.c0663c25.js +83 -0
  113. package/dist/esm/xray.c0663c25.js.map +1 -0
  114. package/package.json +19 -36
  115. package/src/container.ts +29 -21
  116. package/src/context-panel/index.ts +7 -8
  117. package/src/context-panel/main.module.sass +1 -1
  118. package/src/dev/main.module.sass +16 -0
  119. package/src/dev/map-page.ts +32 -11
  120. package/src/dev/vector-tile-features.ts +44 -13
  121. package/src/helpers.ts +15 -13
  122. package/src/location-panel/header.ts +27 -8
  123. package/src/location-panel/index.ts +4 -2
  124. package/src/location-panel/main.module.sass +7 -0
  125. package/src/main.module.sass +4 -1
  126. package/src/map-view/index.ts +28 -32
  127. package/dist/index.cjs.css +0 -961
  128. package/dist/index.cjs.css.map +0 -1
  129. package/dist/index.cjs.js +0 -1965
  130. package/dist/index.cjs.js.map +0 -1
  131. package/dist/index.css.map +0 -1
  132. package/dist/index.js +0 -1956
  133. package/dist/index.js.map +0 -1
  134. 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
- }, [mapRef.current, onMapMoved, dispatch]);
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, mapRef.current, mapIsLoading]);
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
- const handleMapClick = useCallback(
162
- (event: mapboxgl.MapMouseEvent) => {
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
- }, // eslint-disable-next-line react-hooks/exhaustive-deps
169
- [mapRef.current, setPosition]
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
- }, [mapRef.current, setPosition]);
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, { itemName: "position" }),
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: () => void;
70
- position: mapboxgl.LngLat;
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
- h(PositionButton, { position, showCopyLink: showCopyPositionButton }),
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, { minimal: true, icon: "cross", onClick: onClose }),
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(Card, { ...props, className });
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
 
@@ -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>:global(.bp5-card)
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)
@@ -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
- if (mapRef.current != null) {
121
+ let map = mapRef.current;
122
+ if (map != null) {
127
123
  console.log("Setting style", style);
128
- mapRef.current.setStyle(style);
129
- return;
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
- const map = initializeMap(ref.current, {
132
- style,
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
- // Map style updating
147
- // useEffect(() => {
148
- // if (mapRef?.current == null || style == null) return;
149
- // mapRef?.current?.setStyle(style);
150
- // }, [mapRef.current, style]);
151
-
152
- // Set map position if it changes
153
- // useEffect(() => {
154
- // const map = mapRef.current;
155
- // if (map == null || mapPosition == null) return;
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);