@macrostrat/column-views 1.0.3 → 2.0.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 +17 -0
- package/dist/esm/_shared.f7eec55a.js +9 -0
- package/dist/esm/_shared.f7eec55a.js.map +1 -0
- package/dist/esm/age-axis.4a8cf5e6.js +98 -0
- package/dist/esm/age-axis.4a8cf5e6.js.map +1 -0
- package/dist/esm/age-axis.module.03773a80.css +33 -0
- package/dist/esm/age-axis.module.03773a80.css.map +1 -0
- package/dist/esm/age-axis.module.3cc91335.js +22 -0
- package/dist/esm/age-axis.module.3cc91335.js.map +1 -0
- package/dist/esm/age-model-overlay.c7226855.js +57 -0
- package/dist/esm/age-model-overlay.c7226855.js.map +1 -0
- package/dist/esm/age-model-overlay.module.5d9e78fb.css +14 -0
- package/dist/esm/age-model-overlay.module.5d9e78fb.css.map +1 -0
- package/dist/esm/age-model-overlay.module.cd985dcb.js +16 -0
- package/dist/esm/age-model-overlay.module.cd985dcb.js.map +1 -0
- package/dist/esm/base.910b80b4.js +288 -0
- package/dist/esm/base.910b80b4.js.map +1 -0
- package/dist/esm/boxes.8292cff2.js +258 -0
- package/dist/esm/boxes.8292cff2.js.map +1 -0
- package/dist/esm/boxes.module.2b5fb18e.css +26 -0
- package/dist/esm/boxes.module.2b5fb18e.css.map +1 -0
- package/dist/esm/boxes.module.4ebc7796.js +19 -0
- package/dist/esm/boxes.module.4ebc7796.js.map +1 -0
- package/dist/esm/{carbon-isotopes.3b502a9e.js → carbon-isotopes.10db8285.js} +2 -2
- package/dist/esm/{carbon-isotopes.3b502a9e.js.map → carbon-isotopes.10db8285.js.map} +1 -1
- package/dist/esm/colors.395c6db5.js +40 -0
- package/dist/esm/colors.395c6db5.js.map +1 -0
- package/dist/esm/column-correlation.c8dcfe98.js +9 -0
- package/dist/esm/column-correlation.c8dcfe98.js.map +1 -0
- package/dist/esm/column-nav.5414677c.js +55 -0
- package/dist/esm/column-nav.5414677c.js.map +1 -0
- package/dist/esm/column-navigation.37cd3245.js +9 -0
- package/dist/esm/column-navigation.37cd3245.js.map +1 -0
- package/dist/esm/column.01d68dd8.js +127 -0
- package/dist/esm/column.01d68dd8.js.map +1 -0
- package/dist/esm/{column.db058031.js → column.a25f8ebd.js} +4 -4
- package/dist/esm/column.a25f8ebd.js.map +1 -0
- package/dist/esm/column.module.1b776e15.js +46 -0
- package/dist/esm/column.module.1b776e15.js.map +1 -0
- package/dist/esm/column.module.a67a6b4c.css +159 -0
- package/dist/esm/column.module.a67a6b4c.css.map +1 -0
- package/dist/esm/composite-scale.577bf64a.js +222 -0
- package/dist/esm/composite-scale.577bf64a.js.map +1 -0
- package/dist/esm/composite.039e4798.js +163 -0
- package/dist/esm/composite.039e4798.js.map +1 -0
- package/dist/esm/{core.4db8e452.js → core.843310d3.js} +11 -12
- package/dist/esm/core.843310d3.js.map +1 -0
- package/dist/esm/core.91ede078.js +206 -0
- package/dist/esm/core.91ede078.js.map +1 -0
- package/dist/esm/correlation-chart.abd8b346.js +9 -0
- package/dist/esm/correlation-chart.abd8b346.js.map +1 -0
- package/dist/esm/data-provider.1506eb64.js.map +1 -1
- package/dist/esm/data-provider.f10c6d0b.js +13 -0
- package/dist/esm/data-provider.f10c6d0b.js.map +1 -0
- package/dist/esm/fetch.99aec438.js +152 -0
- package/dist/esm/fetch.99aec438.js.map +1 -0
- package/dist/esm/hash-string.285b37fb.js +39 -0
- package/dist/esm/hash-string.285b37fb.js.map +1 -0
- package/dist/esm/helpers.2f0a0cb7.js +141 -0
- package/dist/esm/helpers.2f0a0cb7.js.map +1 -0
- package/dist/esm/index.d.ts +797 -130
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +13 -9
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inset-map.3c18106d.js +66 -0
- package/dist/esm/inset-map.3c18106d.js.map +1 -0
- package/dist/esm/keyboard-navigation.6713401b.js +48 -0
- package/dist/esm/keyboard-navigation.6713401b.js.map +1 -0
- package/dist/esm/keyboard-navigation.a9fc80dd.js +112 -0
- package/dist/esm/keyboard-navigation.a9fc80dd.js.map +1 -0
- package/dist/esm/layers.033d3fb0.js +170 -0
- package/dist/esm/layers.033d3fb0.js.map +1 -0
- package/dist/esm/main.2e0375a5.js +221 -0
- package/dist/esm/main.2e0375a5.js.map +1 -0
- package/dist/esm/main.module.3dd9500b.css +134 -0
- package/dist/esm/main.module.3dd9500b.css.map +1 -0
- package/dist/esm/main.module.c09154b1.js +70 -0
- package/dist/esm/main.module.c09154b1.js.map +1 -0
- package/dist/esm/mapbox.cac42eed.js +167 -0
- package/dist/esm/mapbox.cac42eed.js.map +1 -0
- package/dist/esm/maps.bcdea9c1.js +11 -0
- package/dist/esm/maps.bcdea9c1.js.map +1 -0
- package/dist/esm/{names.f6a4e9a4.js → names.a8f2b452.js} +5 -5
- package/dist/esm/names.a8f2b452.js.map +1 -0
- package/dist/esm/panel.598f76a5.js +420 -0
- package/dist/esm/panel.598f76a5.js.map +1 -0
- package/dist/esm/panel.module.386166cc.js +58 -0
- package/dist/esm/panel.module.386166cc.js.map +1 -0
- package/dist/esm/panel.module.3d2ea3c6.css +111 -0
- package/dist/esm/panel.module.3d2ea3c6.css.map +1 -0
- package/dist/esm/popover.a810b7bc.js +66 -0
- package/dist/esm/popover.a810b7bc.js.map +1 -0
- package/dist/esm/popover.module.c4ba4189.js +22 -0
- package/dist/esm/popover.module.c4ba4189.js.map +1 -0
- package/dist/esm/{selection-popover.module.0a701258.css → popover.module.c4d6bfb0.css} +11 -8
- package/dist/esm/popover.module.c4d6bfb0.css.map +1 -0
- package/dist/esm/prepare-data.d4284b4a.js +125 -0
- package/dist/esm/prepare-data.d4284b4a.js.map +1 -0
- package/dist/esm/prepare-units.6c890a96.js +104 -0
- package/dist/esm/prepare-units.6c890a96.js.map +1 -0
- package/dist/esm/{resolvers.b5c82b78.js → resolvers.36013b49.js} +13 -2
- package/dist/esm/resolvers.36013b49.js.map +1 -0
- package/dist/esm/section.a34d379a.js +215 -0
- package/dist/esm/section.a34d379a.js.map +1 -0
- package/dist/esm/selection.f5b0297e.js +143 -0
- package/dist/esm/selection.f5b0297e.js.map +1 -0
- package/dist/esm/state.178ef364.js +75 -0
- package/dist/esm/state.178ef364.js.map +1 -0
- package/dist/esm/state.2952cbca.js +118 -0
- package/dist/esm/state.2952cbca.js.map +1 -0
- package/dist/esm/store.c4d7a8a4.js +52 -0
- package/dist/esm/store.c4d7a8a4.js.map +1 -0
- package/dist/esm/styles.7bc776d1.js +95 -0
- package/dist/esm/styles.7bc776d1.js.map +1 -0
- package/dist/esm/svg.4b9a96c1.js +89 -0
- package/dist/esm/svg.4b9a96c1.js.map +1 -0
- package/dist/esm/types.0f0b57c9.js +3 -0
- package/dist/esm/types.0f0b57c9.js.map +1 -0
- package/dist/esm/unit-details.071cefed.js +9 -0
- package/dist/esm/unit-details.071cefed.js.map +1 -0
- package/dist/esm/units.5a4fc058.js +98 -0
- package/dist/esm/units.5a4fc058.js.map +1 -0
- package/dist/esm/utils.d7a43a2a.js +55 -0
- package/dist/esm/utils.d7a43a2a.js.map +1 -0
- package/dist/node/index.js.map +1 -1
- package/package.json +24 -7
- package/src/age-axis.module.sass +27 -0
- package/src/age-axis.ts +82 -19
- package/src/age-model-overlay.module.sass +11 -0
- package/src/age-model-overlay.ts +73 -0
- package/src/carbon-isotopes/column.ts +4 -2
- package/src/carbon-isotopes/core.ts +9 -6
- package/src/carbon-isotopes/data-provider.ts +3 -3
- package/src/column.module.sass +58 -49
- package/src/column.ts +149 -135
- package/src/correlation-chart/hash-string.ts +57 -0
- package/src/correlation-chart/index.ts +2 -0
- package/src/correlation-chart/main.module.sass +122 -0
- package/src/correlation-chart/main.ts +305 -0
- package/src/correlation-chart/prepare-data.ts +217 -0
- package/src/correlation-chart/stories/correlation-chart.stories.ts +192 -0
- package/src/correlation-chart/stories/stories.module.sass +18 -0
- package/src/correlation-chart/unconformity-line.module.sass +8 -0
- package/src/correlation-chart/unconformity-line.ts +25 -0
- package/src/data-provider/base.ts +388 -0
- package/src/data-provider/column-nav.ts +53 -0
- package/src/data-provider/fetch.ts +231 -0
- package/src/data-provider/index.ts +4 -0
- package/src/data-provider/store.ts +72 -0
- package/src/index.ts +5 -3
- package/src/maps/_shared/index.ts +2 -0
- package/src/maps/_shared/inset-map.stories.ts +20 -0
- package/src/maps/_shared/inset-map.ts +87 -0
- package/src/maps/_shared/styles.ts +57 -0
- package/src/maps/column-correlation/column-correlation-map.stories.ts +96 -0
- package/src/maps/column-correlation/core.ts +225 -0
- package/src/maps/column-correlation/index.ts +2 -0
- package/src/maps/column-correlation/state.ts +192 -0
- package/src/maps/column-navigation/index.ts +2 -0
- package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +102 -0
- package/src/maps/column-navigation/mapbox/index.ts +219 -0
- package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +119 -0
- package/src/maps/column-navigation/mapbox/state.ts +109 -0
- package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +46 -0
- package/src/{map → maps/column-navigation/svg}/index.ts +18 -6
- package/src/{map → maps/column-navigation/svg}/layers.ts +28 -109
- package/src/maps/column-navigation/utils/keyboard-navigation.ts +58 -0
- package/src/maps/index.ts +3 -0
- package/src/prepare-units/composite-scale.ts +353 -0
- package/src/prepare-units/helpers.ts +226 -0
- package/src/prepare-units/index.ts +177 -0
- package/src/prepare-units/utils.ts +98 -0
- package/src/section.ts +264 -84
- package/src/unit-details/index.ts +2 -215
- package/src/unit-details/{index.module.sass → panel.module.sass} +39 -8
- package/src/unit-details/panel.ts +523 -0
- package/src/{selection-popover.module.sass → unit-details/popover.module.sass} +4 -2
- package/src/unit-details/popover.ts +82 -0
- package/src/units/boxes.module.sass +16 -0
- package/src/units/boxes.ts +243 -90
- package/src/units/colors.ts +64 -0
- package/src/units/composite.ts +157 -152
- package/src/units/index.ts +76 -9
- package/src/units/names.ts +8 -4
- package/src/units/resolvers.ts +11 -0
- package/src/units/selection.ts +115 -101
- package/src/units/types.ts +5 -16
- package/dist/esm/age-axis.64c509ee.js +0 -41
- package/dist/esm/age-axis.64c509ee.js.map +0 -1
- package/dist/esm/boxes.13968b76.js +0 -164
- package/dist/esm/boxes.13968b76.js.map +0 -1
- package/dist/esm/boxes.module.28873d08.css +0 -4
- package/dist/esm/boxes.module.28873d08.css.map +0 -1
- package/dist/esm/boxes.module.605bdcd6.js +0 -13
- package/dist/esm/boxes.module.605bdcd6.js.map +0 -1
- package/dist/esm/column.8dd26e1a.js +0 -149
- package/dist/esm/column.8dd26e1a.js.map +0 -1
- package/dist/esm/column.db058031.js.map +0 -1
- package/dist/esm/column.module.039d872c.css +0 -151
- package/dist/esm/column.module.039d872c.css.map +0 -1
- package/dist/esm/column.module.e632868a.js +0 -19
- package/dist/esm/column.module.e632868a.js.map +0 -1
- package/dist/esm/composite.608a4ca2.js +0 -153
- package/dist/esm/composite.608a4ca2.js.map +0 -1
- package/dist/esm/core.4db8e452.js.map +0 -1
- package/dist/esm/helpers.8a03cfc7.js +0 -94
- package/dist/esm/helpers.8a03cfc7.js.map +0 -1
- package/dist/esm/index.module.0844afd8.css +0 -65
- package/dist/esm/index.module.0844afd8.css.map +0 -1
- package/dist/esm/index.module.24fe3a2e.js +0 -37
- package/dist/esm/index.module.24fe3a2e.js.map +0 -1
- package/dist/esm/layers.ad5fd25d.js +0 -231
- package/dist/esm/layers.ad5fd25d.js.map +0 -1
- package/dist/esm/map.7aa26f17.js +0 -82
- package/dist/esm/map.7aa26f17.js.map +0 -1
- package/dist/esm/names.f6a4e9a4.js.map +0 -1
- package/dist/esm/providers.cd1e652f.js +0 -25
- package/dist/esm/providers.cd1e652f.js.map +0 -1
- package/dist/esm/resolvers.b5c82b78.js.map +0 -1
- package/dist/esm/section.cc1b1100.js +0 -118
- package/dist/esm/section.cc1b1100.js.map +0 -1
- package/dist/esm/selection-popover.17d1bd55.js +0 -60
- package/dist/esm/selection-popover.17d1bd55.js.map +0 -1
- package/dist/esm/selection-popover.module.0a701258.css.map +0 -1
- package/dist/esm/selection-popover.module.e22f5183.js +0 -22
- package/dist/esm/selection-popover.module.e22f5183.js.map +0 -1
- package/dist/esm/selection.bbf26d0e.js +0 -117
- package/dist/esm/selection.bbf26d0e.js.map +0 -1
- package/dist/esm/store.25eaa168.js +0 -18
- package/dist/esm/store.25eaa168.js.map +0 -1
- package/dist/esm/types.f016e032.js +0 -18
- package/dist/esm/types.f016e032.js.map +0 -1
- package/dist/esm/unit-details.56ff8b70.js +0 -209
- package/dist/esm/unit-details.56ff8b70.js.map +0 -1
- package/dist/esm/units.361088d4.js +0 -42
- package/dist/esm/units.361088d4.js.map +0 -1
- package/src/helpers.ts +0 -133
- package/src/providers.ts +0 -34
- package/src/selection-popover.ts +0 -71
- package/src/store.ts +0 -12
- package/src/units/units.scss +0 -16
- /package/src/{map → maps/column-navigation/svg}/animated.ts +0 -0
package/src/units/composite.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { hyperStyled } from "@macrostrat/hyper";
|
|
2
2
|
import {
|
|
3
3
|
LithologyColumn,
|
|
4
|
-
useColumn,
|
|
5
|
-
ColumnLayoutContext,
|
|
6
4
|
ColumnAxisType,
|
|
5
|
+
SVG,
|
|
6
|
+
ColumnContext,
|
|
7
7
|
} from "@macrostrat/column-components";
|
|
8
8
|
import { defaultNameFunction, UnitNamesColumn } from "./names";
|
|
9
9
|
import {
|
|
@@ -12,11 +12,12 @@ import {
|
|
|
12
12
|
useState,
|
|
13
13
|
useRef,
|
|
14
14
|
useCallback,
|
|
15
|
-
|
|
15
|
+
useEffect,
|
|
16
16
|
} from "react";
|
|
17
17
|
import { BaseUnit } from "@macrostrat/api-types";
|
|
18
18
|
import { LabeledUnit, UnitBoxes } from "./boxes";
|
|
19
19
|
import styles from "./composite.module.sass";
|
|
20
|
+
import { useMacrostratColumnData } from "../data-provider";
|
|
20
21
|
|
|
21
22
|
const h = hyperStyled(styles);
|
|
22
23
|
|
|
@@ -27,24 +28,32 @@ interface LabelTracker {
|
|
|
27
28
|
const LabelTrackerContext = createContext(null);
|
|
28
29
|
const UnlabeledDivisionsContext = createContext(null);
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const findMacrostratUnitID = (u) => u.unit_id;
|
|
32
|
+
|
|
33
|
+
export function LabelTrackerProvider(props) {
|
|
34
|
+
/** Tracker for units to handle state for whether their labels fit inline or not.
|
|
35
|
+
* Designed to work for single or composite columns.
|
|
36
|
+
*/
|
|
37
|
+
const { children, units, findUnitID = findMacrostratUnitID } = props;
|
|
33
38
|
const [unlabeledDivisions, setUnlabeledDivisions] = useState<
|
|
34
39
|
BaseUnit[] | null
|
|
35
40
|
>(null);
|
|
36
41
|
const labelTrackerRef = useRef<LabelTracker>({});
|
|
37
42
|
const trackLabelVisibility = useCallback(
|
|
38
43
|
(div, visible) => {
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
const id = findUnitID(div);
|
|
45
|
+
labelTrackerRef.current[id] = visible;
|
|
46
|
+
if (Object.keys(labelTrackerRef.current).length == units.length) {
|
|
41
47
|
setUnlabeledDivisions(
|
|
42
48
|
// @ts-ignore
|
|
43
|
-
|
|
49
|
+
units.filter((d) => {
|
|
50
|
+
const id = findUnitID(d);
|
|
51
|
+
return labelTrackerRef.current[id] == false;
|
|
52
|
+
})
|
|
44
53
|
);
|
|
45
54
|
}
|
|
46
55
|
},
|
|
47
|
-
[labelTrackerRef,
|
|
56
|
+
[labelTrackerRef, units, findUnitID]
|
|
48
57
|
);
|
|
49
58
|
|
|
50
59
|
const value = trackLabelVisibility;
|
|
@@ -62,60 +71,21 @@ function LabelTrackerProvider(props) {
|
|
|
62
71
|
function TrackedLabeledUnit({
|
|
63
72
|
division,
|
|
64
73
|
nameForDivision = defaultNameFunction,
|
|
65
|
-
axisType,
|
|
66
74
|
...rest
|
|
67
75
|
}) {
|
|
68
76
|
const trackLabelVisibility = useContext(LabelTrackerContext);
|
|
69
77
|
return h(LabeledUnit, {
|
|
70
78
|
division,
|
|
71
|
-
//halfWidth: div.bottomOverlap,
|
|
72
79
|
label: nameForDivision(division),
|
|
73
80
|
onLabelUpdated(label, visible) {
|
|
74
|
-
|
|
81
|
+
// If there is al LabelTrackerContext, update the label visibility
|
|
82
|
+
trackLabelVisibility?.(division, visible);
|
|
75
83
|
},
|
|
76
84
|
...rest,
|
|
77
85
|
});
|
|
78
86
|
}
|
|
79
87
|
|
|
80
|
-
|
|
81
|
-
// Returns only unlabeled divisions
|
|
82
|
-
const divisions = useContext(UnlabeledDivisionsContext);
|
|
83
|
-
if (divisions == null) return null;
|
|
84
|
-
return h(UnitNamesColumn, { divisions, ...props });
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function _BaseUnitsColumn(
|
|
88
|
-
props: React.PropsWithChildren<{
|
|
89
|
-
width: number;
|
|
90
|
-
unitComponent?: React.FC<any>;
|
|
91
|
-
unitComponentProps?: any;
|
|
92
|
-
clipToFrame?: boolean;
|
|
93
|
-
}>
|
|
94
|
-
) {
|
|
95
|
-
/*
|
|
96
|
-
A column with units and names either
|
|
97
|
-
overlapping or offset to the right
|
|
98
|
-
*/
|
|
99
|
-
const {
|
|
100
|
-
width,
|
|
101
|
-
children,
|
|
102
|
-
unitComponent = TrackedLabeledUnit,
|
|
103
|
-
unitComponentProps,
|
|
104
|
-
clipToFrame,
|
|
105
|
-
...rest
|
|
106
|
-
} = props;
|
|
107
|
-
|
|
108
|
-
return h(LabelTrackerProvider, [
|
|
109
|
-
h(LithologyColumn, { width, clipToFrame }, [
|
|
110
|
-
h(UnitBoxes, {
|
|
111
|
-
unitComponent,
|
|
112
|
-
unitComponentProps,
|
|
113
|
-
...rest,
|
|
114
|
-
}),
|
|
115
|
-
]),
|
|
116
|
-
children,
|
|
117
|
-
]);
|
|
118
|
-
}
|
|
88
|
+
export const CompositeUnitComponent = TrackedLabeledUnit;
|
|
119
89
|
|
|
120
90
|
type BaseUnitProps = {
|
|
121
91
|
width: number;
|
|
@@ -135,132 +105,167 @@ type ICompositeUnitProps = BaseUnitProps & {
|
|
|
135
105
|
noteMode?: "labeled" | "unlabeled";
|
|
136
106
|
showLabelColumn?: boolean;
|
|
137
107
|
noteComponent?: React.FC<any>;
|
|
138
|
-
shouldRenderNote?: (d:
|
|
108
|
+
shouldRenderNote?: (d: any) => boolean;
|
|
139
109
|
};
|
|
140
110
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
111
|
+
interface CompositeUnitProps {
|
|
112
|
+
unitComponent: React.FC<any>;
|
|
113
|
+
unitComponentProps?: any;
|
|
114
|
+
width: number;
|
|
115
|
+
showLabels?: boolean;
|
|
116
|
+
clipToFrame?: boolean;
|
|
117
|
+
}
|
|
145
118
|
|
|
146
|
-
function
|
|
119
|
+
export function CompositeUnitsColumn(props: CompositeUnitProps) {
|
|
147
120
|
/*
|
|
148
121
|
A column with units and names either
|
|
149
122
|
overlapping or offset to the right
|
|
150
123
|
*/
|
|
151
124
|
const {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
showLabels = true,
|
|
157
|
-
nameForDivision,
|
|
158
|
-
minimumLabelHeight = 0,
|
|
159
|
-
axisType,
|
|
125
|
+
width,
|
|
126
|
+
unitComponent = TrackedLabeledUnit,
|
|
127
|
+
unitComponentProps,
|
|
128
|
+
clipToFrame,
|
|
160
129
|
...rest
|
|
161
130
|
} = props;
|
|
162
131
|
|
|
163
|
-
return h(
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
h.if(showLabels)(UnlabeledUnitNames, {
|
|
171
|
-
transform: `translate(${columnWidth + gutterWidth})`,
|
|
172
|
-
paddingLeft: labelOffset,
|
|
173
|
-
width: width - columnWidth - gutterWidth,
|
|
174
|
-
minimumHeight: minimumLabelHeight,
|
|
175
|
-
nameForDivision,
|
|
176
|
-
...rest,
|
|
177
|
-
}),
|
|
178
|
-
// h(UnitDataColumn, {
|
|
179
|
-
// transform: `translate(${columnWidth + gutterWidth})`,
|
|
180
|
-
// paddingLeft: labelOffset,
|
|
181
|
-
// width: width - columnWidth - gutterWidth,
|
|
182
|
-
// ...rest
|
|
183
|
-
// })
|
|
184
|
-
]
|
|
185
|
-
);
|
|
132
|
+
return h(LithologyColumn, { width, clipToFrame }, [
|
|
133
|
+
h(UnitBoxes, {
|
|
134
|
+
unitComponent,
|
|
135
|
+
unitComponentProps,
|
|
136
|
+
...rest,
|
|
137
|
+
}),
|
|
138
|
+
]);
|
|
186
139
|
}
|
|
187
140
|
|
|
188
|
-
function
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
141
|
+
export function AnnotatedUnitsColumn(props: ICompositeUnitProps) {
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
console.warn(
|
|
144
|
+
"AnnotatedUnitsColumn is deprecated and currently renders a no-op for transition purposes"
|
|
145
|
+
);
|
|
146
|
+
}, []);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function SectionLabelsColumn(props: ICompositeUnitProps) {
|
|
151
|
+
// Section with "squishy" time scale
|
|
193
152
|
const {
|
|
194
|
-
width =
|
|
195
|
-
gutterWidth = 10,
|
|
196
|
-
labelOffset = 30,
|
|
153
|
+
width = 300,
|
|
197
154
|
noteMode = "unlabeled",
|
|
198
|
-
|
|
199
|
-
showLabelColumn = true,
|
|
155
|
+
labelOffset = 30,
|
|
200
156
|
noteComponent,
|
|
201
157
|
shouldRenderNote,
|
|
202
|
-
...rest
|
|
203
158
|
} = props;
|
|
204
159
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
160
|
+
const { sections, totalHeight, axisType } = useMacrostratColumnData();
|
|
161
|
+
|
|
162
|
+
const unlabeledUnits = useContext(UnlabeledDivisionsContext);
|
|
163
|
+
const unitsToLabel = noteMode == "unlabeled" ? unlabeledUnits : undefined;
|
|
164
|
+
|
|
165
|
+
const _compositeScale = compositeScale(sections);
|
|
166
|
+
|
|
167
|
+
return h("div.section-labels-column", [
|
|
168
|
+
h(
|
|
169
|
+
ColumnNotesProvider,
|
|
170
|
+
{
|
|
171
|
+
units: [],
|
|
172
|
+
scale: _compositeScale,
|
|
173
|
+
totalHeight,
|
|
174
|
+
axisType,
|
|
175
|
+
},
|
|
176
|
+
h(
|
|
177
|
+
SVG,
|
|
178
|
+
{
|
|
179
|
+
height: totalHeight,
|
|
180
|
+
innerWidth: width - 4,
|
|
181
|
+
paddingH: 1,
|
|
182
|
+
paddingLeft: 3,
|
|
183
|
+
},
|
|
184
|
+
h(UnitNamesColumn, {
|
|
185
|
+
divisions: unitsToLabel,
|
|
186
|
+
paddingLeft: labelOffset,
|
|
187
|
+
width,
|
|
188
|
+
noteComponent,
|
|
189
|
+
shouldRenderNote,
|
|
190
|
+
scale: _compositeScale,
|
|
191
|
+
})
|
|
192
|
+
)
|
|
193
|
+
),
|
|
221
194
|
]);
|
|
222
195
|
}
|
|
223
196
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
197
|
+
type CompositeScaleOpts = {
|
|
198
|
+
clamped?: boolean;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export interface CompositeColumnScale {
|
|
202
|
+
(val: number): number;
|
|
203
|
+
copy(): CompositeColumnScale;
|
|
204
|
+
domain(): number[];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function compositeScale(
|
|
208
|
+
sections,
|
|
209
|
+
opts: CompositeScaleOpts = {}
|
|
210
|
+
): CompositeColumnScale {
|
|
211
|
+
/** A basic composite scale that works across all sections. This isn't a fully featured,
|
|
212
|
+
* contiuous D3 scale, but it shares enough attributes to be useful for
|
|
213
|
+
* laying out notes.
|
|
214
|
+
*/
|
|
215
|
+
const { clamped = true } = opts;
|
|
216
|
+
|
|
217
|
+
const scales = sections.map((group) => {
|
|
218
|
+
const { scaleInfo } = group;
|
|
219
|
+
return scaleInfo.scale.copy().clamp(clamped);
|
|
242
220
|
});
|
|
221
|
+
|
|
222
|
+
let baseScale: any = (val) => {
|
|
223
|
+
// Find the scale for the section that contains the value
|
|
224
|
+
const scale = scales.find((scale) => {
|
|
225
|
+
return scale.domain()[0] <= val && val <= scale.domain()[1];
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
if (scale) {
|
|
229
|
+
return scale(val);
|
|
230
|
+
} else {
|
|
231
|
+
// return nan
|
|
232
|
+
return NaN;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
baseScale.copy = () => {
|
|
237
|
+
return baseScale;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
baseScale.domain = () => {
|
|
241
|
+
// Return a domain that covers all sections
|
|
242
|
+
return [scales[0].domain()[0], scales[scales.length - 1].domain()[1]];
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
return baseScale as CompositeColumnScale;
|
|
243
246
|
}
|
|
244
247
|
|
|
245
|
-
|
|
248
|
+
function ColumnNotesProvider(props) {
|
|
249
|
+
// A fake column axis provider that allows scales to cross
|
|
250
|
+
const { children, scale, totalHeight, pixelScale } = props;
|
|
246
251
|
|
|
247
|
-
|
|
248
|
-
// This comes from CompositeUnits
|
|
249
|
-
const { width } = useContext(ColumnLayoutContext);
|
|
252
|
+
const { axisType } = useMacrostratColumnData();
|
|
250
253
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
254
|
+
return h(
|
|
255
|
+
ColumnContext.Provider,
|
|
256
|
+
{
|
|
257
|
+
value: {
|
|
258
|
+
divisions: [],
|
|
259
|
+
scale,
|
|
260
|
+
scaleClamped: scale,
|
|
261
|
+
pixelHeight: totalHeight,
|
|
262
|
+
pixelsPerMeter: pixelScale,
|
|
263
|
+
axisType,
|
|
264
|
+
zoom: 1,
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
children
|
|
268
|
+
);
|
|
259
269
|
}
|
|
260
270
|
|
|
261
|
-
export {
|
|
262
|
-
CompositeUnitsColumn,
|
|
263
|
-
AnnotatedUnitsColumn,
|
|
264
|
-
TrackedLabeledUnit,
|
|
265
|
-
ICompositeUnitProps,
|
|
266
|
-
};
|
|
271
|
+
export { TrackedLabeledUnit, ICompositeUnitProps };
|
package/src/units/index.ts
CHANGED
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
import h from "@macrostrat/hyper";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
LithologyColumn,
|
|
4
|
+
useGeologicPattern,
|
|
5
|
+
} from "@macrostrat/column-components";
|
|
3
6
|
import { UnitNamesColumn } from "./names";
|
|
4
7
|
import { ICompositeUnitProps } from "./composite";
|
|
5
8
|
import { UnitBoxes } from "./boxes";
|
|
9
|
+
import { useColumnLayout } from "@macrostrat/column-components";
|
|
10
|
+
import { useInDarkMode } from "@macrostrat/ui-components";
|
|
11
|
+
import { getMixedUnitColor } from "./colors";
|
|
12
|
+
import { TrackedLabeledUnit } from "./composite";
|
|
13
|
+
import { useLithologies } from "../data-provider";
|
|
14
|
+
import { useMemo } from "react";
|
|
15
|
+
import { resolveID } from "./resolvers";
|
|
16
|
+
import { Lithology } from "@macrostrat/api-types";
|
|
6
17
|
|
|
7
|
-
|
|
18
|
+
export * from "./composite";
|
|
19
|
+
export * from "./types";
|
|
20
|
+
export * from "./selection";
|
|
21
|
+
export * from "./colors";
|
|
22
|
+
|
|
23
|
+
export function UnitsColumn({ width = 100 }) {
|
|
8
24
|
/*
|
|
9
25
|
A column showing units with USGS color fill
|
|
10
26
|
*/
|
|
11
27
|
return h(LithologyColumn, { width }, h(UnitBoxes));
|
|
12
|
-
}
|
|
28
|
+
}
|
|
13
29
|
|
|
14
|
-
|
|
30
|
+
export function SimpleUnitsColumn(props: ICompositeUnitProps) {
|
|
15
31
|
/*
|
|
16
32
|
A column with units and names either
|
|
17
33
|
overlapping or offset to the right
|
|
@@ -28,9 +44,60 @@ const SimpleUnitsColumn = (props: ICompositeUnitProps) => {
|
|
|
28
44
|
width: width - columnWidth - gutterWidth,
|
|
29
45
|
}),
|
|
30
46
|
]);
|
|
31
|
-
}
|
|
47
|
+
}
|
|
32
48
|
|
|
33
|
-
export {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
49
|
+
export function UnitComponent({ division, nColumns = 2, ...rest }) {
|
|
50
|
+
const width = rest.width ?? useColumnLayout()?.width;
|
|
51
|
+
|
|
52
|
+
const nOverlappingUnits = division.overlappingUnits?.length ?? 0;
|
|
53
|
+
const columnIx = (division.column ?? 0) % nColumns;
|
|
54
|
+
|
|
55
|
+
return h(TrackedLabeledUnit, {
|
|
56
|
+
division,
|
|
57
|
+
...rest,
|
|
58
|
+
width: nOverlappingUnits > 0 ? width / nColumns : width,
|
|
59
|
+
x: (columnIx * width) / nColumns,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function ColoredUnitComponent(props) {
|
|
64
|
+
/** A unit component that is colored using a mixture of lithologies.
|
|
65
|
+
* This is a separate component because it depends on more providers/contexts to determine coloring. */
|
|
66
|
+
const lithMap = useLithologies();
|
|
67
|
+
const inDarkMode = useInDarkMode();
|
|
68
|
+
|
|
69
|
+
const backgroundColor = useMemo(() => {
|
|
70
|
+
return getMixedUnitColor(props.division, lithMap, inDarkMode);
|
|
71
|
+
}, [props.division?.unit_id, lithMap, inDarkMode]);
|
|
72
|
+
|
|
73
|
+
const patternID = useMemo(() => {
|
|
74
|
+
return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);
|
|
75
|
+
}, [props.division?.unit_id, lithMap]);
|
|
76
|
+
|
|
77
|
+
const fill = useGeologicPattern(patternID);
|
|
78
|
+
|
|
79
|
+
return h(UnitComponent, {
|
|
80
|
+
fill,
|
|
81
|
+
backgroundColor,
|
|
82
|
+
...props,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function getPatternID(
|
|
87
|
+
liths: Array<Lithology>,
|
|
88
|
+
lithMap: Map<number, Lithology>
|
|
89
|
+
): string | null {
|
|
90
|
+
if (lithMap == null || liths == null || liths.length == 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const patternIDs = new Set<string>();
|
|
94
|
+
for (const lith of liths) {
|
|
95
|
+
const lithData = lithMap.get(lith.lith_id);
|
|
96
|
+
if (lithData) {
|
|
97
|
+
patternIDs.add(`${lithData.fill}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
let id = patternIDs.values()[0];
|
|
101
|
+
if (id == "0") return null;
|
|
102
|
+
return id;
|
|
103
|
+
}
|
package/src/units/names.ts
CHANGED
|
@@ -7,8 +7,10 @@ import {
|
|
|
7
7
|
NotesColumnProps,
|
|
8
8
|
} from "@macrostrat/column-components";
|
|
9
9
|
import type { ColumnDivision } from "@macrostrat/column-components";
|
|
10
|
-
import { IUnit
|
|
10
|
+
import { IUnit } from "./types";
|
|
11
11
|
import React from "react";
|
|
12
|
+
import { getUnitHeightRange } from "../prepare-units/utils";
|
|
13
|
+
import { CompositeColumnScale } from "./composite";
|
|
12
14
|
|
|
13
15
|
interface UnitDataProps extends NotesColumnProps {
|
|
14
16
|
left?: number;
|
|
@@ -17,6 +19,7 @@ interface UnitDataProps extends NotesColumnProps {
|
|
|
17
19
|
shouldRenderNote?(div: ColumnDivision | IUnit, index: number): boolean;
|
|
18
20
|
divisions?: IUnit[];
|
|
19
21
|
minimumHeight?: number;
|
|
22
|
+
scale?: CompositeColumnScale;
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
type UnitNote = {
|
|
@@ -32,10 +35,11 @@ function noteForDivision(
|
|
|
32
35
|
): UnitNote {
|
|
33
36
|
const { axisType } = opts;
|
|
34
37
|
|
|
35
|
-
const
|
|
38
|
+
const [height, top_height] = getUnitHeightRange(div, axisType);
|
|
39
|
+
|
|
36
40
|
return {
|
|
37
|
-
height
|
|
38
|
-
top_height
|
|
41
|
+
height,
|
|
42
|
+
top_height,
|
|
39
43
|
data: div,
|
|
40
44
|
id: div.unit_id,
|
|
41
45
|
};
|
package/src/units/resolvers.ts
CHANGED
|
@@ -7,6 +7,8 @@ const symbolIndex = {
|
|
|
7
7
|
sand: 608,
|
|
8
8
|
siltstone: 616,
|
|
9
9
|
silt: 616,
|
|
10
|
+
siliciclastic: 615,
|
|
11
|
+
mud: 620,
|
|
10
12
|
"dolomitic siltstone": 616,
|
|
11
13
|
shale: 620,
|
|
12
14
|
limestone: 627,
|
|
@@ -16,15 +18,23 @@ const symbolIndex = {
|
|
|
16
18
|
"dolomite-mudstone": 642,
|
|
17
19
|
dolostone: 642,
|
|
18
20
|
mudstone: 620,
|
|
21
|
+
slate: 703,
|
|
19
22
|
"sandy-dolomite": 645,
|
|
20
23
|
quartzite: 702,
|
|
21
24
|
halite: 668,
|
|
25
|
+
gypsum: 667,
|
|
26
|
+
evaporite: 667,
|
|
27
|
+
claystone: 620,
|
|
28
|
+
anhydrite: 667,
|
|
29
|
+
gabbro: 720,
|
|
22
30
|
basalt: 717,
|
|
31
|
+
diabase: 717,
|
|
23
32
|
rhyolite: 722,
|
|
24
33
|
andesite: 723,
|
|
25
34
|
till: 681,
|
|
26
35
|
loess: 684,
|
|
27
36
|
"calcareous ooze": 653,
|
|
37
|
+
"siliceous ooze": 653,
|
|
28
38
|
chalk: 626,
|
|
29
39
|
gravel: 601,
|
|
30
40
|
plutonic: 721,
|
|
@@ -41,6 +51,7 @@ const symbolIndex = {
|
|
|
41
51
|
granodiorite: 725,
|
|
42
52
|
monzonite: 723,
|
|
43
53
|
argillite: 624,
|
|
54
|
+
diamictite: 681,
|
|
44
55
|
};
|
|
45
56
|
|
|
46
57
|
const resolveID = (d: any) => {
|