@macrostrat/column-views 3.9.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.
Files changed (118) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/index.cjs +15 -42
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.ts +2 -1
  5. package/dist/index.js +1 -34
  6. package/dist/index.js.map +1 -1
  7. package/dist/units/boxes.cjs +3 -3
  8. package/dist/units/boxes.cjs.map +1 -1
  9. package/dist/units/boxes.js +3 -3
  10. package/dist/units/boxes.js.map +1 -1
  11. package/dist/units/index.cjs +7 -11
  12. package/dist/units/index.cjs.map +1 -1
  13. package/dist/units/index.d.ts +0 -1
  14. package/dist/units/index.js +4 -9
  15. package/dist/units/index.js.map +1 -1
  16. package/package.json +6 -27
  17. package/src/index.ts +3 -1
  18. package/src/units/boxes.ts +7 -4
  19. package/src/units/index.ts +9 -26
  20. package/dist/maps/column-correlation/core.cjs +0 -288
  21. package/dist/maps/column-correlation/core.cjs.map +0 -1
  22. package/dist/maps/column-correlation/core.d.ts +0 -9
  23. package/dist/maps/column-correlation/core.js +0 -286
  24. package/dist/maps/column-correlation/core.js.map +0 -1
  25. package/dist/maps/column-correlation/index.d.ts +0 -2
  26. package/dist/maps/column-correlation/state.cjs +0 -193
  27. package/dist/maps/column-correlation/state.cjs.map +0 -1
  28. package/dist/maps/column-correlation/state.d.ts +0 -62
  29. package/dist/maps/column-correlation/state.js +0 -190
  30. package/dist/maps/column-correlation/state.js.map +0 -1
  31. package/dist/maps/column-navigation/index.d.ts +0 -2
  32. package/dist/maps/column-navigation/mapbox/index.cjs +0 -215
  33. package/dist/maps/column-navigation/mapbox/index.cjs.map +0 -1
  34. package/dist/maps/column-navigation/mapbox/index.d.ts +0 -38
  35. package/dist/maps/column-navigation/mapbox/index.js +0 -213
  36. package/dist/maps/column-navigation/mapbox/index.js.map +0 -1
  37. package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs +0 -105
  38. package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs.map +0 -1
  39. package/dist/maps/column-navigation/mapbox/keyboard-navigation.d.ts +0 -8
  40. package/dist/maps/column-navigation/mapbox/keyboard-navigation.js +0 -105
  41. package/dist/maps/column-navigation/mapbox/keyboard-navigation.js.map +0 -1
  42. package/dist/maps/column-navigation/mapbox/state.cjs +0 -73
  43. package/dist/maps/column-navigation/mapbox/state.cjs.map +0 -1
  44. package/dist/maps/column-navigation/mapbox/state.d.ts +0 -23
  45. package/dist/maps/column-navigation/mapbox/state.js +0 -71
  46. package/dist/maps/column-navigation/mapbox/state.js.map +0 -1
  47. package/dist/maps/column-navigation/svg/animated.d.ts +0 -1
  48. package/dist/maps/column-navigation/svg/data-fetcher.cjs +0 -25
  49. package/dist/maps/column-navigation/svg/data-fetcher.cjs.map +0 -1
  50. package/dist/maps/column-navigation/svg/data-fetcher.d.ts +0 -6
  51. package/dist/maps/column-navigation/svg/data-fetcher.js +0 -25
  52. package/dist/maps/column-navigation/svg/data-fetcher.js.map +0 -1
  53. package/dist/maps/column-navigation/svg/index.cjs +0 -94
  54. package/dist/maps/column-navigation/svg/index.cjs.map +0 -1
  55. package/dist/maps/column-navigation/svg/index.d.ts +0 -9
  56. package/dist/maps/column-navigation/svg/index.js +0 -93
  57. package/dist/maps/column-navigation/svg/index.js.map +0 -1
  58. package/dist/maps/column-navigation/svg/layers.cjs +0 -177
  59. package/dist/maps/column-navigation/svg/layers.cjs.map +0 -1
  60. package/dist/maps/column-navigation/svg/layers.d.ts +0 -54
  61. package/dist/maps/column-navigation/svg/layers.js +0 -174
  62. package/dist/maps/column-navigation/svg/layers.js.map +0 -1
  63. package/dist/maps/column-navigation/utils/keyboard-navigation.cjs +0 -50
  64. package/dist/maps/column-navigation/utils/keyboard-navigation.cjs.map +0 -1
  65. package/dist/maps/column-navigation/utils/keyboard-navigation.d.ts +0 -10
  66. package/dist/maps/column-navigation/utils/keyboard-navigation.js +0 -50
  67. package/dist/maps/column-navigation/utils/keyboard-navigation.js.map +0 -1
  68. package/dist/maps/index.d.ts +0 -4
  69. package/dist/maps/inset-map/index.cjs +0 -71
  70. package/dist/maps/inset-map/index.cjs.map +0 -1
  71. package/dist/maps/inset-map/index.d.ts +0 -16
  72. package/dist/maps/inset-map/index.js +0 -69
  73. package/dist/maps/inset-map/index.js.map +0 -1
  74. package/dist/maps/layers/columns.cjs +0 -165
  75. package/dist/maps/layers/columns.cjs.map +0 -1
  76. package/dist/maps/layers/columns.d.ts +0 -28
  77. package/dist/maps/layers/columns.js +0 -165
  78. package/dist/maps/layers/columns.js.map +0 -1
  79. package/dist/maps/layers/index.d.ts +0 -2
  80. package/dist/maps/layers/units.cjs +0 -207
  81. package/dist/maps/layers/units.cjs.map +0 -1
  82. package/dist/maps/layers/units.d.ts +0 -14
  83. package/dist/maps/layers/units.js +0 -204
  84. package/dist/maps/layers/units.js.map +0 -1
  85. package/dist/units/colors.cjs +0 -115
  86. package/dist/units/colors.cjs.map +0 -1
  87. package/dist/units/colors.d.ts +0 -20
  88. package/dist/units/colors.js +0 -113
  89. package/dist/units/colors.js.map +0 -1
  90. package/dist/units/resolvers.cjs +0 -125
  91. package/dist/units/resolvers.cjs.map +0 -1
  92. package/dist/units/resolvers.d.ts +0 -8
  93. package/dist/units/resolvers.js +0 -125
  94. package/dist/units/resolvers.js.map +0 -1
  95. package/src/maps/column-correlation/column-correlation-map.stories.ts +0 -108
  96. package/src/maps/column-correlation/core.ts +0 -342
  97. package/src/maps/column-correlation/index.ts +0 -2
  98. package/src/maps/column-correlation/state.ts +0 -315
  99. package/src/maps/column-navigation/index.ts +0 -2
  100. package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +0 -278
  101. package/src/maps/column-navigation/mapbox/index.ts +0 -276
  102. package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +0 -133
  103. package/src/maps/column-navigation/mapbox/state.ts +0 -119
  104. package/src/maps/column-navigation/svg/animated.ts +0 -78
  105. package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +0 -46
  106. package/src/maps/column-navigation/svg/data-fetcher.ts +0 -34
  107. package/src/maps/column-navigation/svg/index.ts +0 -96
  108. package/src/maps/column-navigation/svg/layers.ts +0 -233
  109. package/src/maps/column-navigation/utils/keyboard-navigation.ts +0 -58
  110. package/src/maps/index.ts +0 -4
  111. package/src/maps/inset-map/index.ts +0 -87
  112. package/src/maps/inset-map/inset-map.stories.ts +0 -20
  113. package/src/maps/layers/columns.ts +0 -216
  114. package/src/maps/layers/index.ts +0 -2
  115. package/src/maps/layers/units.ts +0 -286
  116. package/src/maps/unit-map.stories.ts +0 -79
  117. package/src/units/colors.ts +0 -183
  118. 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