@macrostrat/column-views 3.8.0 → 3.10.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 +125 -0
- package/dist/animated-age-window.cjs +51 -0
- package/dist/animated-age-window.cjs.map +1 -0
- package/dist/animated-age-window.d.ts +51 -0
- package/dist/animated-age-window.js +51 -0
- package/dist/animated-age-window.js.map +1 -0
- package/dist/column.cjs +11 -1
- package/dist/column.cjs.map +1 -1
- package/dist/column.d.ts +11 -0
- package/dist/column.js +11 -1
- package/dist/column.js.map +1 -1
- package/dist/correlation-chart/main.cjs +24 -12
- package/dist/correlation-chart/main.cjs.map +1 -1
- package/dist/correlation-chart/main.d.ts +8 -1
- package/dist/correlation-chart/main.js +24 -12
- package/dist/correlation-chart/main.js.map +1 -1
- package/dist/data-provider/store.cjs +17 -4
- package/dist/data-provider/store.cjs.map +1 -1
- package/dist/data-provider/store.d.ts +6 -1
- package/dist/data-provider/store.js +17 -4
- package/dist/data-provider/store.js.map +1 -1
- package/dist/index.cjs +17 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -34
- package/dist/index.js.map +1 -1
- package/dist/prepare-units/composite-scale.cjs +94 -8
- package/dist/prepare-units/composite-scale.cjs.map +1 -1
- package/dist/prepare-units/composite-scale.d.ts +39 -0
- package/dist/prepare-units/composite-scale.js +96 -10
- package/dist/prepare-units/composite-scale.js.map +1 -1
- package/dist/prepare-units/helpers.cjs +0 -1
- package/dist/prepare-units/helpers.cjs.map +1 -1
- package/dist/prepare-units/helpers.js +0 -1
- package/dist/prepare-units/helpers.js.map +1 -1
- package/dist/prepare-units/index.cjs +33 -12
- package/dist/prepare-units/index.cjs.map +1 -1
- package/dist/prepare-units/index.js +34 -13
- package/dist/prepare-units/index.js.map +1 -1
- package/dist/prepare-units/types.cjs.map +1 -1
- package/dist/prepare-units/types.d.ts +13 -0
- package/dist/prepare-units/types.js.map +1 -1
- package/dist/section.cjs +4 -2
- package/dist/section.cjs.map +1 -1
- package/dist/section.d.ts +4 -1
- package/dist/section.js +4 -2
- package/dist/section.js.map +1 -1
- package/dist/units/boxes.cjs +22 -39
- package/dist/units/boxes.cjs.map +1 -1
- package/dist/units/boxes.js +24 -41
- package/dist/units/boxes.js.map +1 -1
- package/dist/units/composite.cjs +12 -12
- package/dist/units/composite.cjs.map +1 -1
- package/dist/units/composite.js +12 -12
- package/dist/units/composite.js.map +1 -1
- package/dist/units/index.cjs +7 -11
- package/dist/units/index.cjs.map +1 -1
- package/dist/units/index.d.ts +0 -1
- package/dist/units/index.js +4 -9
- package/dist/units/index.js.map +1 -1
- package/package.json +10 -31
- package/src/animated-age-window.ts +120 -0
- package/src/column.ts +24 -0
- package/src/correlation-chart/main.ts +30 -8
- package/src/data-provider/store.ts +21 -2
- package/src/index.ts +4 -1
- package/src/prepare-units/composite-scale.ts +210 -10
- package/src/prepare-units/helpers.ts +0 -2
- package/src/prepare-units/index.ts +68 -14
- package/src/prepare-units/types.ts +13 -0
- package/src/section.ts +6 -0
- package/src/units/boxes.ts +37 -56
- package/src/units/composite.ts +21 -12
- package/src/units/index.ts +9 -26
- package/dist/maps/column-correlation/core.cjs +0 -288
- package/dist/maps/column-correlation/core.cjs.map +0 -1
- package/dist/maps/column-correlation/core.d.ts +0 -9
- package/dist/maps/column-correlation/core.js +0 -286
- package/dist/maps/column-correlation/core.js.map +0 -1
- package/dist/maps/column-correlation/index.d.ts +0 -2
- package/dist/maps/column-correlation/state.cjs +0 -193
- package/dist/maps/column-correlation/state.cjs.map +0 -1
- package/dist/maps/column-correlation/state.d.ts +0 -62
- package/dist/maps/column-correlation/state.js +0 -190
- package/dist/maps/column-correlation/state.js.map +0 -1
- package/dist/maps/column-navigation/index.d.ts +0 -2
- package/dist/maps/column-navigation/mapbox/index.cjs +0 -215
- package/dist/maps/column-navigation/mapbox/index.cjs.map +0 -1
- package/dist/maps/column-navigation/mapbox/index.d.ts +0 -38
- package/dist/maps/column-navigation/mapbox/index.js +0 -213
- package/dist/maps/column-navigation/mapbox/index.js.map +0 -1
- package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs +0 -105
- package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs.map +0 -1
- package/dist/maps/column-navigation/mapbox/keyboard-navigation.d.ts +0 -8
- package/dist/maps/column-navigation/mapbox/keyboard-navigation.js +0 -105
- package/dist/maps/column-navigation/mapbox/keyboard-navigation.js.map +0 -1
- package/dist/maps/column-navigation/mapbox/state.cjs +0 -73
- package/dist/maps/column-navigation/mapbox/state.cjs.map +0 -1
- package/dist/maps/column-navigation/mapbox/state.d.ts +0 -23
- package/dist/maps/column-navigation/mapbox/state.js +0 -71
- package/dist/maps/column-navigation/mapbox/state.js.map +0 -1
- package/dist/maps/column-navigation/svg/animated.d.ts +0 -1
- package/dist/maps/column-navigation/svg/data-fetcher.cjs +0 -25
- package/dist/maps/column-navigation/svg/data-fetcher.cjs.map +0 -1
- package/dist/maps/column-navigation/svg/data-fetcher.d.ts +0 -6
- package/dist/maps/column-navigation/svg/data-fetcher.js +0 -25
- package/dist/maps/column-navigation/svg/data-fetcher.js.map +0 -1
- package/dist/maps/column-navigation/svg/index.cjs +0 -94
- package/dist/maps/column-navigation/svg/index.cjs.map +0 -1
- package/dist/maps/column-navigation/svg/index.d.ts +0 -9
- package/dist/maps/column-navigation/svg/index.js +0 -93
- package/dist/maps/column-navigation/svg/index.js.map +0 -1
- package/dist/maps/column-navigation/svg/layers.cjs +0 -177
- package/dist/maps/column-navigation/svg/layers.cjs.map +0 -1
- package/dist/maps/column-navigation/svg/layers.d.ts +0 -54
- package/dist/maps/column-navigation/svg/layers.js +0 -174
- package/dist/maps/column-navigation/svg/layers.js.map +0 -1
- package/dist/maps/column-navigation/utils/keyboard-navigation.cjs +0 -50
- package/dist/maps/column-navigation/utils/keyboard-navigation.cjs.map +0 -1
- package/dist/maps/column-navigation/utils/keyboard-navigation.d.ts +0 -10
- package/dist/maps/column-navigation/utils/keyboard-navigation.js +0 -50
- package/dist/maps/column-navigation/utils/keyboard-navigation.js.map +0 -1
- package/dist/maps/index.d.ts +0 -4
- package/dist/maps/inset-map/index.cjs +0 -71
- package/dist/maps/inset-map/index.cjs.map +0 -1
- package/dist/maps/inset-map/index.d.ts +0 -16
- package/dist/maps/inset-map/index.js +0 -69
- package/dist/maps/inset-map/index.js.map +0 -1
- package/dist/maps/layers/columns.cjs +0 -165
- package/dist/maps/layers/columns.cjs.map +0 -1
- package/dist/maps/layers/columns.d.ts +0 -28
- package/dist/maps/layers/columns.js +0 -165
- package/dist/maps/layers/columns.js.map +0 -1
- package/dist/maps/layers/index.d.ts +0 -2
- package/dist/maps/layers/units.cjs +0 -207
- package/dist/maps/layers/units.cjs.map +0 -1
- package/dist/maps/layers/units.d.ts +0 -14
- package/dist/maps/layers/units.js +0 -204
- package/dist/maps/layers/units.js.map +0 -1
- package/dist/units/colors.cjs +0 -115
- package/dist/units/colors.cjs.map +0 -1
- package/dist/units/colors.d.ts +0 -20
- package/dist/units/colors.js +0 -113
- package/dist/units/colors.js.map +0 -1
- package/dist/units/resolvers.cjs +0 -125
- package/dist/units/resolvers.cjs.map +0 -1
- package/dist/units/resolvers.d.ts +0 -8
- package/dist/units/resolvers.js +0 -125
- package/dist/units/resolvers.js.map +0 -1
- package/src/maps/column-correlation/column-correlation-map.stories.ts +0 -108
- package/src/maps/column-correlation/core.ts +0 -342
- package/src/maps/column-correlation/index.ts +0 -2
- package/src/maps/column-correlation/state.ts +0 -315
- package/src/maps/column-navigation/index.ts +0 -2
- package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +0 -278
- package/src/maps/column-navigation/mapbox/index.ts +0 -276
- package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +0 -133
- package/src/maps/column-navigation/mapbox/state.ts +0 -119
- package/src/maps/column-navigation/svg/animated.ts +0 -78
- package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +0 -46
- package/src/maps/column-navigation/svg/data-fetcher.ts +0 -34
- package/src/maps/column-navigation/svg/index.ts +0 -96
- package/src/maps/column-navigation/svg/layers.ts +0 -233
- package/src/maps/column-navigation/utils/keyboard-navigation.ts +0 -58
- package/src/maps/index.ts +0 -4
- package/src/maps/inset-map/index.ts +0 -87
- package/src/maps/inset-map/inset-map.stories.ts +0 -20
- package/src/maps/layers/columns.ts +0 -216
- package/src/maps/layers/index.ts +0 -2
- package/src/maps/layers/units.ts +0 -286
- package/src/maps/unit-map.stories.ts +0 -79
- package/src/units/colors.ts +0 -183
- package/src/units/resolvers.ts +0 -141
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { useMapStyleOperator, useMapRef } from "@macrostrat/mapbox-react";
|
|
2
|
-
import h from "@macrostrat/hyper";
|
|
3
|
-
import { useCallback, useRef, useMemo, useEffect } from "react";
|
|
4
|
-
import { ColumnNavigationProvider, useColumnNavigationStore } from "./state.js";
|
|
5
|
-
import { InsetMap } from "../../inset-map/index.js";
|
|
6
|
-
import { geoCentroid } from "d3-geo";
|
|
7
|
-
import { ColumnKeyboardNavigation } from "./keyboard-navigation.js";
|
|
8
|
-
import { SelectedColumnOverlay, BaseColumnsLayer } from "../../layers/columns.js";
|
|
9
|
-
function ColumnNavigationMap(props) {
|
|
10
|
-
const {
|
|
11
|
-
padding = 50,
|
|
12
|
-
children,
|
|
13
|
-
columnColor,
|
|
14
|
-
showTriangulation,
|
|
15
|
-
triangulationColor,
|
|
16
|
-
keyboardNavigation = true,
|
|
17
|
-
columns,
|
|
18
|
-
columnIDs,
|
|
19
|
-
onSelectColumn,
|
|
20
|
-
onHoverColumn,
|
|
21
|
-
selectedColumn,
|
|
22
|
-
hoveredColumn,
|
|
23
|
-
projectID,
|
|
24
|
-
inProcess,
|
|
25
|
-
...rest
|
|
26
|
-
} = props;
|
|
27
|
-
return h(
|
|
28
|
-
InsetMap,
|
|
29
|
-
{
|
|
30
|
-
...rest,
|
|
31
|
-
boxZoom: false,
|
|
32
|
-
dragRotate: false
|
|
33
|
-
},
|
|
34
|
-
[
|
|
35
|
-
h(ColumnsNavigationLayer, {
|
|
36
|
-
color: columnColor,
|
|
37
|
-
columns,
|
|
38
|
-
columnIDs,
|
|
39
|
-
onSelectColumn,
|
|
40
|
-
onHoverColumn,
|
|
41
|
-
selectedColumn,
|
|
42
|
-
hoveredColumn,
|
|
43
|
-
projectID,
|
|
44
|
-
inProcess,
|
|
45
|
-
keyboardNavigation,
|
|
46
|
-
showTriangulation,
|
|
47
|
-
triangulationColor
|
|
48
|
-
}),
|
|
49
|
-
children
|
|
50
|
-
]
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
function ColumnsNavigationLayer(props) {
|
|
54
|
-
const {
|
|
55
|
-
enabled,
|
|
56
|
-
color,
|
|
57
|
-
keyboardNavigation,
|
|
58
|
-
showTriangulation,
|
|
59
|
-
triangulationColor,
|
|
60
|
-
...providerProps
|
|
61
|
-
} = props;
|
|
62
|
-
return h(ColumnNavigationProvider, providerProps, [
|
|
63
|
-
h(_ColumnsNavigationLayer, { enabled, color }),
|
|
64
|
-
h.if(keyboardNavigation)(ColumnKeyboardNavigation, {
|
|
65
|
-
showTriangulation,
|
|
66
|
-
triangulationColor
|
|
67
|
-
})
|
|
68
|
-
]);
|
|
69
|
-
}
|
|
70
|
-
const columnLayers = ["columns-points", "columns-fill"];
|
|
71
|
-
function _ColumnsNavigationLayer({ enabled = true, color }) {
|
|
72
|
-
const columns = useColumnNavigationStore((state) => state.columns);
|
|
73
|
-
const selectedColumnID = useColumnNavigationStore(
|
|
74
|
-
(state) => state.selectedColumn
|
|
75
|
-
);
|
|
76
|
-
const selectColumn = useColumnNavigationStore((state) => state.selectColumn);
|
|
77
|
-
const setHoveredColumn = useColumnNavigationStore(
|
|
78
|
-
(state) => state.setHoveredColumn
|
|
79
|
-
);
|
|
80
|
-
const onHover = useCallback(
|
|
81
|
-
(event) => setHoveredColumn(event.features?.[0]?.id),
|
|
82
|
-
[setHoveredColumn]
|
|
83
|
-
);
|
|
84
|
-
const onSelectColumn = useCallback(
|
|
85
|
-
(column) => selectColumn(column.id),
|
|
86
|
-
[selectColumn]
|
|
87
|
-
);
|
|
88
|
-
const selectedColumnFeature = useMemo(() => {
|
|
89
|
-
if (columns == null || selectedColumnID == null) return null;
|
|
90
|
-
return columns.find((d) => d.id == selectedColumnID);
|
|
91
|
-
}, [selectedColumnID, columns]);
|
|
92
|
-
return h([
|
|
93
|
-
h(BaseColumnsLayer, { enabled, color, columns }),
|
|
94
|
-
h(ColumnSelectionManager, {
|
|
95
|
-
selectedColumn: selectedColumnFeature,
|
|
96
|
-
onSelectColumn
|
|
97
|
-
}),
|
|
98
|
-
h(ColumnHoverInteraction, { onHover })
|
|
99
|
-
]);
|
|
100
|
-
}
|
|
101
|
-
function ColumnSelectionManager({
|
|
102
|
-
selectedColumn,
|
|
103
|
-
onSelectColumn,
|
|
104
|
-
centerOnSelect = true
|
|
105
|
-
}) {
|
|
106
|
-
const onClick = useCallback(
|
|
107
|
-
(event) => {
|
|
108
|
-
if (event.features.length == 0) return;
|
|
109
|
-
const selectedColumn2 = event.features[0];
|
|
110
|
-
onSelectColumn(selectedColumn2);
|
|
111
|
-
},
|
|
112
|
-
[onSelectColumn]
|
|
113
|
-
);
|
|
114
|
-
return h([
|
|
115
|
-
h.if(centerOnSelect)(SelectedColumnCenterer, {
|
|
116
|
-
selectedColumn
|
|
117
|
-
}),
|
|
118
|
-
h(SelectedColumnOverlay, { selectedColumn }),
|
|
119
|
-
h(ClickInteraction, {
|
|
120
|
-
onClick,
|
|
121
|
-
layers: columnLayers
|
|
122
|
-
})
|
|
123
|
-
]);
|
|
124
|
-
}
|
|
125
|
-
function ColumnHoverInteraction({ onHover }) {
|
|
126
|
-
return h(HoverInteraction, { onHover, layers: columnLayers });
|
|
127
|
-
}
|
|
128
|
-
function ClickInteraction({ onClick, layers }) {
|
|
129
|
-
useMapStyleOperator(
|
|
130
|
-
(map) => {
|
|
131
|
-
map.on("click", layers, onClick);
|
|
132
|
-
return () => {
|
|
133
|
-
map.off("click", layers, onClick);
|
|
134
|
-
};
|
|
135
|
-
},
|
|
136
|
-
[layers, onClick]
|
|
137
|
-
);
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
function HoverInteraction({ onHover, layers }) {
|
|
141
|
-
const hoveredFeaturesRef = useRef([]);
|
|
142
|
-
const updateFeatureState = useCallback((map, features) => {
|
|
143
|
-
for (const f of hoveredFeaturesRef.current) {
|
|
144
|
-
map.setFeatureState(
|
|
145
|
-
{ source: f.source, id: f.id, sourceLayer: f.sourceLayer },
|
|
146
|
-
{ hover: false }
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
for (const f of features) {
|
|
150
|
-
map.setFeatureState(
|
|
151
|
-
{ source: f.source, id: f.id, sourceLayer: f.sourceLayer },
|
|
152
|
-
{ hover: true }
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
hoveredFeaturesRef.current = features;
|
|
156
|
-
}, []);
|
|
157
|
-
useMapStyleOperator(
|
|
158
|
-
(map) => {
|
|
159
|
-
const mouseMove = (event) => {
|
|
160
|
-
if (event.features.length == 0) return;
|
|
161
|
-
onHover?.(event);
|
|
162
|
-
updateFeatureState(map, event.features);
|
|
163
|
-
map.getCanvas().style.cursor = "pointer";
|
|
164
|
-
};
|
|
165
|
-
const mouseLeave = (event) => {
|
|
166
|
-
onHover?.(event);
|
|
167
|
-
updateFeatureState(map, event.features ?? []);
|
|
168
|
-
map.getCanvas().style.cursor = "";
|
|
169
|
-
};
|
|
170
|
-
map.on("mousemove", layers, mouseMove);
|
|
171
|
-
map.on("mouseleave", layers, mouseLeave);
|
|
172
|
-
return () => {
|
|
173
|
-
map.off("mouseenter", layers, mouseMove);
|
|
174
|
-
map.off("mouseleave", layers, mouseLeave);
|
|
175
|
-
};
|
|
176
|
-
},
|
|
177
|
-
[layers, onHover]
|
|
178
|
-
);
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
function SelectedColumnCenterer({
|
|
182
|
-
selectedColumn,
|
|
183
|
-
easeDuration = 500
|
|
184
|
-
}) {
|
|
185
|
-
const columnCenter = useMemo(() => {
|
|
186
|
-
const columnGeometry = selectedColumn?.geometry;
|
|
187
|
-
if (columnGeometry == null) return null;
|
|
188
|
-
return geoCentroid(columnGeometry);
|
|
189
|
-
}, [selectedColumn]);
|
|
190
|
-
const mapRef = useMapRef();
|
|
191
|
-
const map = mapRef.current;
|
|
192
|
-
const initialRenderRef = useRef(true);
|
|
193
|
-
useEffect(() => {
|
|
194
|
-
if (map == null) return;
|
|
195
|
-
const isInitialRender = initialRenderRef.current;
|
|
196
|
-
if (isInitialRender) initialRenderRef.current = false;
|
|
197
|
-
if (columnCenter == null) return;
|
|
198
|
-
if (isInitialRender) {
|
|
199
|
-
map.setCenter(columnCenter);
|
|
200
|
-
initialRenderRef.current = false;
|
|
201
|
-
} else {
|
|
202
|
-
map.easeTo({ center: columnCenter }, { duration: easeDuration });
|
|
203
|
-
}
|
|
204
|
-
}, [mapRef.current, columnCenter]);
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
export {
|
|
208
|
-
ColumnHoverInteraction,
|
|
209
|
-
ColumnNavigationMap,
|
|
210
|
-
ColumnSelectionManager,
|
|
211
|
-
ColumnsNavigationLayer
|
|
212
|
-
};
|
|
213
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/maps/column-navigation/mapbox/index.ts"],"sourcesContent":["import { useMapRef, useMapStyleOperator } from \"@macrostrat/mapbox-react\";\nimport h from \"@macrostrat/hyper\";\nimport { ReactNode, useCallback, useEffect, useMemo, useRef } from \"react\";\n\nimport {\n ColumnNavigationProvider,\n NavigationProviderProps,\n useColumnNavigationStore,\n} from \"./state\";\nimport { InsetMap, type InsetMapProps } from \"../../inset-map\";\nimport { geoCentroid } from \"d3-geo\";\nimport { BaseColumnsLayer, SelectedColumnOverlay } from \"../../layers\";\nimport { ColumnKeyboardNavigation } from \"./keyboard-navigation\";\nimport type { ColumnFeature } from \"../../layers\";\n\nexport interface ColumnNavigationMapProps extends InsetMapProps {\n padding?: number;\n children?: ReactNode;\n accessToken?: string;\n selectedColumn?: number;\n hoveredColumn?: number;\n onSelectColumn?: (colID: number | null) => void;\n onHoverColumn?: (colID: number | null) => void;\n showTriangulation?: boolean;\n columnColor?: string;\n}\n\nexport function ColumnNavigationMap(\n props: ColumnNavigationMapProps & NavigationProviderProps,\n) {\n const {\n padding = 50,\n children,\n columnColor,\n showTriangulation,\n triangulationColor,\n keyboardNavigation = true,\n columns,\n columnIDs,\n onSelectColumn,\n onHoverColumn,\n selectedColumn,\n hoveredColumn,\n projectID,\n inProcess,\n ...rest\n } = props;\n\n return h(\n InsetMap,\n {\n ...rest,\n boxZoom: false,\n dragRotate: false,\n },\n [\n h(ColumnsNavigationLayer, {\n color: columnColor,\n columns,\n columnIDs,\n onSelectColumn,\n onHoverColumn,\n selectedColumn,\n hoveredColumn,\n projectID,\n inProcess,\n keyboardNavigation,\n showTriangulation,\n triangulationColor,\n }),\n children,\n ],\n );\n}\n\ninterface ColumnLayerProps {\n enabled?: boolean;\n color?: string;\n}\n\ninterface ColumnKeyboardNavigationProps {\n triangulationColor?: string;\n keyboardNavigation?: boolean;\n showTriangulation?: boolean;\n}\n\nexport function ColumnsNavigationLayer(\n props: NavigationProviderProps &\n ColumnLayerProps &\n ColumnKeyboardNavigationProps,\n) {\n const {\n enabled,\n color,\n keyboardNavigation,\n showTriangulation,\n triangulationColor,\n ...providerProps\n } = props;\n\n return h(ColumnNavigationProvider, providerProps, [\n h(_ColumnsNavigationLayer, { enabled, color }),\n h.if(keyboardNavigation)(ColumnKeyboardNavigation, {\n showTriangulation,\n triangulationColor,\n }),\n ]);\n}\n\nconst columnLayers = [\"columns-points\", \"columns-fill\"];\n\nfunction _ColumnsNavigationLayer({ enabled = true, color }) {\n const columns = useColumnNavigationStore((state) => state.columns);\n const selectedColumnID = useColumnNavigationStore(\n (state) => state.selectedColumn,\n );\n const selectColumn = useColumnNavigationStore((state) => state.selectColumn);\n const setHoveredColumn = useColumnNavigationStore(\n (state) => state.setHoveredColumn,\n );\n\n const onHover = useCallback(\n (event) => setHoveredColumn(event.features?.[0]?.id),\n [setHoveredColumn],\n );\n\n /** Convert features into column IDs to pass to the selection manager */\n const onSelectColumn = useCallback(\n (column) => selectColumn(column.id),\n [selectColumn],\n );\n\n const selectedColumnFeature = useMemo(() => {\n if (columns == null || selectedColumnID == null) return null;\n return columns.find((d) => d.id == selectedColumnID);\n }, [selectedColumnID, columns]);\n\n return h([\n h(BaseColumnsLayer, { enabled, color, columns }),\n h(ColumnSelectionManager, {\n selectedColumn: selectedColumnFeature,\n onSelectColumn,\n }),\n h(ColumnHoverInteraction, { onHover }),\n ]);\n}\n\nexport function ColumnSelectionManager({\n selectedColumn,\n onSelectColumn,\n centerOnSelect = true,\n}: {\n selectedColumn: ColumnFeature;\n onSelectColumn: (column: ColumnFeature) => void;\n centerOnSelect?: boolean;\n}) {\n const onClick = useCallback(\n (event) => {\n if (event.features.length == 0) return;\n const selectedColumn = event.features[0];\n onSelectColumn(selectedColumn);\n },\n [onSelectColumn],\n );\n\n return h([\n h.if(centerOnSelect)(SelectedColumnCenterer, {\n selectedColumn,\n }),\n h(SelectedColumnOverlay, { selectedColumn }),\n h(ClickInteraction, {\n onClick,\n layers: columnLayers,\n }),\n ]);\n}\n\nexport function ColumnHoverInteraction({ onHover }) {\n return h(HoverInteraction, { onHover, layers: columnLayers });\n}\n\nfunction ClickInteraction({ onClick, layers }) {\n useMapStyleOperator(\n (map) => {\n // Setup hover styles on map\n map.on(\"click\", layers, onClick);\n return () => {\n map.off(\"click\", layers, onClick);\n };\n },\n [layers, onClick],\n );\n return null;\n}\n\nfunction HoverInteraction({ onHover, layers }) {\n const hoveredFeaturesRef = useRef([]);\n const updateFeatureState = useCallback((map, features) => {\n // Reset hover state for previously hovered features\n for (const f of hoveredFeaturesRef.current) {\n map.setFeatureState(\n { source: f.source, id: f.id, sourceLayer: f.sourceLayer },\n { hover: false },\n );\n }\n // Set hover state for new features\n for (const f of features) {\n map.setFeatureState(\n { source: f.source, id: f.id, sourceLayer: f.sourceLayer },\n { hover: true },\n );\n }\n hoveredFeaturesRef.current = features;\n }, []);\n\n useMapStyleOperator(\n (map) => {\n const mouseMove = (event) => {\n if (event.features.length == 0) return;\n onHover?.(event);\n updateFeatureState(map, event.features);\n map.getCanvas().style.cursor = \"pointer\";\n };\n const mouseLeave = (event) => {\n onHover?.(event);\n updateFeatureState(map, event.features ?? []);\n map.getCanvas().style.cursor = \"\";\n };\n\n // Setup hover styles on map\n map.on(\"mousemove\", layers, mouseMove);\n map.on(\"mouseleave\", layers, mouseLeave);\n\n return () => {\n map.off(\"mouseenter\", layers, mouseMove);\n map.off(\"mouseleave\", layers, mouseLeave);\n };\n },\n [layers, onHover],\n );\n return null;\n}\n\nfunction SelectedColumnCenterer({\n selectedColumn,\n easeDuration = 500,\n}: {\n selectedColumn: ColumnFeature;\n easeDuration?: number;\n}) {\n const columnCenter = useMemo(() => {\n const columnGeometry = selectedColumn?.geometry;\n if (columnGeometry == null) return null;\n return geoCentroid(columnGeometry);\n }, [selectedColumn]);\n\n const mapRef = useMapRef();\n const map = mapRef.current;\n const initialRenderRef = useRef(true);\n // Center the map on the selected column when it changes\n useEffect(() => {\n if (map == null) return;\n const isInitialRender = initialRenderRef.current;\n if (isInitialRender) initialRenderRef.current = false;\n // If this is the first render of the map, jump to the location. Otherwise, ease to it.\n if (columnCenter == null) return;\n if (isInitialRender) {\n map.setCenter(columnCenter);\n initialRenderRef.current = false;\n } else {\n map.easeTo({ center: columnCenter }, { duration: easeDuration });\n }\n }, [mapRef.current, columnCenter]);\n\n return null;\n}\n"],"names":["selectedColumn"],"mappings":"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"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const React = require("react");
|
|
4
|
-
const mapboxUtils = require("@macrostrat/mapbox-utils");
|
|
5
|
-
const mapboxReact = require("@macrostrat/mapbox-react");
|
|
6
|
-
const state = require("./state.cjs");
|
|
7
|
-
const keyboardNavigation = require("../utils/keyboard-navigation.cjs");
|
|
8
|
-
function ColumnKeyboardNavigation(props) {
|
|
9
|
-
const { showTriangulation = false, triangulationColor } = props;
|
|
10
|
-
const columns = state.useColumnNavigationStore((state2) => state2.columns);
|
|
11
|
-
const col_id = state.useColumnNavigationStore((state2) => state2.selectedColumn);
|
|
12
|
-
const selectColumn = state.useColumnNavigationStore((state2) => state2.selectColumn);
|
|
13
|
-
const voronoi = React.useMemo(() => {
|
|
14
|
-
if (!columns || columns.length == 0) return null;
|
|
15
|
-
return keyboardNavigation.buildTriangulation(columns);
|
|
16
|
-
}, [columns]);
|
|
17
|
-
const mapRef = mapboxReact.useMapRef();
|
|
18
|
-
const map = mapRef.current;
|
|
19
|
-
mapboxReact.useOverlayStyle(() => {
|
|
20
|
-
if (!showTriangulation) return null;
|
|
21
|
-
return buildKeyboardNavigationStyle(
|
|
22
|
-
triangulationColor
|
|
23
|
-
);
|
|
24
|
-
}, [triangulationColor, showTriangulation]);
|
|
25
|
-
const keyMapping = React.useMemo(() => {
|
|
26
|
-
if (columns == null || voronoi == null || map == null) return null;
|
|
27
|
-
const projection = (d) => {
|
|
28
|
-
const pt = map.project(d);
|
|
29
|
-
return [pt.x, pt.y];
|
|
30
|
-
};
|
|
31
|
-
const currentIndex = columns.findIndex(
|
|
32
|
-
(d) => d.properties.col_id == col_id
|
|
33
|
-
);
|
|
34
|
-
const neighbors = voronoi.tri.delaunay.neighbors[currentIndex];
|
|
35
|
-
return keyboardNavigation.buildKeyMapping(
|
|
36
|
-
neighbors,
|
|
37
|
-
voronoi.centroids,
|
|
38
|
-
currentIndex,
|
|
39
|
-
projection
|
|
40
|
-
);
|
|
41
|
-
}, [col_id, columns, voronoi, map]);
|
|
42
|
-
const onKeyDown = React.useCallback(
|
|
43
|
-
(event) => {
|
|
44
|
-
if (keyMapping == null) return;
|
|
45
|
-
const nextColumnIx = keyMapping[event.which];
|
|
46
|
-
if (nextColumnIx == null) return;
|
|
47
|
-
event.preventDefault();
|
|
48
|
-
event.stopPropagation();
|
|
49
|
-
selectColumn(columns[nextColumnIx].id);
|
|
50
|
-
return false;
|
|
51
|
-
},
|
|
52
|
-
[keyMapping, selectColumn]
|
|
53
|
-
);
|
|
54
|
-
React.useEffect(() => {
|
|
55
|
-
if (map == null) return;
|
|
56
|
-
const canvas = map.getCanvas();
|
|
57
|
-
canvas.addEventListener("keydown", onKeyDown);
|
|
58
|
-
return () => {
|
|
59
|
-
canvas.removeEventListener("keydown", onKeyDown);
|
|
60
|
-
};
|
|
61
|
-
}, [map, onKeyDown]);
|
|
62
|
-
mapboxReact.useMapStyleOperator(
|
|
63
|
-
(map2) => {
|
|
64
|
-
if (voronoi == null || !showTriangulation) return;
|
|
65
|
-
const { features } = voronoi.tri.links();
|
|
66
|
-
mapboxUtils.setGeoJSON(map2, "column-links", {
|
|
67
|
-
type: "FeatureCollection",
|
|
68
|
-
features
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
[voronoi, showTriangulation]
|
|
72
|
-
);
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
function buildKeyboardNavigationStyle(color = "purple") {
|
|
76
|
-
return {
|
|
77
|
-
sources: {
|
|
78
|
-
"column-links": mapboxUtils.buildGeoJSONSource()
|
|
79
|
-
//neighbors: buildGeoJSONSource(),
|
|
80
|
-
},
|
|
81
|
-
layers: [
|
|
82
|
-
{
|
|
83
|
-
id: "column-links",
|
|
84
|
-
type: "line",
|
|
85
|
-
source: "column-links",
|
|
86
|
-
paint: {
|
|
87
|
-
"line-color": color,
|
|
88
|
-
"line-width": 1.5
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
id: "column-centers",
|
|
93
|
-
type: "circle",
|
|
94
|
-
source: "column-links",
|
|
95
|
-
paint: {
|
|
96
|
-
"circle-radius": 2,
|
|
97
|
-
"circle-color": color
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
]
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
exports.ColumnKeyboardNavigation = ColumnKeyboardNavigation;
|
|
104
|
-
exports.buildKeyboardNavigationStyle = buildKeyboardNavigationStyle;
|
|
105
|
-
//# sourceMappingURL=keyboard-navigation.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard-navigation.cjs","sources":["../../../../src/maps/column-navigation/mapbox/keyboard-navigation.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from \"react\";\nimport { buildGeoJSONSource, setGeoJSON } from \"@macrostrat/mapbox-utils\";\nimport {\n useMapRef,\n useMapStyleOperator,\n useOverlayStyle,\n} from \"@macrostrat/mapbox-react\";\nimport { useColumnNavigationStore } from \"./state\";\nimport {\n buildTriangulation,\n buildKeyMapping,\n} from \"../utils/keyboard-navigation\";\nimport { StyleSpecification } from \"mapbox-gl\";\n\ninterface KeyboardNavProps {\n showTriangulation: boolean;\n triangulationColor?: string;\n}\n\nexport function ColumnKeyboardNavigation(props: KeyboardNavProps) {\n /** Keyboard navigation of columns using a Delaunay triangulation */\n const { showTriangulation = false, triangulationColor } = props;\n const columns = useColumnNavigationStore((state) => state.columns);\n const col_id = useColumnNavigationStore((state) => state.selectedColumn);\n const selectColumn = useColumnNavigationStore((state) => state.selectColumn);\n\n const voronoi = useMemo(() => {\n if (!columns || columns.length == 0) return null;\n return buildTriangulation(columns);\n }, [columns]);\n\n const mapRef = useMapRef();\n const map = mapRef.current;\n\n // Set up overlay style for triangulation\n useOverlayStyle(() => {\n if (!showTriangulation) return null;\n return buildKeyboardNavigationStyle(\n triangulationColor,\n ) as Partial<StyleSpecification>;\n }, [triangulationColor, showTriangulation]);\n\n const keyMapping = useMemo(() => {\n if (columns == null || voronoi == null || map == null) return null;\n\n const projection = (d) => {\n const pt = map.project(d);\n return [pt.x, pt.y];\n };\n\n const currentIndex = columns.findIndex(\n (d) => d.properties.col_id == col_id,\n );\n\n const neighbors = voronoi.tri.delaunay.neighbors[currentIndex];\n return buildKeyMapping(\n neighbors,\n voronoi.centroids,\n currentIndex,\n projection,\n );\n }, [col_id, columns, voronoi, map]);\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (keyMapping == null) return;\n const nextColumnIx = keyMapping[event.which];\n if (nextColumnIx == null) return;\n event.preventDefault();\n event.stopPropagation();\n // @ts-ignore\n selectColumn(columns[nextColumnIx].id);\n return false;\n },\n [keyMapping, selectColumn],\n );\n\n useEffect(() => {\n if (map == null) return;\n const canvas = map.getCanvas();\n canvas.addEventListener(\"keydown\", onKeyDown);\n return () => {\n canvas.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [map, onKeyDown]);\n\n useMapStyleOperator(\n (map) => {\n if (voronoi == null || !showTriangulation) return;\n const { features } = voronoi.tri.links();\n\n setGeoJSON(map, \"column-links\", {\n type: \"FeatureCollection\",\n features,\n });\n },\n [voronoi, showTriangulation],\n );\n\n //if (neighbors == null) return null;\n //const neighborFeatures = neighbors.map((d) => features[d]);\n\n return null;\n}\n\nexport function buildKeyboardNavigationStyle(color: string = \"purple\") {\n return {\n sources: {\n \"column-links\": buildGeoJSONSource(),\n //neighbors: buildGeoJSONSource(),\n },\n layers: [\n {\n id: \"column-links\",\n type: \"line\",\n source: \"column-links\",\n paint: {\n \"line-color\": color,\n \"line-width\": 1.5,\n },\n },\n {\n id: \"column-centers\",\n type: \"circle\",\n source: \"column-links\",\n paint: {\n \"circle-radius\": 2,\n \"circle-color\": color,\n },\n },\n ],\n } as Partial<StyleSpecification>;\n}\n"],"names":["useColumnNavigationStore","state","useMemo","buildTriangulation","useMapRef","useOverlayStyle","buildKeyMapping","useCallback","useEffect","useMapStyleOperator","map","setGeoJSON","buildGeoJSONSource"],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { StyleSpecification } from 'mapbox-gl';
|
|
2
|
-
interface KeyboardNavProps {
|
|
3
|
-
showTriangulation: boolean;
|
|
4
|
-
triangulationColor?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function ColumnKeyboardNavigation(props: KeyboardNavProps): null;
|
|
7
|
-
export declare function buildKeyboardNavigationStyle(color?: string): Partial<StyleSpecification>;
|
|
8
|
-
export {};
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { useMemo, useCallback, useEffect } from "react";
|
|
2
|
-
import { setGeoJSON, buildGeoJSONSource } from "@macrostrat/mapbox-utils";
|
|
3
|
-
import { useMapRef, useOverlayStyle, useMapStyleOperator } from "@macrostrat/mapbox-react";
|
|
4
|
-
import { useColumnNavigationStore } from "./state.js";
|
|
5
|
-
import { buildTriangulation, buildKeyMapping } from "../utils/keyboard-navigation.js";
|
|
6
|
-
function ColumnKeyboardNavigation(props) {
|
|
7
|
-
const { showTriangulation = false, triangulationColor } = props;
|
|
8
|
-
const columns = useColumnNavigationStore((state) => state.columns);
|
|
9
|
-
const col_id = useColumnNavigationStore((state) => state.selectedColumn);
|
|
10
|
-
const selectColumn = useColumnNavigationStore((state) => state.selectColumn);
|
|
11
|
-
const voronoi = useMemo(() => {
|
|
12
|
-
if (!columns || columns.length == 0) return null;
|
|
13
|
-
return buildTriangulation(columns);
|
|
14
|
-
}, [columns]);
|
|
15
|
-
const mapRef = useMapRef();
|
|
16
|
-
const map = mapRef.current;
|
|
17
|
-
useOverlayStyle(() => {
|
|
18
|
-
if (!showTriangulation) return null;
|
|
19
|
-
return buildKeyboardNavigationStyle(
|
|
20
|
-
triangulationColor
|
|
21
|
-
);
|
|
22
|
-
}, [triangulationColor, showTriangulation]);
|
|
23
|
-
const keyMapping = useMemo(() => {
|
|
24
|
-
if (columns == null || voronoi == null || map == null) return null;
|
|
25
|
-
const projection = (d) => {
|
|
26
|
-
const pt = map.project(d);
|
|
27
|
-
return [pt.x, pt.y];
|
|
28
|
-
};
|
|
29
|
-
const currentIndex = columns.findIndex(
|
|
30
|
-
(d) => d.properties.col_id == col_id
|
|
31
|
-
);
|
|
32
|
-
const neighbors = voronoi.tri.delaunay.neighbors[currentIndex];
|
|
33
|
-
return buildKeyMapping(
|
|
34
|
-
neighbors,
|
|
35
|
-
voronoi.centroids,
|
|
36
|
-
currentIndex,
|
|
37
|
-
projection
|
|
38
|
-
);
|
|
39
|
-
}, [col_id, columns, voronoi, map]);
|
|
40
|
-
const onKeyDown = useCallback(
|
|
41
|
-
(event) => {
|
|
42
|
-
if (keyMapping == null) return;
|
|
43
|
-
const nextColumnIx = keyMapping[event.which];
|
|
44
|
-
if (nextColumnIx == null) return;
|
|
45
|
-
event.preventDefault();
|
|
46
|
-
event.stopPropagation();
|
|
47
|
-
selectColumn(columns[nextColumnIx].id);
|
|
48
|
-
return false;
|
|
49
|
-
},
|
|
50
|
-
[keyMapping, selectColumn]
|
|
51
|
-
);
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (map == null) return;
|
|
54
|
-
const canvas = map.getCanvas();
|
|
55
|
-
canvas.addEventListener("keydown", onKeyDown);
|
|
56
|
-
return () => {
|
|
57
|
-
canvas.removeEventListener("keydown", onKeyDown);
|
|
58
|
-
};
|
|
59
|
-
}, [map, onKeyDown]);
|
|
60
|
-
useMapStyleOperator(
|
|
61
|
-
(map2) => {
|
|
62
|
-
if (voronoi == null || !showTriangulation) return;
|
|
63
|
-
const { features } = voronoi.tri.links();
|
|
64
|
-
setGeoJSON(map2, "column-links", {
|
|
65
|
-
type: "FeatureCollection",
|
|
66
|
-
features
|
|
67
|
-
});
|
|
68
|
-
},
|
|
69
|
-
[voronoi, showTriangulation]
|
|
70
|
-
);
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
function buildKeyboardNavigationStyle(color = "purple") {
|
|
74
|
-
return {
|
|
75
|
-
sources: {
|
|
76
|
-
"column-links": buildGeoJSONSource()
|
|
77
|
-
//neighbors: buildGeoJSONSource(),
|
|
78
|
-
},
|
|
79
|
-
layers: [
|
|
80
|
-
{
|
|
81
|
-
id: "column-links",
|
|
82
|
-
type: "line",
|
|
83
|
-
source: "column-links",
|
|
84
|
-
paint: {
|
|
85
|
-
"line-color": color,
|
|
86
|
-
"line-width": 1.5
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
id: "column-centers",
|
|
91
|
-
type: "circle",
|
|
92
|
-
source: "column-links",
|
|
93
|
-
paint: {
|
|
94
|
-
"circle-radius": 2,
|
|
95
|
-
"circle-color": color
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
]
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
export {
|
|
102
|
-
ColumnKeyboardNavigation,
|
|
103
|
-
buildKeyboardNavigationStyle
|
|
104
|
-
};
|
|
105
|
-
//# sourceMappingURL=keyboard-navigation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard-navigation.js","sources":["../../../../src/maps/column-navigation/mapbox/keyboard-navigation.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from \"react\";\nimport { buildGeoJSONSource, setGeoJSON } from \"@macrostrat/mapbox-utils\";\nimport {\n useMapRef,\n useMapStyleOperator,\n useOverlayStyle,\n} from \"@macrostrat/mapbox-react\";\nimport { useColumnNavigationStore } from \"./state\";\nimport {\n buildTriangulation,\n buildKeyMapping,\n} from \"../utils/keyboard-navigation\";\nimport { StyleSpecification } from \"mapbox-gl\";\n\ninterface KeyboardNavProps {\n showTriangulation: boolean;\n triangulationColor?: string;\n}\n\nexport function ColumnKeyboardNavigation(props: KeyboardNavProps) {\n /** Keyboard navigation of columns using a Delaunay triangulation */\n const { showTriangulation = false, triangulationColor } = props;\n const columns = useColumnNavigationStore((state) => state.columns);\n const col_id = useColumnNavigationStore((state) => state.selectedColumn);\n const selectColumn = useColumnNavigationStore((state) => state.selectColumn);\n\n const voronoi = useMemo(() => {\n if (!columns || columns.length == 0) return null;\n return buildTriangulation(columns);\n }, [columns]);\n\n const mapRef = useMapRef();\n const map = mapRef.current;\n\n // Set up overlay style for triangulation\n useOverlayStyle(() => {\n if (!showTriangulation) return null;\n return buildKeyboardNavigationStyle(\n triangulationColor,\n ) as Partial<StyleSpecification>;\n }, [triangulationColor, showTriangulation]);\n\n const keyMapping = useMemo(() => {\n if (columns == null || voronoi == null || map == null) return null;\n\n const projection = (d) => {\n const pt = map.project(d);\n return [pt.x, pt.y];\n };\n\n const currentIndex = columns.findIndex(\n (d) => d.properties.col_id == col_id,\n );\n\n const neighbors = voronoi.tri.delaunay.neighbors[currentIndex];\n return buildKeyMapping(\n neighbors,\n voronoi.centroids,\n currentIndex,\n projection,\n );\n }, [col_id, columns, voronoi, map]);\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (keyMapping == null) return;\n const nextColumnIx = keyMapping[event.which];\n if (nextColumnIx == null) return;\n event.preventDefault();\n event.stopPropagation();\n // @ts-ignore\n selectColumn(columns[nextColumnIx].id);\n return false;\n },\n [keyMapping, selectColumn],\n );\n\n useEffect(() => {\n if (map == null) return;\n const canvas = map.getCanvas();\n canvas.addEventListener(\"keydown\", onKeyDown);\n return () => {\n canvas.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [map, onKeyDown]);\n\n useMapStyleOperator(\n (map) => {\n if (voronoi == null || !showTriangulation) return;\n const { features } = voronoi.tri.links();\n\n setGeoJSON(map, \"column-links\", {\n type: \"FeatureCollection\",\n features,\n });\n },\n [voronoi, showTriangulation],\n );\n\n //if (neighbors == null) return null;\n //const neighborFeatures = neighbors.map((d) => features[d]);\n\n return null;\n}\n\nexport function buildKeyboardNavigationStyle(color: string = \"purple\") {\n return {\n sources: {\n \"column-links\": buildGeoJSONSource(),\n //neighbors: buildGeoJSONSource(),\n },\n layers: [\n {\n id: \"column-links\",\n type: \"line\",\n source: \"column-links\",\n paint: {\n \"line-color\": color,\n \"line-width\": 1.5,\n },\n },\n {\n id: \"column-centers\",\n type: \"circle\",\n source: \"column-links\",\n paint: {\n \"circle-radius\": 2,\n \"circle-color\": color,\n },\n },\n ],\n } as Partial<StyleSpecification>;\n}\n"],"names":["map"],"mappings":";;;;;AAmBO,SAAS,yBAAyB,OAAyB;AAEhE,QAAM,EAAE,oBAAoB,OAAO,mBAAA,IAAuB;AAC1D,QAAM,UAAU,yBAAyB,CAAC,UAAU,MAAM,OAAO;AACjE,QAAM,SAAS,yBAAyB,CAAC,UAAU,MAAM,cAAc;AACvE,QAAM,eAAe,yBAAyB,CAAC,UAAU,MAAM,YAAY;AAE3E,QAAM,UAAU,QAAQ,MAAM;AAC5B,QAAI,CAAC,WAAW,QAAQ,UAAU,EAAG,QAAO;AAC5C,WAAO,mBAAmB,OAAO;AAAA,EACnC,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,SAAS,UAAA;AACf,QAAM,MAAM,OAAO;AAGnB,kBAAgB,MAAM;AACpB,QAAI,CAAC,kBAAmB,QAAO;AAC/B,WAAO;AAAA,MACL;AAAA,IAAA;AAAA,EAEJ,GAAG,CAAC,oBAAoB,iBAAiB,CAAC;AAE1C,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI,WAAW,QAAQ,WAAW,QAAQ,OAAO,KAAM,QAAO;AAE9D,UAAM,aAAa,CAAC,MAAM;AACxB,YAAM,KAAK,IAAI,QAAQ,CAAC;AACxB,aAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,IACpB;AAEA,UAAM,eAAe,QAAQ;AAAA,MAC3B,CAAC,MAAM,EAAE,WAAW,UAAU;AAAA,IAAA;AAGhC,UAAM,YAAY,QAAQ,IAAI,SAAS,UAAU,YAAY;AAC7D,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ,GAAG,CAAC,QAAQ,SAAS,SAAS,GAAG,CAAC;AAElC,QAAM,YAAY;AAAA,IAChB,CAAC,UAAyB;AACxB,UAAI,cAAc,KAAM;AACxB,YAAM,eAAe,WAAW,MAAM,KAAK;AAC3C,UAAI,gBAAgB,KAAM;AAC1B,YAAM,eAAA;AACN,YAAM,gBAAA;AAEN,mBAAa,QAAQ,YAAY,EAAE,EAAE;AACrC,aAAO;AAAA,IACT;AAAA,IACA,CAAC,YAAY,YAAY;AAAA,EAAA;AAG3B,YAAU,MAAM;AACd,QAAI,OAAO,KAAM;AACjB,UAAM,SAAS,IAAI,UAAA;AACnB,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,SAAS;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,KAAK,SAAS,CAAC;AAEnB;AAAA,IACE,CAACA,SAAQ;AACP,UAAI,WAAW,QAAQ,CAAC,kBAAmB;AAC3C,YAAM,EAAE,SAAA,IAAa,QAAQ,IAAI,MAAA;AAEjC,iBAAWA,MAAK,gBAAgB;AAAA,QAC9B,MAAM;AAAA,QACN;AAAA,MAAA,CACD;AAAA,IACH;AAAA,IACA,CAAC,SAAS,iBAAiB;AAAA,EAAA;AAM7B,SAAO;AACT;AAEO,SAAS,6BAA6B,QAAgB,UAAU;AACrE,SAAO;AAAA,IACL,SAAS;AAAA,MACP,gBAAgB,mBAAA;AAAA;AAAA,IAAmB;AAAA,IAGrC,QAAQ;AAAA,MACN;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,cAAc;AAAA,UACd,cAAc;AAAA,QAAA;AAAA,MAChB;AAAA,MAEF;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEJ;"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const zustand = require("zustand");
|
|
4
|
-
const React = require("react");
|
|
5
|
-
const h = require("@macrostrat/hyper");
|
|
6
|
-
const dataProvider = require("@macrostrat/data-provider");
|
|
7
|
-
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
8
|
-
const h__default = /* @__PURE__ */ _interopDefault(h);
|
|
9
|
-
const NavigationStoreContext = React.createContext(
|
|
10
|
-
null
|
|
11
|
-
);
|
|
12
|
-
function ColumnNavigationProvider({
|
|
13
|
-
children,
|
|
14
|
-
columns,
|
|
15
|
-
columnIDs,
|
|
16
|
-
selectedColumn,
|
|
17
|
-
projectID,
|
|
18
|
-
inProcess,
|
|
19
|
-
onSelectColumn,
|
|
20
|
-
onHoverColumn
|
|
21
|
-
}) {
|
|
22
|
-
dataProvider.useMacrostratStore((s) => s.getColumns);
|
|
23
|
-
const [store] = React.useState(() => {
|
|
24
|
-
return zustand.create((set, get) => {
|
|
25
|
-
return {
|
|
26
|
-
columns: null,
|
|
27
|
-
selectedColumn: null,
|
|
28
|
-
hoveredColumn: null,
|
|
29
|
-
selectColumn(columnID) {
|
|
30
|
-
set({ selectedColumn: columnID, hoveredColumn: null });
|
|
31
|
-
const { columns: columns2 } = get();
|
|
32
|
-
const column = columns2?.find((d) => d.id == columnID);
|
|
33
|
-
onSelectColumn?.(columnID, column);
|
|
34
|
-
},
|
|
35
|
-
setHoveredColumn(columnID) {
|
|
36
|
-
set({ hoveredColumn: columnID });
|
|
37
|
-
const { columns: columns2 } = get();
|
|
38
|
-
const column = columns2?.find((d) => d.id == columnID);
|
|
39
|
-
onHoverColumn?.(columnID, column);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
let _columns = columns ?? dataProvider.useMacrostratColumns(projectID, inProcess);
|
|
45
|
-
if (columnIDs?.length > 0) {
|
|
46
|
-
_columns = React.useMemo(() => {
|
|
47
|
-
return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));
|
|
48
|
-
}, [columnIDs, _columns]);
|
|
49
|
-
}
|
|
50
|
-
React.useEffect(() => {
|
|
51
|
-
if (_columns?.length > 0) {
|
|
52
|
-
store.setState({ columns: _columns, selectedColumn });
|
|
53
|
-
}
|
|
54
|
-
}, [_columns]);
|
|
55
|
-
React.useEffect(() => {
|
|
56
|
-
const { selectColumn, selectedColumn: _internalSelectedColumn } = store.getState();
|
|
57
|
-
if (selectedColumn == _internalSelectedColumn) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
selectColumn(selectedColumn);
|
|
61
|
-
}, [selectedColumn]);
|
|
62
|
-
return h__default.default(NavigationStoreContext.Provider, { value: store }, children);
|
|
63
|
-
}
|
|
64
|
-
function useColumnNavigationStore(selector) {
|
|
65
|
-
const storeApi = React.useContext(NavigationStoreContext);
|
|
66
|
-
if (storeApi == null) {
|
|
67
|
-
throw new Error("Missing ColumnNavigationProvider");
|
|
68
|
-
}
|
|
69
|
-
return zustand.useStore(storeApi, selector);
|
|
70
|
-
}
|
|
71
|
-
exports.ColumnNavigationProvider = ColumnNavigationProvider;
|
|
72
|
-
exports.useColumnNavigationStore = useColumnNavigationStore;
|
|
73
|
-
//# sourceMappingURL=state.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.cjs","sources":["../../../../src/maps/column-navigation/mapbox/state.ts"],"sourcesContent":["import { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecordWithID } from \"@macrostrat/api-types\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n useMemo,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n useMacrostratColumns,\n useMacrostratStore,\n} from \"@macrostrat/data-provider\";\n\nexport interface NavigationStore {\n columns: ColumnGeoJSONRecordWithID[];\n selectedColumn: number | null;\n hoveredColumn: number | null;\n selectColumn: (columnID: number | null) => void;\n setHoveredColumn: (columnID: number | null) => void;\n}\n\nexport interface NavigationProviderProps {\n projectID?: number;\n inProcess?: boolean;\n selectedColumn?: number | null;\n hoveredColumn?: number | null;\n columns?: ColumnGeoJSONRecordWithID[] | null;\n columnIDs?: number[] | null;\n children: ReactNode;\n onSelectColumn?: (col_id: number | null, column: any) => void;\n onHoverColumn?: (col_id: number | null, column: any) => void;\n}\n\nconst NavigationStoreContext = createContext<StoreApi<NavigationStore> | null>(\n null,\n);\n\nexport function ColumnNavigationProvider({\n children,\n columns,\n columnIDs,\n selectedColumn,\n projectID,\n inProcess,\n onSelectColumn,\n onHoverColumn,\n}: NavigationProviderProps) {\n const getColumns = useMacrostratStore((s) => s.getColumns);\n\n const [store] = useState(() => {\n return create<NavigationStore>((set, get): NavigationStore => {\n return {\n columns: null,\n selectedColumn: null,\n hoveredColumn: null,\n selectColumn(columnID: number | null) {\n set({ selectedColumn: columnID, hoveredColumn: null });\n const { columns } = get();\n const column = columns?.find((d) => d.id == columnID);\n onSelectColumn?.(columnID, column);\n },\n setHoveredColumn(columnID: number | null) {\n set({ hoveredColumn: columnID });\n const { columns } = get();\n const column = columns?.find((d) => d.id == columnID);\n onHoverColumn?.(columnID, column);\n },\n };\n });\n });\n\n // Set up the store\n /** TODO: unify handling of columns between parts of application */\n // useAsyncEffect(async () => {\n // let _columns = columns ?? (await getColumns(projectID, inProcess));\n // store.setState({ columns: _columns, selectedColumn });\n // }, [projectID, inProcess, columns, getColumns]);\n\n let _columns = columns ?? useMacrostratColumns(projectID, inProcess);\n\n // filter columns if specified\n if (columnIDs?.length > 0) {\n _columns = useMemo(() => {\n return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));\n }, [columnIDs, _columns]);\n }\n\n useEffect(() => {\n if (_columns?.length > 0) {\n store.setState({ columns: _columns, selectedColumn });\n }\n }, [_columns]);\n // Update selected column if it is changed externally\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n useEffect(() => {\n const { selectColumn, selectedColumn: _internalSelectedColumn } =\n store.getState();\n if (selectedColumn == _internalSelectedColumn) {\n return;\n }\n selectColumn(selectedColumn);\n }, [selectedColumn]);\n\n return h(NavigationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useColumnNavigationStore(\n selector: (state: NavigationStore) => any,\n) {\n const storeApi = useContext(NavigationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing ColumnNavigationProvider\");\n }\n return useStore(storeApi, selector);\n}\n"],"names":["createContext","useMacrostratStore","useState","create","columns","useMacrostratColumns","useMemo","useEffect","h","useContext","useStore"],"mappings":";;;;;;;;AAoCA,MAAM,yBAAyBA,MAAAA;AAAAA,EAC7B;AACF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AACPC,kCAAmB,CAAC,MAAM,EAAE,UAAU;AAEzD,QAAM,CAAC,KAAK,IAAIC,MAAAA,SAAS,MAAM;AAC7B,WAAOC,QAAAA,OAAwB,CAAC,KAAK,QAAyB;AAC5D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,aAAa,UAAyB;AACpC,cAAI,EAAE,gBAAgB,UAAU,eAAe,MAAM;AACrD,gBAAM,EAAE,SAAAC,SAAAA,IAAY,IAAA;AACpB,gBAAM,SAASA,UAAS,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ;AACpD,2BAAiB,UAAU,MAAM;AAAA,QACnC;AAAA,QACA,iBAAiB,UAAyB;AACxC,cAAI,EAAE,eAAe,UAAU;AAC/B,gBAAM,EAAE,SAAAA,SAAAA,IAAY,IAAA;AACpB,gBAAM,SAASA,UAAS,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ;AACpD,0BAAgB,UAAU,MAAM;AAAA,QAClC;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EACH,CAAC;AASD,MAAI,WAAW,WAAWC,kCAAqB,WAAW,SAAS;AAGnE,MAAI,WAAW,SAAS,GAAG;AACzB,eAAWC,MAAAA,QAAQ,MAAM;AACvB,aAAO,UAAU,OAAO,CAAC,MAAM,UAAU,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,IACxE,GAAG,CAAC,WAAW,QAAQ,CAAC;AAAA,EAC1B;AAEAC,QAAAA,UAAU,MAAM;AACd,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,SAAS,EAAE,SAAS,UAAU,gBAAgB;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAIbA,QAAAA,UAAU,MAAM;AACd,UAAM,EAAE,cAAc,gBAAgB,wBAAA,IACpC,MAAM,SAAA;AACR,QAAI,kBAAkB,yBAAyB;AAC7C;AAAA,IACF;AACA,iBAAa,cAAc;AAAA,EAC7B,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAOC,WAAAA,QAAE,uBAAuB,UAAU,EAAE,OAAO,MAAA,GAAS,QAAQ;AACtE;AAEO,SAAS,yBACd,UACA;AACA,QAAM,WAAWC,MAAAA,WAAW,sBAAsB;AAClD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,SAAOC,QAAAA,SAAS,UAAU,QAAQ;AACpC;;;"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { StoreApi } from 'zustand';
|
|
2
|
-
import { ColumnGeoJSONRecordWithID } from '@macrostrat/api-types';
|
|
3
|
-
import { ReactNode } from 'react';
|
|
4
|
-
export interface NavigationStore {
|
|
5
|
-
columns: ColumnGeoJSONRecordWithID[];
|
|
6
|
-
selectedColumn: number | null;
|
|
7
|
-
hoveredColumn: number | null;
|
|
8
|
-
selectColumn: (columnID: number | null) => void;
|
|
9
|
-
setHoveredColumn: (columnID: number | null) => void;
|
|
10
|
-
}
|
|
11
|
-
export interface NavigationProviderProps {
|
|
12
|
-
projectID?: number;
|
|
13
|
-
inProcess?: boolean;
|
|
14
|
-
selectedColumn?: number | null;
|
|
15
|
-
hoveredColumn?: number | null;
|
|
16
|
-
columns?: ColumnGeoJSONRecordWithID[] | null;
|
|
17
|
-
columnIDs?: number[] | null;
|
|
18
|
-
children: ReactNode;
|
|
19
|
-
onSelectColumn?: (col_id: number | null, column: any) => void;
|
|
20
|
-
onHoverColumn?: (col_id: number | null, column: any) => void;
|
|
21
|
-
}
|
|
22
|
-
export declare function ColumnNavigationProvider({ children, columns, columnIDs, selectedColumn, projectID, inProcess, onSelectColumn, onHoverColumn, }: NavigationProviderProps): import('react').FunctionComponentElement<import('react').ProviderProps<StoreApi<NavigationStore> | null>>;
|
|
23
|
-
export declare function useColumnNavigationStore(selector: (state: NavigationStore) => any): any;
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { create, useStore } from "zustand";
|
|
2
|
-
import { useState, useMemo, useEffect, createContext, useContext } from "react";
|
|
3
|
-
import h from "@macrostrat/hyper";
|
|
4
|
-
import { useMacrostratStore, useMacrostratColumns } from "@macrostrat/data-provider";
|
|
5
|
-
const NavigationStoreContext = createContext(
|
|
6
|
-
null
|
|
7
|
-
);
|
|
8
|
-
function ColumnNavigationProvider({
|
|
9
|
-
children,
|
|
10
|
-
columns,
|
|
11
|
-
columnIDs,
|
|
12
|
-
selectedColumn,
|
|
13
|
-
projectID,
|
|
14
|
-
inProcess,
|
|
15
|
-
onSelectColumn,
|
|
16
|
-
onHoverColumn
|
|
17
|
-
}) {
|
|
18
|
-
useMacrostratStore((s) => s.getColumns);
|
|
19
|
-
const [store] = useState(() => {
|
|
20
|
-
return create((set, get) => {
|
|
21
|
-
return {
|
|
22
|
-
columns: null,
|
|
23
|
-
selectedColumn: null,
|
|
24
|
-
hoveredColumn: null,
|
|
25
|
-
selectColumn(columnID) {
|
|
26
|
-
set({ selectedColumn: columnID, hoveredColumn: null });
|
|
27
|
-
const { columns: columns2 } = get();
|
|
28
|
-
const column = columns2?.find((d) => d.id == columnID);
|
|
29
|
-
onSelectColumn?.(columnID, column);
|
|
30
|
-
},
|
|
31
|
-
setHoveredColumn(columnID) {
|
|
32
|
-
set({ hoveredColumn: columnID });
|
|
33
|
-
const { columns: columns2 } = get();
|
|
34
|
-
const column = columns2?.find((d) => d.id == columnID);
|
|
35
|
-
onHoverColumn?.(columnID, column);
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
let _columns = columns ?? useMacrostratColumns(projectID, inProcess);
|
|
41
|
-
if (columnIDs?.length > 0) {
|
|
42
|
-
_columns = useMemo(() => {
|
|
43
|
-
return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));
|
|
44
|
-
}, [columnIDs, _columns]);
|
|
45
|
-
}
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
if (_columns?.length > 0) {
|
|
48
|
-
store.setState({ columns: _columns, selectedColumn });
|
|
49
|
-
}
|
|
50
|
-
}, [_columns]);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
const { selectColumn, selectedColumn: _internalSelectedColumn } = store.getState();
|
|
53
|
-
if (selectedColumn == _internalSelectedColumn) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
selectColumn(selectedColumn);
|
|
57
|
-
}, [selectedColumn]);
|
|
58
|
-
return h(NavigationStoreContext.Provider, { value: store }, children);
|
|
59
|
-
}
|
|
60
|
-
function useColumnNavigationStore(selector) {
|
|
61
|
-
const storeApi = useContext(NavigationStoreContext);
|
|
62
|
-
if (storeApi == null) {
|
|
63
|
-
throw new Error("Missing ColumnNavigationProvider");
|
|
64
|
-
}
|
|
65
|
-
return useStore(storeApi, selector);
|
|
66
|
-
}
|
|
67
|
-
export {
|
|
68
|
-
ColumnNavigationProvider,
|
|
69
|
-
useColumnNavigationStore
|
|
70
|
-
};
|
|
71
|
-
//# sourceMappingURL=state.js.map
|