@macrostrat/column-views 1.0.3 → 2.0.1

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 (258) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/esm/{data-area.daff8da0.js → column-views.062d164a.js} +1 -1
  3. package/dist/esm/{data-area.daff8da0.js.map → column-views.062d164a.js.map} +1 -1
  4. package/dist/esm/{data-provider.1506eb64.js → column-views.07521ce6.js} +1 -1
  5. package/dist/esm/column-views.07521ce6.js.map +1 -0
  6. package/dist/esm/column-views.134b2e2a.js +9 -0
  7. package/dist/esm/column-views.134b2e2a.js.map +1 -0
  8. package/dist/esm/{selection-popover.module.0a701258.css → column-views.16cc7a58.css} +11 -8
  9. package/dist/esm/column-views.16cc7a58.css.map +1 -0
  10. package/dist/esm/column-views.1c589cc4.js +141 -0
  11. package/dist/esm/column-views.1c589cc4.js.map +1 -0
  12. package/dist/esm/column-views.1ece326b.js +420 -0
  13. package/dist/esm/column-views.1ece326b.js.map +1 -0
  14. package/dist/esm/column-views.1edc7300.js +40 -0
  15. package/dist/esm/column-views.1edc7300.js.map +1 -0
  16. package/dist/esm/column-views.240ef158.css +159 -0
  17. package/dist/esm/column-views.240ef158.css.map +1 -0
  18. package/dist/esm/column-views.25471fe0.css +111 -0
  19. package/dist/esm/column-views.25471fe0.css.map +1 -0
  20. package/dist/esm/column-views.28ee5f43.js +288 -0
  21. package/dist/esm/column-views.28ee5f43.js.map +1 -0
  22. package/dist/esm/column-views.30646469.js +118 -0
  23. package/dist/esm/column-views.30646469.js.map +1 -0
  24. package/dist/esm/column-views.338a7a83.css +134 -0
  25. package/dist/esm/column-views.338a7a83.css.map +1 -0
  26. package/dist/esm/column-views.33dbc778.js +95 -0
  27. package/dist/esm/column-views.33dbc778.js.map +1 -0
  28. package/dist/esm/column-views.343b5aa2.js +98 -0
  29. package/dist/esm/column-views.343b5aa2.js.map +1 -0
  30. package/dist/esm/column-views.34636ec7.js +104 -0
  31. package/dist/esm/column-views.34636ec7.js.map +1 -0
  32. package/dist/esm/column-views.3465c8ad.js +16 -0
  33. package/dist/esm/column-views.3465c8ad.js.map +1 -0
  34. package/dist/esm/column-views.39657bbf.js +55 -0
  35. package/dist/esm/column-views.39657bbf.js.map +1 -0
  36. package/dist/esm/column-views.3b972a9b.css +4 -0
  37. package/dist/esm/{composite.module.69a38fd1.css.map → column-views.3b972a9b.css.map} +1 -1
  38. package/dist/esm/column-views.3bec70d6.js +167 -0
  39. package/dist/esm/column-views.3bec70d6.js.map +1 -0
  40. package/dist/esm/column-views.3de4dc43.js +66 -0
  41. package/dist/esm/column-views.3de4dc43.js.map +1 -0
  42. package/dist/esm/{column.db058031.js → column-views.3f4db8cb.js} +8 -8
  43. package/dist/esm/column-views.3f4db8cb.js.map +1 -0
  44. package/dist/esm/column-views.40c1f361.js +206 -0
  45. package/dist/esm/column-views.40c1f361.js.map +1 -0
  46. package/dist/esm/{composite.module.0638e7ee.js → column-views.40cd59b5.js} +1 -1
  47. package/dist/esm/{composite.module.0638e7ee.js.map → column-views.40cd59b5.js.map} +1 -1
  48. package/dist/esm/column-views.4637f4ce.js +46 -0
  49. package/dist/esm/column-views.4637f4ce.js.map +1 -0
  50. package/dist/esm/column-views.4c4c5bac.js +163 -0
  51. package/dist/esm/column-views.4c4c5bac.js.map +1 -0
  52. package/dist/esm/column-views.4d374a35.js +19 -0
  53. package/dist/esm/column-views.4d374a35.js.map +1 -0
  54. package/dist/esm/column-views.57c4ddf3.js +125 -0
  55. package/dist/esm/column-views.57c4ddf3.js.map +1 -0
  56. package/dist/esm/column-views.58b82432.js +58 -0
  57. package/dist/esm/column-views.58b82432.js.map +1 -0
  58. package/dist/esm/column-views.5b2635fd.js +13 -0
  59. package/dist/esm/column-views.5b2635fd.js.map +1 -0
  60. package/dist/esm/column-views.5c02fee2.js +258 -0
  61. package/dist/esm/column-views.5c02fee2.js.map +1 -0
  62. package/dist/esm/column-views.5cc09c1d.js +152 -0
  63. package/dist/esm/column-views.5cc09c1d.js.map +1 -0
  64. package/dist/esm/{names.f6a4e9a4.js → column-views.650bd9f5.js} +5 -5
  65. package/dist/esm/column-views.650bd9f5.js.map +1 -0
  66. package/dist/esm/column-views.68409161.js +89 -0
  67. package/dist/esm/column-views.68409161.js.map +1 -0
  68. package/dist/esm/column-views.6a954628.js +70 -0
  69. package/dist/esm/column-views.6a954628.js.map +1 -0
  70. package/dist/esm/column-views.6c670c13.css +26 -0
  71. package/dist/esm/column-views.6c670c13.css.map +1 -0
  72. package/dist/esm/column-views.6d6b73b4.js +55 -0
  73. package/dist/esm/column-views.6d6b73b4.js.map +1 -0
  74. package/dist/esm/column-views.86c4b36f.js +222 -0
  75. package/dist/esm/column-views.86c4b36f.js.map +1 -0
  76. package/dist/esm/column-views.88de2cee.js +9 -0
  77. package/dist/esm/column-views.88de2cee.js.map +1 -0
  78. package/dist/esm/{resolvers.b5c82b78.js → column-views.8dd877af.js} +16 -3
  79. package/dist/esm/column-views.8dd877af.js.map +1 -0
  80. package/dist/esm/column-views.8e51206e.js +143 -0
  81. package/dist/esm/column-views.8e51206e.js.map +1 -0
  82. package/dist/esm/{column.module.7f47d25a.js → column-views.94b5cca1.js} +1 -1
  83. package/dist/esm/{column.module.7f47d25a.js.map → column-views.94b5cca1.js.map} +1 -1
  84. package/dist/esm/column-views.9804efda.js +75 -0
  85. package/dist/esm/column-views.9804efda.js.map +1 -0
  86. package/dist/esm/column-views.9bdd477a.js +57 -0
  87. package/dist/esm/column-views.9bdd477a.js.map +1 -0
  88. package/dist/esm/column-views.9ced149e.js +98 -0
  89. package/dist/esm/column-views.9ced149e.js.map +1 -0
  90. package/dist/esm/{column.module.cbb072df.css → column-views.a7be0a4a.css} +1 -1
  91. package/dist/esm/{column.module.cbb072df.css.map → column-views.a7be0a4a.css.map} +1 -1
  92. package/dist/esm/column-views.a98214b2.js +9 -0
  93. package/dist/esm/column-views.a98214b2.js.map +1 -0
  94. package/dist/esm/column-views.aa9fcdba.js +221 -0
  95. package/dist/esm/column-views.aa9fcdba.js.map +1 -0
  96. package/dist/esm/{isotopes-column.7cb5cc45.js → column-views.ac9fb5e1.js} +3 -3
  97. package/dist/esm/{isotopes-column.7cb5cc45.js.map → column-views.ac9fb5e1.js.map} +1 -1
  98. package/dist/esm/column-views.b2e5f1d9.js +11 -0
  99. package/dist/esm/column-views.b2e5f1d9.js.map +1 -0
  100. package/dist/esm/column-views.b775c0a3.js +112 -0
  101. package/dist/esm/column-views.b775c0a3.js.map +1 -0
  102. package/dist/esm/column-views.beb54e95.js +39 -0
  103. package/dist/esm/column-views.beb54e95.js.map +1 -0
  104. package/dist/esm/{core.4db8e452.js → column-views.c58aad3f.js} +15 -16
  105. package/dist/esm/column-views.c58aad3f.js.map +1 -0
  106. package/dist/esm/{carbon-isotopes.3b502a9e.js → column-views.d1ad48eb.js} +4 -4
  107. package/dist/esm/{carbon-isotopes.3b502a9e.js.map → column-views.d1ad48eb.js.map} +1 -1
  108. package/dist/esm/column-views.dc42f5d0.js +48 -0
  109. package/dist/esm/column-views.dc42f5d0.js.map +1 -0
  110. package/dist/esm/column-views.dff52504.js +22 -0
  111. package/dist/esm/column-views.dff52504.js.map +1 -0
  112. package/dist/esm/column-views.e2b9c23c.css +33 -0
  113. package/dist/esm/column-views.e2b9c23c.css.map +1 -0
  114. package/dist/esm/column-views.e40b8bfb.css +14 -0
  115. package/dist/esm/column-views.e40b8bfb.css.map +1 -0
  116. package/dist/esm/column-views.e77b9d6b.js +170 -0
  117. package/dist/esm/column-views.e77b9d6b.js.map +1 -0
  118. package/dist/esm/column-views.ea237aa8.js +52 -0
  119. package/dist/esm/column-views.ea237aa8.js.map +1 -0
  120. package/dist/esm/column-views.edf77621.js +22 -0
  121. package/dist/esm/column-views.edf77621.js.map +1 -0
  122. package/dist/esm/column-views.f1efcc2c.js +9 -0
  123. package/dist/esm/column-views.f1efcc2c.js.map +1 -0
  124. package/dist/esm/column-views.f2e5a72f.js +66 -0
  125. package/dist/esm/column-views.f2e5a72f.js.map +1 -0
  126. package/dist/esm/column-views.f71ec4b4.js +127 -0
  127. package/dist/esm/column-views.f71ec4b4.js.map +1 -0
  128. package/dist/esm/column-views.f9dab157.js +3 -0
  129. package/dist/esm/column-views.f9dab157.js.map +1 -0
  130. package/dist/esm/column-views.fa6f3292.js +215 -0
  131. package/dist/esm/column-views.fa6f3292.js.map +1 -0
  132. package/dist/esm/column-views.fc2b4611.js +9 -0
  133. package/dist/esm/column-views.fc2b4611.js.map +1 -0
  134. package/dist/esm/index.d.ts +797 -130
  135. package/dist/esm/index.d.ts.map +1 -1
  136. package/dist/esm/index.js +13 -9
  137. package/dist/esm/index.js.map +1 -1
  138. package/dist/node/index.js +1 -1
  139. package/dist/node/index.js.map +1 -1
  140. package/package.json +29 -13
  141. package/src/age-axis.module.sass +27 -0
  142. package/src/age-axis.ts +82 -19
  143. package/src/age-model-overlay.module.sass +11 -0
  144. package/src/age-model-overlay.ts +73 -0
  145. package/src/carbon-isotopes/column.ts +4 -2
  146. package/src/carbon-isotopes/core.ts +9 -6
  147. package/src/carbon-isotopes/data-provider.ts +3 -3
  148. package/src/column.module.sass +58 -49
  149. package/src/column.ts +149 -135
  150. package/src/correlation-chart/hash-string.ts +57 -0
  151. package/src/correlation-chart/index.ts +2 -0
  152. package/src/correlation-chart/main.module.sass +122 -0
  153. package/src/correlation-chart/main.ts +305 -0
  154. package/src/correlation-chart/prepare-data.ts +217 -0
  155. package/src/correlation-chart/stories/correlation-chart.stories.ts +192 -0
  156. package/src/correlation-chart/stories/stories.module.sass +18 -0
  157. package/src/correlation-chart/unconformity-line.module.sass +8 -0
  158. package/src/correlation-chart/unconformity-line.ts +25 -0
  159. package/src/data-provider/base.ts +388 -0
  160. package/src/data-provider/column-nav.ts +53 -0
  161. package/src/data-provider/fetch.ts +231 -0
  162. package/src/data-provider/index.ts +4 -0
  163. package/src/data-provider/store.ts +72 -0
  164. package/src/index.ts +5 -3
  165. package/src/maps/_shared/index.ts +2 -0
  166. package/src/maps/_shared/inset-map.stories.ts +20 -0
  167. package/src/maps/_shared/inset-map.ts +87 -0
  168. package/src/maps/_shared/styles.ts +57 -0
  169. package/src/maps/column-correlation/column-correlation-map.stories.ts +96 -0
  170. package/src/maps/column-correlation/core.ts +225 -0
  171. package/src/maps/column-correlation/index.ts +2 -0
  172. package/src/maps/column-correlation/state.ts +192 -0
  173. package/src/maps/column-navigation/index.ts +2 -0
  174. package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +102 -0
  175. package/src/maps/column-navigation/mapbox/index.ts +219 -0
  176. package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +119 -0
  177. package/src/maps/column-navigation/mapbox/state.ts +109 -0
  178. package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +46 -0
  179. package/src/{map → maps/column-navigation/svg}/index.ts +18 -6
  180. package/src/{map → maps/column-navigation/svg}/layers.ts +28 -109
  181. package/src/maps/column-navigation/utils/keyboard-navigation.ts +58 -0
  182. package/src/maps/index.ts +3 -0
  183. package/src/prepare-units/composite-scale.ts +353 -0
  184. package/src/prepare-units/helpers.ts +226 -0
  185. package/src/prepare-units/index.ts +177 -0
  186. package/src/prepare-units/utils.ts +98 -0
  187. package/src/section.ts +264 -84
  188. package/src/unit-details/index.ts +2 -215
  189. package/src/unit-details/{index.module.sass → panel.module.sass} +39 -8
  190. package/src/unit-details/panel.ts +523 -0
  191. package/src/{selection-popover.module.sass → unit-details/popover.module.sass} +4 -2
  192. package/src/unit-details/popover.ts +82 -0
  193. package/src/units/boxes.module.sass +16 -0
  194. package/src/units/boxes.ts +243 -90
  195. package/src/units/colors.ts +64 -0
  196. package/src/units/composite.ts +157 -152
  197. package/src/units/index.ts +76 -9
  198. package/src/units/names.ts +8 -4
  199. package/src/units/resolvers.ts +12 -1
  200. package/src/units/selection.ts +115 -101
  201. package/src/units/types.ts +5 -16
  202. package/dist/esm/age-axis.64c509ee.js +0 -41
  203. package/dist/esm/age-axis.64c509ee.js.map +0 -1
  204. package/dist/esm/boxes.13968b76.js +0 -164
  205. package/dist/esm/boxes.13968b76.js.map +0 -1
  206. package/dist/esm/boxes.module.28873d08.css +0 -4
  207. package/dist/esm/boxes.module.28873d08.css.map +0 -1
  208. package/dist/esm/boxes.module.605bdcd6.js +0 -13
  209. package/dist/esm/boxes.module.605bdcd6.js.map +0 -1
  210. package/dist/esm/column.8dd26e1a.js +0 -149
  211. package/dist/esm/column.8dd26e1a.js.map +0 -1
  212. package/dist/esm/column.db058031.js.map +0 -1
  213. package/dist/esm/column.module.039d872c.css +0 -151
  214. package/dist/esm/column.module.039d872c.css.map +0 -1
  215. package/dist/esm/column.module.e632868a.js +0 -19
  216. package/dist/esm/column.module.e632868a.js.map +0 -1
  217. package/dist/esm/composite.608a4ca2.js +0 -153
  218. package/dist/esm/composite.608a4ca2.js.map +0 -1
  219. package/dist/esm/composite.module.69a38fd1.css +0 -4
  220. package/dist/esm/core.4db8e452.js.map +0 -1
  221. package/dist/esm/data-provider.1506eb64.js.map +0 -1
  222. package/dist/esm/helpers.8a03cfc7.js +0 -94
  223. package/dist/esm/helpers.8a03cfc7.js.map +0 -1
  224. package/dist/esm/index.module.0844afd8.css +0 -65
  225. package/dist/esm/index.module.0844afd8.css.map +0 -1
  226. package/dist/esm/index.module.24fe3a2e.js +0 -37
  227. package/dist/esm/index.module.24fe3a2e.js.map +0 -1
  228. package/dist/esm/layers.ad5fd25d.js +0 -231
  229. package/dist/esm/layers.ad5fd25d.js.map +0 -1
  230. package/dist/esm/map.7aa26f17.js +0 -82
  231. package/dist/esm/map.7aa26f17.js.map +0 -1
  232. package/dist/esm/names.f6a4e9a4.js.map +0 -1
  233. package/dist/esm/providers.cd1e652f.js +0 -25
  234. package/dist/esm/providers.cd1e652f.js.map +0 -1
  235. package/dist/esm/resolvers.b5c82b78.js.map +0 -1
  236. package/dist/esm/section.cc1b1100.js +0 -118
  237. package/dist/esm/section.cc1b1100.js.map +0 -1
  238. package/dist/esm/selection-popover.17d1bd55.js +0 -60
  239. package/dist/esm/selection-popover.17d1bd55.js.map +0 -1
  240. package/dist/esm/selection-popover.module.0a701258.css.map +0 -1
  241. package/dist/esm/selection-popover.module.e22f5183.js +0 -22
  242. package/dist/esm/selection-popover.module.e22f5183.js.map +0 -1
  243. package/dist/esm/selection.bbf26d0e.js +0 -117
  244. package/dist/esm/selection.bbf26d0e.js.map +0 -1
  245. package/dist/esm/store.25eaa168.js +0 -18
  246. package/dist/esm/store.25eaa168.js.map +0 -1
  247. package/dist/esm/types.f016e032.js +0 -18
  248. package/dist/esm/types.f016e032.js.map +0 -1
  249. package/dist/esm/unit-details.56ff8b70.js +0 -209
  250. package/dist/esm/unit-details.56ff8b70.js.map +0 -1
  251. package/dist/esm/units.361088d4.js +0 -42
  252. package/dist/esm/units.361088d4.js.map +0 -1
  253. package/src/helpers.ts +0 -133
  254. package/src/providers.ts +0 -34
  255. package/src/selection-popover.ts +0 -71
  256. package/src/store.ts +0 -12
  257. package/src/units/units.scss +0 -16
  258. /package/src/{map → maps/column-navigation/svg}/animated.ts +0 -0
