@macrostrat/column-views 3.9.0 → 3.11.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 +44 -0
- package/dist/column-views.css +10 -0
- package/dist/correlation-chart/main.cjs +11 -3
- package/dist/correlation-chart/main.cjs.map +1 -1
- package/dist/correlation-chart/main.d.ts +1 -1
- package/dist/correlation-chart/main.js +11 -3
- package/dist/correlation-chart/main.js.map +1 -1
- package/dist/index.cjs +18 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -34
- package/dist/index.js.map +1 -1
- package/dist/unit-details/age-window-tag.cjs +68 -0
- package/dist/unit-details/age-window-tag.cjs.map +1 -0
- package/dist/unit-details/age-window-tag.d.ts +26 -0
- package/dist/unit-details/age-window-tag.js +66 -0
- package/dist/unit-details/age-window-tag.js.map +1 -0
- package/dist/unit-details/age-window-tag.module.sass.cjs +12 -0
- package/dist/unit-details/age-window-tag.module.sass.cjs.map +1 -0
- package/dist/unit-details/age-window-tag.module.sass.js +11 -0
- package/dist/unit-details/age-window-tag.module.sass.js.map +1 -0
- package/dist/unit-details/index.d.ts +1 -0
- package/dist/units/boxes.cjs +3 -3
- package/dist/units/boxes.cjs.map +1 -1
- package/dist/units/boxes.js +3 -3
- package/dist/units/boxes.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 +6 -27
- package/src/correlation-chart/main.ts +14 -2
- package/src/index.ts +3 -1
- package/src/unit-details/age-window-tag.module.sass +10 -0
- package/src/unit-details/age-window-tag.ts +102 -0
- package/src/unit-details/index.ts +1 -0
- package/src/units/boxes.ts +7 -4
- 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,215 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const mapboxReact = require("@macrostrat/mapbox-react");
|
|
4
|
-
const h = require("@macrostrat/hyper");
|
|
5
|
-
const React = require("react");
|
|
6
|
-
const state = require("./state.cjs");
|
|
7
|
-
const index = require("../../inset-map/index.cjs");
|
|
8
|
-
const d3Geo = require("d3-geo");
|
|
9
|
-
const keyboardNavigation = require("./keyboard-navigation.cjs");
|
|
10
|
-
const columns = require("../../layers/columns.cjs");
|
|
11
|
-
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
12
|
-
const h__default = /* @__PURE__ */ _interopDefault(h);
|
|
13
|
-
function ColumnNavigationMap(props) {
|
|
14
|
-
const {
|
|
15
|
-
padding = 50,
|
|
16
|
-
children,
|
|
17
|
-
columnColor,
|
|
18
|
-
showTriangulation,
|
|
19
|
-
triangulationColor,
|
|
20
|
-
keyboardNavigation: keyboardNavigation2 = true,
|
|
21
|
-
columns: columns2,
|
|
22
|
-
columnIDs,
|
|
23
|
-
onSelectColumn,
|
|
24
|
-
onHoverColumn,
|
|
25
|
-
selectedColumn,
|
|
26
|
-
hoveredColumn,
|
|
27
|
-
projectID,
|
|
28
|
-
inProcess,
|
|
29
|
-
...rest
|
|
30
|
-
} = props;
|
|
31
|
-
return h__default.default(
|
|
32
|
-
index.InsetMap,
|
|
33
|
-
{
|
|
34
|
-
...rest,
|
|
35
|
-
boxZoom: false,
|
|
36
|
-
dragRotate: false
|
|
37
|
-
},
|
|
38
|
-
[
|
|
39
|
-
h__default.default(ColumnsNavigationLayer, {
|
|
40
|
-
color: columnColor,
|
|
41
|
-
columns: columns2,
|
|
42
|
-
columnIDs,
|
|
43
|
-
onSelectColumn,
|
|
44
|
-
onHoverColumn,
|
|
45
|
-
selectedColumn,
|
|
46
|
-
hoveredColumn,
|
|
47
|
-
projectID,
|
|
48
|
-
inProcess,
|
|
49
|
-
keyboardNavigation: keyboardNavigation2,
|
|
50
|
-
showTriangulation,
|
|
51
|
-
triangulationColor
|
|
52
|
-
}),
|
|
53
|
-
children
|
|
54
|
-
]
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
function ColumnsNavigationLayer(props) {
|
|
58
|
-
const {
|
|
59
|
-
enabled,
|
|
60
|
-
color,
|
|
61
|
-
keyboardNavigation: keyboardNavigation$1,
|
|
62
|
-
showTriangulation,
|
|
63
|
-
triangulationColor,
|
|
64
|
-
...providerProps
|
|
65
|
-
} = props;
|
|
66
|
-
return h__default.default(state.ColumnNavigationProvider, providerProps, [
|
|
67
|
-
h__default.default(_ColumnsNavigationLayer, { enabled, color }),
|
|
68
|
-
h__default.default.if(keyboardNavigation$1)(keyboardNavigation.ColumnKeyboardNavigation, {
|
|
69
|
-
showTriangulation,
|
|
70
|
-
triangulationColor
|
|
71
|
-
})
|
|
72
|
-
]);
|
|
73
|
-
}
|
|
74
|
-
const columnLayers = ["columns-points", "columns-fill"];
|
|
75
|
-
function _ColumnsNavigationLayer({ enabled = true, color }) {
|
|
76
|
-
const columns$1 = state.useColumnNavigationStore((state2) => state2.columns);
|
|
77
|
-
const selectedColumnID = state.useColumnNavigationStore(
|
|
78
|
-
(state2) => state2.selectedColumn
|
|
79
|
-
);
|
|
80
|
-
const selectColumn = state.useColumnNavigationStore((state2) => state2.selectColumn);
|
|
81
|
-
const setHoveredColumn = state.useColumnNavigationStore(
|
|
82
|
-
(state2) => state2.setHoveredColumn
|
|
83
|
-
);
|
|
84
|
-
const onHover = React.useCallback(
|
|
85
|
-
(event) => setHoveredColumn(event.features?.[0]?.id),
|
|
86
|
-
[setHoveredColumn]
|
|
87
|
-
);
|
|
88
|
-
const onSelectColumn = React.useCallback(
|
|
89
|
-
(column) => selectColumn(column.id),
|
|
90
|
-
[selectColumn]
|
|
91
|
-
);
|
|
92
|
-
const selectedColumnFeature = React.useMemo(() => {
|
|
93
|
-
if (columns$1 == null || selectedColumnID == null) return null;
|
|
94
|
-
return columns$1.find((d) => d.id == selectedColumnID);
|
|
95
|
-
}, [selectedColumnID, columns$1]);
|
|
96
|
-
return h__default.default([
|
|
97
|
-
h__default.default(columns.BaseColumnsLayer, { enabled, color, columns: columns$1 }),
|
|
98
|
-
h__default.default(ColumnSelectionManager, {
|
|
99
|
-
selectedColumn: selectedColumnFeature,
|
|
100
|
-
onSelectColumn
|
|
101
|
-
}),
|
|
102
|
-
h__default.default(ColumnHoverInteraction, { onHover })
|
|
103
|
-
]);
|
|
104
|
-
}
|
|
105
|
-
function ColumnSelectionManager({
|
|
106
|
-
selectedColumn,
|
|
107
|
-
onSelectColumn,
|
|
108
|
-
centerOnSelect = true
|
|
109
|
-
}) {
|
|
110
|
-
const onClick = React.useCallback(
|
|
111
|
-
(event) => {
|
|
112
|
-
if (event.features.length == 0) return;
|
|
113
|
-
const selectedColumn2 = event.features[0];
|
|
114
|
-
onSelectColumn(selectedColumn2);
|
|
115
|
-
},
|
|
116
|
-
[onSelectColumn]
|
|
117
|
-
);
|
|
118
|
-
return h__default.default([
|
|
119
|
-
h__default.default.if(centerOnSelect)(SelectedColumnCenterer, {
|
|
120
|
-
selectedColumn
|
|
121
|
-
}),
|
|
122
|
-
h__default.default(columns.SelectedColumnOverlay, { selectedColumn }),
|
|
123
|
-
h__default.default(ClickInteraction, {
|
|
124
|
-
onClick,
|
|
125
|
-
layers: columnLayers
|
|
126
|
-
})
|
|
127
|
-
]);
|
|
128
|
-
}
|
|
129
|
-
function ColumnHoverInteraction({ onHover }) {
|
|
130
|
-
return h__default.default(HoverInteraction, { onHover, layers: columnLayers });
|
|
131
|
-
}
|
|
132
|
-
function ClickInteraction({ onClick, layers }) {
|
|
133
|
-
mapboxReact.useMapStyleOperator(
|
|
134
|
-
(map) => {
|
|
135
|
-
map.on("click", layers, onClick);
|
|
136
|
-
return () => {
|
|
137
|
-
map.off("click", layers, onClick);
|
|
138
|
-
};
|
|
139
|
-
},
|
|
140
|
-
[layers, onClick]
|
|
141
|
-
);
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
function HoverInteraction({ onHover, layers }) {
|
|
145
|
-
const hoveredFeaturesRef = React.useRef([]);
|
|
146
|
-
const updateFeatureState = React.useCallback((map, features) => {
|
|
147
|
-
for (const f of hoveredFeaturesRef.current) {
|
|
148
|
-
map.setFeatureState(
|
|
149
|
-
{ source: f.source, id: f.id, sourceLayer: f.sourceLayer },
|
|
150
|
-
{ hover: false }
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
for (const f of features) {
|
|
154
|
-
map.setFeatureState(
|
|
155
|
-
{ source: f.source, id: f.id, sourceLayer: f.sourceLayer },
|
|
156
|
-
{ hover: true }
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
hoveredFeaturesRef.current = features;
|
|
160
|
-
}, []);
|
|
161
|
-
mapboxReact.useMapStyleOperator(
|
|
162
|
-
(map) => {
|
|
163
|
-
const mouseMove = (event) => {
|
|
164
|
-
if (event.features.length == 0) return;
|
|
165
|
-
onHover?.(event);
|
|
166
|
-
updateFeatureState(map, event.features);
|
|
167
|
-
map.getCanvas().style.cursor = "pointer";
|
|
168
|
-
};
|
|
169
|
-
const mouseLeave = (event) => {
|
|
170
|
-
onHover?.(event);
|
|
171
|
-
updateFeatureState(map, event.features ?? []);
|
|
172
|
-
map.getCanvas().style.cursor = "";
|
|
173
|
-
};
|
|
174
|
-
map.on("mousemove", layers, mouseMove);
|
|
175
|
-
map.on("mouseleave", layers, mouseLeave);
|
|
176
|
-
return () => {
|
|
177
|
-
map.off("mouseenter", layers, mouseMove);
|
|
178
|
-
map.off("mouseleave", layers, mouseLeave);
|
|
179
|
-
};
|
|
180
|
-
},
|
|
181
|
-
[layers, onHover]
|
|
182
|
-
);
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
function SelectedColumnCenterer({
|
|
186
|
-
selectedColumn,
|
|
187
|
-
easeDuration = 500
|
|
188
|
-
}) {
|
|
189
|
-
const columnCenter = React.useMemo(() => {
|
|
190
|
-
const columnGeometry = selectedColumn?.geometry;
|
|
191
|
-
if (columnGeometry == null) return null;
|
|
192
|
-
return d3Geo.geoCentroid(columnGeometry);
|
|
193
|
-
}, [selectedColumn]);
|
|
194
|
-
const mapRef = mapboxReact.useMapRef();
|
|
195
|
-
const map = mapRef.current;
|
|
196
|
-
const initialRenderRef = React.useRef(true);
|
|
197
|
-
React.useEffect(() => {
|
|
198
|
-
if (map == null) return;
|
|
199
|
-
const isInitialRender = initialRenderRef.current;
|
|
200
|
-
if (isInitialRender) initialRenderRef.current = false;
|
|
201
|
-
if (columnCenter == null) return;
|
|
202
|
-
if (isInitialRender) {
|
|
203
|
-
map.setCenter(columnCenter);
|
|
204
|
-
initialRenderRef.current = false;
|
|
205
|
-
} else {
|
|
206
|
-
map.easeTo({ center: columnCenter }, { duration: easeDuration });
|
|
207
|
-
}
|
|
208
|
-
}, [mapRef.current, columnCenter]);
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
exports.ColumnHoverInteraction = ColumnHoverInteraction;
|
|
212
|
-
exports.ColumnNavigationMap = ColumnNavigationMap;
|
|
213
|
-
exports.ColumnSelectionManager = ColumnSelectionManager;
|
|
214
|
-
exports.ColumnsNavigationLayer = ColumnsNavigationLayer;
|
|
215
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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":["keyboardNavigation","columns","h","InsetMap","ColumnNavigationProvider","ColumnKeyboardNavigation","useColumnNavigationStore","state","useCallback","useMemo","BaseColumnsLayer","selectedColumn","SelectedColumnOverlay","useMapStyleOperator","useRef","geoCentroid","useMapRef","useEffect"],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
import { NavigationProviderProps } from './state';
|
|
3
|
-
import { InsetMapProps } from '../../inset-map';
|
|
4
|
-
import { ColumnFeature } from '../../layers';
|
|
5
|
-
export interface ColumnNavigationMapProps extends InsetMapProps {
|
|
6
|
-
padding?: number;
|
|
7
|
-
children?: ReactNode;
|
|
8
|
-
accessToken?: string;
|
|
9
|
-
selectedColumn?: number;
|
|
10
|
-
hoveredColumn?: number;
|
|
11
|
-
onSelectColumn?: (colID: number | null) => void;
|
|
12
|
-
onHoverColumn?: (colID: number | null) => void;
|
|
13
|
-
showTriangulation?: boolean;
|
|
14
|
-
columnColor?: string;
|
|
15
|
-
}
|
|
16
|
-
export declare function ColumnNavigationMap(props: ColumnNavigationMapProps & NavigationProviderProps): import('react').FunctionComponentElement<InsetMapProps>;
|
|
17
|
-
interface ColumnLayerProps {
|
|
18
|
-
enabled?: boolean;
|
|
19
|
-
color?: string;
|
|
20
|
-
}
|
|
21
|
-
interface ColumnKeyboardNavigationProps {
|
|
22
|
-
triangulationColor?: string;
|
|
23
|
-
keyboardNavigation?: boolean;
|
|
24
|
-
showTriangulation?: boolean;
|
|
25
|
-
}
|
|
26
|
-
export declare function ColumnsNavigationLayer(props: NavigationProviderProps & ColumnLayerProps & ColumnKeyboardNavigationProps): import('react').FunctionComponentElement<NavigationProviderProps>;
|
|
27
|
-
export declare function ColumnSelectionManager({ selectedColumn, onSelectColumn, centerOnSelect, }: {
|
|
28
|
-
selectedColumn: ColumnFeature;
|
|
29
|
-
onSelectColumn: (column: ColumnFeature) => void;
|
|
30
|
-
centerOnSelect?: boolean;
|
|
31
|
-
}): import('react').ReactElement<unknown, string | import('react').JSXElementConstructor<any>>;
|
|
32
|
-
export declare function ColumnHoverInteraction({ onHover }: {
|
|
33
|
-
onHover: any;
|
|
34
|
-
}): import('react').FunctionComponentElement<{
|
|
35
|
-
onHover: any;
|
|
36
|
-
layers: any;
|
|
37
|
-
}>;
|
|
38
|
-
export {};
|
|
@@ -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 {};
|