@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
@@ -3,10 +3,13 @@ import styles from "./column.module.sass";
3
3
 
4
4
  import { useAPIResult } from "@macrostrat/ui-components";
5
5
  import BaseColumn from "./column";
6
- import { ColumnNavigatorMap, MeasurementsLayer } from "../map";
6
+ import { ColumnNavigationSVGMap, MeasurementsLayer } from "../maps";
7
+ import {
8
+ MacrostratDataProvider,
9
+ ColumnArgs,
10
+ useColumnNav,
11
+ } from "../data-provider";
7
12
  import { MeasurementDataProvider } from "./data-provider";
8
- import { MacrostratAPIProvider } from "../providers";
9
- import { ColumnArgs, useColumnNav } from "../units";
10
13
  import { useMemo } from "react";
11
14
  import { FeatureCollection } from "geojson";
12
15
 
@@ -25,7 +28,7 @@ const defaultArgs: ColumnArgs = {
25
28
 
26
29
  export function CarbonIsotopesColumn(columnArgs) {
27
30
  return h(
28
- MacrostratAPIProvider,
31
+ MacrostratDataProvider,
29
32
  h(MeasurementDataProvider, columnArgs, [
30
33
  // @ts-ignore
31
34
  h(BaseColumn, { params: columnArgs }),
@@ -53,7 +56,7 @@ function ColumnManager() {
53
56
  ]),
54
57
  h("div.map-column", [
55
58
  h(
56
- ColumnNavigatorMap,
59
+ ColumnNavigationSVGMap,
57
60
  {
58
61
  currentColumn: columnFeature,
59
62
  setCurrentColumn,
@@ -74,5 +77,5 @@ function ColumnManager() {
74
77
  }
75
78
 
76
79
  export function CarbonIsotopesApp() {
77
- return h(MacrostratAPIProvider, h(ColumnManager));
80
+ return h(MacrostratDataProvider, h(ColumnManager));
78
81
  }
@@ -4,16 +4,16 @@ import { useAPIResult } from "@macrostrat/ui-components";
4
4
 
5
5
  const MeasurementDataContext = createContext(null);
6
6
 
7
- function MeasurementDataProvider(props) {
7
+ export function MeasurementDataProvider(props) {
8
8
  const { children, ...params } = props;
9
9
  const res = useAPIResult("/measurements", {
10
10
  ...params,
11
11
  show_values: true,
12
- response: "long"
12
+ response: "long",
13
13
  });
14
14
  return h(MeasurementDataContext.Provider, { value: res, children });
15
15
  }
16
16
 
17
17
  const useMeasurementData = () => useContext(MeasurementDataContext);
18
18
 
19
- export { MeasurementDataProvider, useMeasurementData, MeasurementDataContext };
19
+ export { useMeasurementData, MeasurementDataContext };
@@ -1,7 +1,7 @@
1
1
  .column-container, body:global(.light-mode) .column-container
2
2
  --column-background-color: var(--background-color, #fff)
3
- --column-stroke-color: var(--text-color, #000)
4
- --column-text-color: var(--text-color, #000)
3
+ --column-stroke-color: var(--text-emphasized-color, #000)
4
+ --column-text-color: var(--text-emphasized-color, #000)
5
5
 
6
6
  /* We have to duplicate the dark mode styles here
7
7
  because we want to set them either if the preferred
@@ -11,27 +11,27 @@
11
11
  @media (prefers-color-scheme: dark)
12
12
  body:not(:global(.light-mode)) .column-container
13
13
  --column-background-color: var(--background-color, #000)
14
- --column-stroke-color: var(--text-color, #fff)
15
- --column-text-color: var(--text-color, #fff)
14
+ --column-stroke-color: var(--text-emphasized-color, #fff)
15
+ --column-text-color: var(--text-emphasized-color, #fff)
16
16
  color-scheme: dark
17
17
  color: var(--column-text-color)
18
18
  :global
19
19
  .timescale
20
20
  color: #000
21
- g.inner pattern image
22
- filter: invert(80%)
21
+ svg pattern image
22
+ filter: invert(100%)
23
23
 
24
24
  body:global(.dark-mode) .column-container
25
25
  --column-background-color: var(--background-color, #000)
26
- --column-stroke-color: var(--text-color, #fff)
27
- --column-text-color: var(--text-color, #fff)
26
+ --column-stroke-color: var(--text-emphasized-color, #fff)
27
+ --column-text-color: var(--text-emphasized-color, #fff)
28
28
  color-scheme: dark
29
29
  color: var(--column-text-color)
30
30
  :global
31
31
  .timescale
32
32
  color: #000
33
- g.inner pattern image
34
- filter: invert(80%)
33
+ svg pattern image
34
+ filter: invert(100%)
35
35
 
36
36
  .column-container :global
37
37
  .column
@@ -39,24 +39,14 @@ body:global(.dark-mode) .column-container
39
39
  flex-direction: row
40
40
  position: relative
41
41
 
42
- .age-axis-label
43
- writing-mode: vertical-lr
44
- transform: rotate(180deg)
45
- font-size: 12px
46
- text-align: center
47
- position: sticky
48
- top: 0
49
- max-height: 100vh
50
-
51
- .tick text
52
- text-anchor: middle
53
- font-weight: 400 !important
54
- transform: rotate(-90deg) translate(8px, -12px)
55
-
56
- rect.unit
42
+ .unit
57
43
  stroke: var(--column-stroke-color)
58
44
  stroke-width: 1px
59
45
 
46
+ .selection-overlay
47
+ fill: var(--selection-overlay-color, red)
48
+ fill-opacity: var(--selection-overlay-opacity, 0.5)
49
+
60
50
  g.lithology-column use.frame
61
51
  stroke: var(--column-stroke-color)
62
52
  stroke-width: 1.5px !important
@@ -82,17 +72,6 @@ body:global(.dark-mode) .column-container
82
72
  .column-container :global .frame rect
83
73
  fill: transparent
84
74
 
85
- .column-container :global .labeled-unit .unit-overlay
86
- font-size: 10px
87
- font-style: italic
88
- display: flex
89
- align-items: center
90
- justify-content: center
91
-
92
- .column-container :global .labeled-unit .unit-overlay .unit-label
93
- display: block
94
- text-shadow: 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color), 0px 0px 4px var(--column-background-color)
95
-
96
75
  .column-container :global .default-buttons
97
76
  width: 100%
98
77
  margin: 0 -10px
@@ -101,27 +80,57 @@ body:global(.dark-mode) .column-container
101
80
  display: flex
102
81
  flex-direction: row
103
82
 
104
- .column-container :global div.section :global(.timescale)
105
- transform: translateY(0.5)
106
-
107
83
  .column-container :global .section .divisions .unit
108
84
  cursor: pointer
109
85
 
110
- .column-container :global rect.selection-overlay
111
- fill: rgba(255,0,0,0.5)
112
-
113
- .column-container :global div.timescale
114
- width: calc(6em + 4px)
86
+ .column-container :global(.timescale)
87
+ width: calc(calc(1.5em + 1.5px) * var(--timescale-level-count, 4))
115
88
  --timescale-level-size: 1.5em
116
89
 
90
+ .timescale-column
91
+ position: relative
92
+
93
+ .section-main
94
+ position: relative
95
+ margin-bottom: -4px
96
+
97
+ .section-units-container
98
+ position: relative
99
+
100
+ .main-column
101
+ position: relative
102
+
103
+ .unconformity-labels
104
+ position: absolute
105
+ top: 0
106
+ left: 0
107
+ pointer-events: none
108
+
109
+
117
110
  .unconformity
118
- height: 0px
119
- font-size: 10px
120
- font-style: italic
121
111
  text-align: center
122
- margin-left: calc(6em + 4px + 40px)
112
+ position: absolute
113
+ top: 0px
114
+ display: flex
115
+ justify-content: center
116
+ align-items: center
117
+ font-size: 0.8em
118
+ &.giga
119
+ font-weight: 800
120
+ font-size: 1em
121
+ &.mega
122
+ font-weight: 600
123
+ font-weight: 700
124
+ font-size: 0.9em
125
+ &.large
126
+ font-weight: 600
127
+ &.small
128
+ font-weight: 300
129
+
123
130
 
124
131
  .unconformity-text
125
- transform: translateY(-0.5em)
126
132
  width: var(--column-width)
127
133
  color: var(--column-stroke-color)
134
+ --unit-font-style: normal
135
+
136
+
package/src/column.ts CHANGED
@@ -1,185 +1,199 @@
1
- import {
2
- ColumnAxisType,
3
- ColumnLayoutContext,
4
- ColumnProvider,
5
- } from "@macrostrat/column-components";
1
+ import { ColumnAxisType } from "@macrostrat/column-components";
6
2
  import { hyperStyled } from "@macrostrat/hyper";
7
3
  import { useDarkMode } from "@macrostrat/ui-components";
8
4
  import classNames from "classnames";
9
- import { createRef, RefObject, useContext, useMemo, useState } from "react";
5
+ import { RefObject, useRef, HTMLAttributes } from "react";
10
6
  import styles from "./column.module.sass";
11
7
  import {
12
- TrackedLabeledUnit,
13
- UnitKeyboardNavigation,
14
8
  UnitSelectionProvider,
9
+ UnitComponent,
10
+ UnitKeyboardNavigation,
15
11
  useUnitSelectionDispatch,
16
12
  } from "./units";
17
- import { SectionInfo } from "./section";
18
- import { RectBounds } from "./units/boxes";
19
- import { UnitSelectionPopover } from "./selection-popover";
20
- import { MacrostratUnitsProvider } from "./store";
21
- import { IColumnProps, Section } from "./section";
13
+
14
+ import { ColumnHeightScaleOptions } from "./prepare-units/composite-scale";
15
+ import { UnitSelectionPopover } from "./unit-details";
22
16
  import {
23
- _mergeOverlappingSections,
24
- ensureArray,
25
- groupUnitsIntoSections,
26
- } from "./helpers";
17
+ MacrostratColumnDataProvider,
18
+ useMacrostratColumnData,
19
+ } from "./data-provider";
20
+ import {
21
+ SectionSharedProps,
22
+ CompositeTimescale,
23
+ SectionsColumn,
24
+ } from "./section";
25
+ import { CompositeAgeAxis } from "./age-axis";
26
+ import { MergeSectionsMode, usePreparedColumnUnits } from "./prepare-units";
27
+ import { UnitLong } from "@macrostrat/api-types";
28
+ import { NonIdealState } from "@blueprintjs/core";
27
29
 
28
30
  const h = hyperStyled(styles);
29
31
 
30
- export function UnitComponent({ division, nColumns = 2, ...rest }) {
31
- const { width } = useContext(ColumnLayoutContext);
32
-
33
- //const nCols = Math.min(nColumns, division.overlappingUnits.length+1)
34
- //console.log(division);
35
- return h(TrackedLabeledUnit, {
36
- division,
37
- ...rest,
38
- width: division.overlappingUnits.length > 0 ? width / nColumns : width,
39
- x: (division.column * width) / nColumns,
40
- });
41
- }
42
-
43
- function Unconformity({ upperUnits = [], lowerUnits = [], style }) {
44
- if (upperUnits.length == 0 || lowerUnits.length == 0) {
45
- return null;
46
- }
47
-
48
- const ageGap = lowerUnits[0].t_age - upperUnits[upperUnits.length - 1].b_age;
49
-
50
- return h("div.unconformity", { style }, [
51
- h("div.unconformity-text", `${ageGap.toFixed(1)} Ma`),
52
- ]);
53
- }
54
-
55
- function sectionClassName(section: SectionInfo) {
56
- return `section-${ensureArray(section.section_id).join("-")}`;
57
- }
58
-
59
- export interface ColumnProps extends IColumnProps {
60
- unconformityLabels?: boolean;
32
+ interface BaseColumnProps extends SectionSharedProps {
61
33
  className?: string;
62
- mergeOverlappingSections?: boolean;
63
34
  showLabelColumn?: boolean;
64
- columnRef?: RefObject<HTMLElement>;
65
35
  keyboardNavigation?: boolean;
66
- showUnitPopover?: boolean;
36
+ showLabels?: boolean;
37
+ maxInternalColumns?: number;
38
+ // Timescale properties
39
+ showTimescale?: boolean;
40
+ timescaleLevels?: number | [number, number];
41
+ }
42
+
43
+ export interface ColumnProps extends BaseColumnProps, ColumnHeightScaleOptions {
44
+ // Macrostrat units
45
+ units: UnitLong[];
67
46
  t_age?: number;
68
47
  b_age?: number;
48
+ mergeSections?: MergeSectionsMode;
49
+ showUnitPopover?: boolean;
50
+ selectedUnit?: number | null;
51
+ onUnitSelected?: (unitID: number | null, unit: any) => void;
52
+ // Unconformity height in pixels
53
+ unconformityHeight?: number;
69
54
  }
70
55
 
71
56
  export function Column(props: ColumnProps) {
72
- const { showUnitPopover = false, ...rest } = props;
73
- const ref = createRef<HTMLElement>();
57
+ const {
58
+ showUnitPopover = false,
59
+ keyboardNavigation = false,
60
+ mergeSections,
61
+ onUnitSelected,
62
+ selectedUnit,
63
+ children,
64
+ units: rawUnits,
65
+ axisType = ColumnAxisType.AGE,
66
+ t_age,
67
+ b_age,
68
+ unconformityHeight = 30,
69
+ targetUnitHeight = 20,
70
+ pixelScale,
71
+ minPixelScale = 0.2,
72
+ minSectionHeight = 50,
73
+ collapseSmallUnconformities = true,
74
+ ...rest
75
+ } = props;
76
+ const ref = useRef<HTMLElement>();
74
77
  // Selected item position
75
- const [position, setPosition] = useState<RectBounds | null>(null);
76
78
 
77
- if (!showUnitPopover) {
78
- return h(_Column, rest);
79
+ const { sections, units, totalHeight } = usePreparedColumnUnits(rawUnits, {
80
+ axisType,
81
+ t_age,
82
+ b_age,
83
+ mergeSections,
84
+ targetUnitHeight,
85
+ unconformityHeight,
86
+ pixelScale,
87
+ minPixelScale,
88
+ minSectionHeight,
89
+ collapseSmallUnconformities,
90
+ });
91
+
92
+ if (sections.length === 0) {
93
+ return h(
94
+ "div.column-container.empty",
95
+ h(NonIdealState, {
96
+ title: "Empty column",
97
+ description: "No sections found in this column.",
98
+ icon: "warning-sign",
99
+ })
100
+ );
79
101
  }
80
102
 
81
103
  return h(
82
- UnitSelectionProvider,
83
- {
84
- onUnitSelected: (unit, target: SVGElement | HTMLElement | null) => {
85
- if (!showUnitPopover) return;
86
-
87
- if (unit == null) {
88
- setPosition(null);
89
- return;
90
- }
91
- const el: HTMLElement = ref.current;
92
- if (el == null || target == null) return;
93
- const rect = el.getBoundingClientRect();
94
- const targetRect = target.getBoundingClientRect();
95
- setPosition({
96
- x: targetRect.left - rect.left,
97
- y: targetRect.top - rect.top,
98
- width: targetRect.width,
99
- height: targetRect.height,
100
- });
101
- },
102
- },
104
+ MacrostratColumnDataProvider,
105
+ { units, sections, totalHeight, axisType },
103
106
  h(
104
- _Column,
105
- { ...rest, columnRef: ref },
106
- h(UnitSelectionPopover, { position })
107
+ UnitSelectionProvider,
108
+ { columnRef: ref, onUnitSelected, selectedUnit, units },
109
+ h(ColumnInner, { columnRef: ref, ...rest }, [
110
+ children,
111
+ h.if(showUnitPopover)(UnitSelectionPopover),
112
+ h.if(keyboardNavigation)(UnitKeyboardNavigation, { units }),
113
+ ])
107
114
  )
108
115
  );
109
116
  }
110
117
 
111
- function _Column(props: Omit<ColumnProps, "showUnitPopover">) {
118
+ interface ColumnInnerProps extends BaseColumnProps {
119
+ columnRef: RefObject<HTMLElement>;
120
+ }
121
+
122
+ function ColumnInner(props: ColumnInnerProps) {
112
123
  const {
113
- data,
114
124
  unitComponent = UnitComponent,
115
125
  unconformityLabels = true,
116
126
  showLabels = true,
117
- width = 300,
118
- columnWidth = 150,
119
- className: baseClassName,
120
- showLabelColumn = true,
121
- mergeOverlappingSections = true,
122
- keyboardNavigation = false,
127
+ width: _width = 300,
128
+ columnWidth: _columnWidth = 150,
129
+ showLabelColumn: _showLabelColumn = true,
130
+ className,
123
131
  columnRef,
132
+ clipUnits = false,
124
133
  children,
125
- ...rest
134
+ showTimescale,
135
+ timescaleLevels,
136
+ maxInternalColumns,
126
137
  } = props;
127
138
 
128
- const darkMode = useDarkMode();
129
- const sectionGroups = useMemo(() => {
130
- let res = groupUnitsIntoSections(data);
131
- if (mergeOverlappingSections) {
132
- res = _mergeOverlappingSections(res);
133
- }
134
- return res;
135
- }, [data, mergeOverlappingSections]);
136
-
137
- const className = classNames(baseClassName, {
138
- "dark-mode": darkMode?.isEnabled ?? false,
139
- });
139
+ const { axisType } = useMacrostratColumnData();
140
140
 
141
- // Clear unit selection on click outside of units, if we have a dispatch function
142
141
  const dispatch = useUnitSelectionDispatch();
143
142
 
143
+ let width = _width;
144
+ let columnWidth = _columnWidth;
145
+ if (columnWidth > width) {
146
+ columnWidth = width;
147
+ }
148
+ let showLabelColumn = _showLabelColumn;
149
+ if (columnWidth > width - 10) {
150
+ showLabelColumn = false;
151
+ }
152
+
153
+ let _showTimescale = showTimescale;
154
+ if (timescaleLevels !== null) {
155
+ _showTimescale = true;
156
+ }
157
+ _showTimescale = axisType == ColumnAxisType.AGE && _showTimescale;
158
+
144
159
  return h(
145
- "div.column-container",
160
+ ColumnContainer,
146
161
  {
147
- className,
148
162
  onClick(evt) {
149
163
  dispatch?.(null, null, evt as any);
150
164
  },
165
+ className,
151
166
  },
152
- h(MacrostratUnitsProvider, { units: data }, [
153
- h("div.column", { ref: columnRef }, [
154
- h("div.age-axis-label", "Age (Ma)"),
155
- h(
156
- "div.main-column",
157
- sectionGroups.map((group, i) => {
158
- const { section_id: id, units: data } = group;
159
- const lastGroup = sectionGroups[i - 1];
160
- return h([
161
- h.if(unconformityLabels)(Unconformity, {
162
- upperUnits: lastGroup?.units,
163
- lowerUnits: data,
164
- style: { width: showLabels ? columnWidth : width },
165
- }),
166
- h(`div.section`, { className: sectionClassName(group) }, [
167
- h(Section, {
168
- data,
169
- unitComponent,
170
- showLabels,
171
- width,
172
- columnWidth,
173
- showLabelColumn,
174
- ...rest,
175
- }),
176
- ]),
177
- ]);
178
- })
179
- ),
180
- h.if(keyboardNavigation)(UnitKeyboardNavigation, { units: data }),
181
- children,
182
- ]),
167
+ h("div.column", { ref: columnRef }, [
168
+ h(CompositeAgeAxis),
169
+ h.if(_showTimescale)(CompositeTimescale, { levels: timescaleLevels }),
170
+ h(SectionsColumn, {
171
+ unitComponent,
172
+ showLabels,
173
+ width,
174
+ columnWidth,
175
+ showLabelColumn,
176
+ clipUnits,
177
+ unconformityLabels,
178
+ maxInternalColumns,
179
+ }),
180
+ children,
183
181
  ])
184
182
  );
185
183
  }
184
+
185
+ export interface ColumnContainerProps extends HTMLAttributes<HTMLDivElement> {
186
+ className?: string;
187
+ }
188
+
189
+ export function ColumnContainer(props: ColumnContainerProps) {
190
+ const { className, ...rest } = props;
191
+ const darkMode = useDarkMode();
192
+
193
+ return h("div.column-container", {
194
+ className: classNames(className, {
195
+ "dark-mode": darkMode?.isEnabled ?? false,
196
+ }),
197
+ ...rest,
198
+ });
199
+ }
@@ -0,0 +1,57 @@
1
+ import { LineString } from "geojson";
2
+
3
+ export function parseLineFromString(section: string): LineString | null {
4
+ /* Section should be specified as space-separated coordinates */
5
+ if (section == null || typeof section !== "string") {
6
+ return null;
7
+ }
8
+
9
+ try {
10
+ let coords = section.split(" ").map(parseCoordinates);
11
+ return {
12
+ type: "LineString",
13
+ coordinates: coords,
14
+ };
15
+ } catch (e) {
16
+ console.warn(e);
17
+ return null;
18
+ }
19
+ }
20
+
21
+ export function stringifyLine(line: LineString | null): string | null {
22
+ if (
23
+ line == null ||
24
+ line.type !== "LineString" ||
25
+ line.coordinates.length < 2
26
+ ) {
27
+ return null;
28
+ }
29
+ return line.coordinates
30
+ .map((coord) => coord.map(stringifyNumber).join(","))
31
+ .join(" ");
32
+ }
33
+
34
+ function parseCoordinates(s: string): [number, number] {
35
+ let [x, y] = s.split(",").map(parseNumber);
36
+ if (x == null || y == null || isNaN(x) || isNaN(y)) {
37
+ throw new Error("Invalid coordinate string");
38
+ }
39
+ if (x > 180 || x < -180 || y > 90 || y < -90) {
40
+ throw new Error("Invalid coordinate value");
41
+ }
42
+ return [x, y];
43
+ }
44
+
45
+ function parseNumber(s: string): number {
46
+ let s1 = s;
47
+ // For some reason, we sometimes get en-dashes in the hash string
48
+ if (s1[0] == "−") {
49
+ s1 = "-" + s1.slice(1);
50
+ }
51
+ return Number(s1);
52
+ }
53
+
54
+ const stringifyNumber = (d) =>
55
+ d.toLocaleString("en-US", {
56
+ maximumFractionDigits: 2,
57
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./main";
2
+ export * from "./hash-string";