@@ -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
- memo,
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
- function LabelTrackerProvider(props) {
31
- const { children } = props;
32
- const { divisions } = useColumn();
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
- labelTrackerRef.current[div.unit_id] = visible;
40
- if (Object.keys(labelTrackerRef.current).length == divisions.length) {
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
- divisions.filter((d) => labelTrackerRef.current[d.unit_id] == false)
49
+ units.filter((d) => {
50
+ const id = findUnitID(d);
51
+ return labelTrackerRef.current[id] == false;
52
+ })
44
53
  );
45
54
  }
46
55
  },
47
- [labelTrackerRef, divisions]
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
- trackLabelVisibility(division, visible);
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
- function UnlabeledUnitNames(props) {
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: BaseUnit) => boolean;
108
+ shouldRenderNote?: (d: any) => boolean;
139
109
  };
140
110
 
141
- type AnnotatedUnitProps = ICompositeUnitProps & {
142
- minimumLabelHeight?: number;
143
- axisType: ColumnAxisType;
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 AnnotatedUnitsColumn(props: AnnotatedUnitProps) {
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
- columnWidth,
153
- width = 100,
154
- gutterWidth = 10,
155
- labelOffset = 30,
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
- _BaseUnitsColumn,
165
- {
166
- width: showLabels ? columnWidth : width,
167
- unitComponentProps: { nameForDivision },
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 CompositeUnitsColumn(props: ICompositeUnitProps) {
189
- /*
190
- A column with units and names either
191
- overlapping or offset to the right
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 = 100,
195
- gutterWidth = 10,
196
- labelOffset = 30,
153
+ width = 300,
197
154
  noteMode = "unlabeled",
198
- showLabels = true,
199
- showLabelColumn = true,
155
+ labelOffset = 30,
200
156
  noteComponent,
201
157
  shouldRenderNote,
202
- ...rest
203
158
  } = props;
204
159
 
205
- let { columnWidth = width } = props;
206
-
207
- const labelColumnComponent =
208
- noteMode == "unlabeled" ? UnlabeledUnitNames : UnitNamesColumn;
209
-
210
- return h(_BaseUnitsColumn, { width: columnWidth, ...rest }, [
211
- h.if(showLabelColumn)(ColumnLabel, {
212
- showLabels,
213
- component: labelColumnComponent,
214
- columnWidth,
215
- gutterWidth,
216
- labelOffset,
217
- width,
218
- noteComponent,
219
- showNote: shouldRenderNote,
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
- function _ColumnLabel(props) {
225
- const {
226
- showLabels,
227
- component,
228
- columnWidth,
229
- gutterWidth,
230
- labelOffset,
231
- width,
232
- noteComponent,
233
- showNote,
234
- } = props;
235
- if (!showLabels) return null;
236
- return h(component, {
237
- transform: `translate(${columnWidth + gutterWidth})`,
238
- paddingLeft: labelOffset,
239
- width: width - columnWidth - gutterWidth,
240
- noteComponent,
241
- shouldRenderNote: showNote,
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
- const ColumnLabel = memo(_ColumnLabel);
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
- export function CompositeUnitComponent({ division, nColumns = 2, ...rest }) {
248
- // This comes from CompositeUnits
249
- const { width } = useContext(ColumnLayoutContext);
252
+ const { axisType } = useMacrostratColumnData();
250
253
 
251
- //const nCols = Math.min(nColumns, division.overlappingUnits.length+1)
252
- //console.log(division);
253
- return h(TrackedLabeledUnit, {
254
- division,
255
- ...rest,
256
- width: division.overlappingUnits.length > 0 ? width / nColumns : width,
257
- x: (division.column * width) / nColumns,
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 };
@@ -1,17 +1,33 @@
1
1
  import h from "@macrostrat/hyper";
2
- import { LithologyColumn } from "@macrostrat/column-components";
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
- const UnitsColumn = ({ width = 100 }) => {
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
- const SimpleUnitsColumn = (props: ICompositeUnitProps) => {
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 { UnitsColumn, SimpleUnitsColumn };
34
- export * from "./composite";
35
- export * from "./types";
36
- export * from "./selection";
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
+ }
@@ -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, transformAxisType } from "./types";
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 key = transformAxisType(axisType);
38
+ const [height, top_height] = getUnitHeightRange(div, axisType);
39
+
36
40
  return {
37
- height: div[`b_${key}`],
38
- top_height: div[`t_${key}`],
41
+ height,
42
+ top_height,
39
43
  data: div,
40
44
  id: div.unit_id,
41
45
  };
@@ -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,10 +51,11 @@ 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) => {
47
- let liths = d.lith;
58
+ let liths = [...d.lith];
48
59
  let environs = d.environ.map((d) => d.name).join(" ");
49
60
  liths.sort((a, b) => b.prop - a.prop);
50
61