@macrostrat/column-views 2.1.3 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/esm/{column-views.4ab0ec82.js → column-views.073c42da.js} +142 -76
  3. package/dist/esm/column-views.073c42da.js.map +1 -0
  4. package/dist/esm/column-views.079119f4.js +17 -0
  5. package/dist/esm/column-views.079119f4.js.map +1 -0
  6. package/dist/esm/{column-views.0e06c069.js → column-views.0859feb3.js} +52 -23
  7. package/dist/esm/column-views.0859feb3.js.map +1 -0
  8. package/dist/esm/{column-views.d099eaf9.js → column-views.0a8a07f4.js} +3 -3
  9. package/dist/esm/{column-views.d099eaf9.js.map → column-views.0a8a07f4.js.map} +1 -1
  10. package/dist/esm/{column-views.0732894f.js → column-views.0f7f6ee6.js} +2 -2
  11. package/dist/esm/{column-views.0732894f.js.map → column-views.0f7f6ee6.js.map} +1 -1
  12. package/dist/esm/{column-views.57636733.css → column-views.1151416d.css} +5 -5
  13. package/dist/esm/column-views.1151416d.css.map +1 -0
  14. package/dist/esm/{column-views.53f4160e.js → column-views.1b644998.js} +3 -3
  15. package/dist/esm/{column-views.53f4160e.js.map → column-views.1b644998.js.map} +1 -1
  16. package/dist/esm/{column-views.686d21ad.js → column-views.22ec902b.js} +4 -1
  17. package/dist/esm/column-views.22ec902b.js.map +1 -0
  18. package/dist/esm/{column-views.3b637517.js → column-views.285cbb65.js} +40 -20
  19. package/dist/esm/column-views.285cbb65.js.map +1 -0
  20. package/dist/esm/column-views.2d602a57.js +37 -0
  21. package/dist/esm/column-views.2d602a57.js.map +1 -0
  22. package/dist/esm/{column-views.b17f793f.css → column-views.321af3ae.css} +7 -1
  23. package/dist/esm/{column-views.686d21ad.js.map → column-views.321af3ae.css.map} +1 -1
  24. package/dist/esm/column-views.3a7179c4.js +137 -0
  25. package/dist/esm/column-views.3a7179c4.js.map +1 -0
  26. package/dist/esm/{column-views.49adc09e.js → column-views.3e1b8c7d.js} +2 -2
  27. package/dist/esm/{column-views.49adc09e.js.map → column-views.3e1b8c7d.js.map} +1 -1
  28. package/dist/esm/{column-views.a23b2c92.js → column-views.3f528c5c.js} +50 -22
  29. package/dist/esm/column-views.3f528c5c.js.map +1 -0
  30. package/dist/esm/{column-views.1e055ed5.js → column-views.4fd4ec92.js} +17 -3
  31. package/dist/esm/column-views.4fd4ec92.js.map +1 -0
  32. package/dist/esm/{column-views.6ca980ae.js → column-views.53186d53.js} +2 -2
  33. package/dist/esm/{column-views.6ca980ae.js.map → column-views.53186d53.js.map} +1 -1
  34. package/dist/esm/{column-views.39657bbf.js → column-views.54f8b909.js} +7 -2
  35. package/dist/esm/column-views.54f8b909.js.map +1 -0
  36. package/dist/esm/{column-views.b72918ce.css → column-views.562db43a.css} +10 -2
  37. package/dist/esm/column-views.562db43a.css.map +1 -0
  38. package/dist/esm/{column-views.9e1c82fe.js → column-views.58b891df.js} +2 -2
  39. package/dist/esm/{column-views.9e1c82fe.js.map → column-views.58b891df.js.map} +1 -1
  40. package/dist/esm/{column-views.a2cf8f33.js → column-views.5a49cd68.js} +8 -38
  41. package/dist/esm/column-views.5a49cd68.js.map +1 -0
  42. package/dist/esm/{column-views.2e0ff311.js → column-views.5d969bc5.js} +6 -58
  43. package/dist/esm/column-views.5d969bc5.js.map +1 -0
  44. package/dist/esm/{column-views.43fb819d.js → column-views.63b7e5aa.js} +3 -3
  45. package/dist/esm/{column-views.43fb819d.js.map → column-views.63b7e5aa.js.map} +1 -1
  46. package/dist/esm/column-views.6698b95a.js +108 -0
  47. package/dist/esm/column-views.6698b95a.js.map +1 -0
  48. package/dist/esm/column-views.6c644353.js +184 -0
  49. package/dist/esm/column-views.6c644353.js.map +1 -0
  50. package/dist/esm/column-views.6e7082db.js +16 -0
  51. package/dist/esm/column-views.6e7082db.js.map +1 -0
  52. package/dist/esm/column-views.70164236.js +206 -0
  53. package/dist/esm/column-views.70164236.js.map +1 -0
  54. package/dist/esm/{column-views.34a1ac4f.js → column-views.73b8ff16.js} +20 -22
  55. package/dist/esm/column-views.73b8ff16.js.map +1 -0
  56. package/dist/esm/{column-views.9771145a.js → column-views.77561197.js} +91 -55
  57. package/dist/esm/column-views.77561197.js.map +1 -0
  58. package/dist/esm/{column-views.572b70fd.js → column-views.83395185.js} +3 -3
  59. package/dist/esm/{column-views.572b70fd.js.map → column-views.83395185.js.map} +1 -1
  60. package/dist/esm/{column-views.6dc251d3.js → column-views.86a51ce7.js} +2 -2
  61. package/dist/esm/{column-views.6dc251d3.js.map → column-views.86a51ce7.js.map} +1 -1
  62. package/dist/esm/{column-views.f08929e2.js → column-views.88d63dd0.js} +5 -3
  63. package/dist/esm/column-views.88d63dd0.js.map +1 -0
  64. package/dist/esm/{column-views.3f246167.js → column-views.8c296309.js} +5 -5
  65. package/dist/esm/column-views.8c296309.js.map +1 -0
  66. package/dist/esm/{column-views.7d47a72a.js → column-views.8d24b179.js} +3 -3
  67. package/dist/esm/{column-views.7d47a72a.js.map → column-views.8d24b179.js.map} +1 -1
  68. package/dist/esm/{column-views.3d001ab8.js → column-views.986e7566.js} +7 -7
  69. package/dist/esm/{column-views.3d001ab8.js.map → column-views.986e7566.js.map} +1 -1
  70. package/dist/esm/{column-views.86619334.js → column-views.9ddbe7df.js} +2 -2
  71. package/dist/esm/{column-views.86619334.js.map → column-views.9ddbe7df.js.map} +1 -1
  72. package/dist/esm/{column-views.abe90091.js → column-views.ae7c0a2b.js} +31 -60
  73. package/dist/esm/column-views.ae7c0a2b.js.map +1 -0
  74. package/dist/esm/{column-views.9892f825.js → column-views.aecf25bc.js} +75 -42
  75. package/dist/esm/column-views.aecf25bc.js.map +1 -0
  76. package/dist/esm/column-views.b7016f82.css +54 -0
  77. package/dist/esm/column-views.b7016f82.css.map +1 -0
  78. package/dist/esm/{column-views.a5c1bbf0.js → column-views.ba0381cc.js} +2 -2
  79. package/dist/esm/{column-views.a5c1bbf0.js.map → column-views.ba0381cc.js.map} +1 -1
  80. package/dist/esm/{column-views.ff031876.js → column-views.c518ef14.js} +9 -4
  81. package/dist/esm/column-views.c518ef14.js.map +1 -0
  82. package/dist/esm/{column-views.f7523c1d.js → column-views.c92a359e.js} +2 -2
  83. package/dist/esm/{column-views.f7523c1d.js.map → column-views.c92a359e.js.map} +1 -1
  84. package/dist/esm/{column-views.cdadc5c2.js → column-views.cc733361.js} +7 -1
  85. package/dist/esm/column-views.cc733361.js.map +1 -0
  86. package/dist/esm/{column-views.4d22c21c.js → column-views.d15d8655.js} +22 -4
  87. package/dist/esm/column-views.d15d8655.js.map +1 -0
  88. package/dist/esm/{column-views.5e2dc19d.js → column-views.d261b02d.js} +3 -3
  89. package/dist/esm/{column-views.5e2dc19d.js.map → column-views.d261b02d.js.map} +1 -1
  90. package/dist/esm/{column-views.323cad41.js → column-views.d406665d.js} +5 -5
  91. package/dist/esm/{column-views.323cad41.js.map → column-views.d406665d.js.map} +1 -1
  92. package/dist/esm/{column-views.7715e35e.js → column-views.d69c4a9f.js} +3 -3
  93. package/dist/esm/{column-views.7715e35e.js.map → column-views.d69c4a9f.js.map} +1 -1
  94. package/dist/esm/{column-views.07db2ab1.js → column-views.d9c6b527.js} +15 -12
  95. package/dist/esm/column-views.d9c6b527.js.map +1 -0
  96. package/dist/esm/{column-views.b12a6374.css → column-views.e33ac5c9.css} +30 -9
  97. package/dist/esm/column-views.e33ac5c9.css.map +1 -0
  98. package/dist/esm/column-views.e3bf5384.js +15 -0
  99. package/dist/esm/{column-views.6d5e3098.js.map → column-views.e3bf5384.js.map} +1 -1
  100. package/dist/esm/{column-views.a8926321.js → column-views.e4c26185.js} +2 -2
  101. package/dist/esm/{column-views.a8926321.js.map → column-views.e4c26185.js.map} +1 -1
  102. package/dist/esm/column-views.e84bd756.js +92 -0
  103. package/dist/esm/column-views.e84bd756.js.map +1 -0
  104. package/dist/esm/column-views.ea4ebbb7.js +31 -0
  105. package/dist/esm/column-views.ea4ebbb7.js.map +1 -0
  106. package/dist/esm/column-views.ed05e233.js +13 -0
  107. package/dist/esm/{column-views.3729c372.js.map → column-views.ed05e233.js.map} +1 -1
  108. package/dist/esm/{column-views.64a84c43.js → column-views.f2fd0e4a.js} +10 -2
  109. package/dist/esm/column-views.f2fd0e4a.js.map +1 -0
  110. package/dist/esm/{column-views.103b1cb0.js → column-views.f46a0b36.js} +2 -2
  111. package/dist/esm/{column-views.103b1cb0.js.map → column-views.f46a0b36.js.map} +1 -1
  112. package/dist/esm/{column-views.d48cb0d8.js → column-views.fcf25ec6.js} +7 -1
  113. package/dist/esm/column-views.fcf25ec6.js.map +1 -0
  114. package/dist/esm/index.d.ts +235 -397
  115. package/dist/esm/index.d.ts.map +1 -1
  116. package/dist/esm/index.js +12 -12
  117. package/dist/node/{column-views.36094762.js → column-views.01debc76.js} +2 -2
  118. package/dist/node/{column-views.36094762.js.map → column-views.01debc76.js.map} +1 -1
  119. package/dist/node/{column-views.31f57130.js → column-views.040499c9.js} +2 -2
  120. package/dist/node/{column-views.31f57130.js.map → column-views.040499c9.js.map} +1 -1
  121. package/dist/node/{column-views.50034105.js → column-views.07ff1fdf.js} +2 -2
  122. package/dist/node/{column-views.50034105.js.map → column-views.07ff1fdf.js.map} +1 -1
  123. package/dist/node/{column-views.3a55ecd7.css → column-views.0840b115.css} +2 -2
  124. package/dist/node/column-views.0840b115.css.map +1 -0
  125. package/dist/node/column-views.0b3a384e.js +2 -0
  126. package/dist/node/column-views.0b3a384e.js.map +1 -0
  127. package/dist/node/column-views.0bd15ee4.js +2 -0
  128. package/dist/node/column-views.0bd15ee4.js.map +1 -0
  129. package/dist/node/column-views.105f6ad2.js +2 -0
  130. package/dist/node/column-views.105f6ad2.js.map +1 -0
  131. package/dist/node/column-views.1261be59.js +2 -0
  132. package/dist/node/column-views.1261be59.js.map +1 -0
  133. package/dist/node/{column-views.4381c411.js → column-views.13e69859.js} +2 -2
  134. package/dist/node/{column-views.4381c411.js.map → column-views.13e69859.js.map} +1 -1
  135. package/dist/node/column-views.16f336ee.js +2 -0
  136. package/dist/node/column-views.16f336ee.js.map +1 -0
  137. package/dist/node/{column-views.c18d5bf5.js → column-views.1a7f8afd.js} +2 -2
  138. package/dist/node/{column-views.c18d5bf5.js.map → column-views.1a7f8afd.js.map} +1 -1
  139. package/dist/node/column-views.29eb25bd.css +2 -0
  140. package/dist/node/column-views.29eb25bd.css.map +1 -0
  141. package/dist/node/column-views.2bd97c2e.js +2 -0
  142. package/dist/node/column-views.2bd97c2e.js.map +1 -0
  143. package/dist/node/column-views.3b37363f.js +2 -0
  144. package/dist/node/column-views.3b37363f.js.map +1 -0
  145. package/dist/node/column-views.45296250.js +2 -0
  146. package/dist/node/column-views.45296250.js.map +1 -0
  147. package/dist/node/{column-views.0cbd4a3f.js → column-views.48a3cfa3.js} +2 -2
  148. package/dist/node/{column-views.0cbd4a3f.js.map → column-views.48a3cfa3.js.map} +1 -1
  149. package/dist/node/{column-views.42db0bb8.js → column-views.492c2c72.js} +2 -2
  150. package/dist/node/{column-views.42db0bb8.js.map → column-views.492c2c72.js.map} +1 -1
  151. package/dist/node/column-views.50a992d3.css +2 -0
  152. package/dist/node/column-views.50a992d3.css.map +1 -0
  153. package/dist/node/column-views.573cb29d.js +2 -0
  154. package/dist/node/column-views.573cb29d.js.map +1 -0
  155. package/dist/node/column-views.576e3c5a.js +2 -0
  156. package/dist/node/column-views.576e3c5a.js.map +1 -0
  157. package/dist/node/column-views.5f3b0b04.js +2 -0
  158. package/dist/node/column-views.5f3b0b04.js.map +1 -0
  159. package/dist/node/column-views.6fd5a922.js +2 -0
  160. package/dist/node/column-views.6fd5a922.js.map +1 -0
  161. package/dist/node/column-views.7150ba18.js +2 -0
  162. package/dist/node/column-views.7150ba18.js.map +1 -0
  163. package/dist/node/column-views.728c8dfc.js +2 -0
  164. package/dist/node/column-views.728c8dfc.js.map +1 -0
  165. package/dist/node/column-views.7425d37b.js +2 -0
  166. package/dist/node/column-views.7425d37b.js.map +1 -0
  167. package/dist/node/{column-views.2e4e357d.js → column-views.75582658.js} +2 -2
  168. package/dist/node/{column-views.2e4e357d.js.map → column-views.75582658.js.map} +1 -1
  169. package/dist/node/column-views.77ace3a2.js +2 -0
  170. package/dist/node/column-views.77ace3a2.js.map +1 -0
  171. package/dist/node/column-views.7f9c7448.js +2 -0
  172. package/dist/node/column-views.7f9c7448.js.map +1 -0
  173. package/dist/node/{column-views.a2274834.js → column-views.81294fb7.js} +2 -2
  174. package/dist/node/{column-views.a2274834.js.map → column-views.81294fb7.js.map} +1 -1
  175. package/dist/node/column-views.827a9894.js +2 -0
  176. package/dist/node/column-views.827a9894.js.map +1 -0
  177. package/dist/node/column-views.87b1439e.js +2 -0
  178. package/dist/node/column-views.87b1439e.js.map +1 -0
  179. package/dist/node/{column-views.e4f18ff7.js → column-views.9dda582d.js} +2 -2
  180. package/dist/node/{column-views.e4f18ff7.js.map → column-views.9dda582d.js.map} +1 -1
  181. package/dist/node/column-views.9e155f20.js +2 -0
  182. package/dist/node/column-views.9e155f20.js.map +1 -0
  183. package/dist/node/column-views.a16cd1f2.js +2 -0
  184. package/dist/node/column-views.a16cd1f2.js.map +1 -0
  185. package/dist/node/{column-views.adf9e5b3.js → column-views.a34732e7.js} +2 -2
  186. package/dist/node/{column-views.adf9e5b3.js.map → column-views.a34732e7.js.map} +1 -1
  187. package/dist/node/{column-views.f17b6142.js → column-views.a396d3ac.js} +2 -2
  188. package/dist/node/{column-views.f17b6142.js.map → column-views.a396d3ac.js.map} +1 -1
  189. package/dist/node/column-views.aae09aca.js +2 -0
  190. package/dist/node/column-views.aae09aca.js.map +1 -0
  191. package/dist/node/{column-views.db5d74bd.js → column-views.ac1b58b7.js} +2 -2
  192. package/dist/node/{column-views.db5d74bd.js.map → column-views.ac1b58b7.js.map} +1 -1
  193. package/dist/node/column-views.aef76eee.js +2 -0
  194. package/dist/node/column-views.aef76eee.js.map +1 -0
  195. package/dist/node/column-views.b64cd0ea.js +2 -0
  196. package/dist/node/column-views.b64cd0ea.js.map +1 -0
  197. package/dist/node/column-views.b6cd4360.js +2 -0
  198. package/dist/node/column-views.b6cd4360.js.map +1 -0
  199. package/dist/node/column-views.c0be1157.js +2 -0
  200. package/dist/node/column-views.c0be1157.js.map +1 -0
  201. package/dist/node/column-views.c29e9eb8.js +2 -0
  202. package/dist/node/column-views.c29e9eb8.js.map +1 -0
  203. package/dist/node/column-views.c8df6435.js +2 -0
  204. package/dist/node/column-views.c8df6435.js.map +1 -0
  205. package/dist/node/column-views.cd2a5c85.js +2 -0
  206. package/dist/node/column-views.cd2a5c85.js.map +1 -0
  207. package/dist/node/{column-views.3d220e0c.js → column-views.cd77a1d8.js} +2 -2
  208. package/dist/node/{column-views.3d220e0c.js.map → column-views.cd77a1d8.js.map} +1 -1
  209. package/dist/node/column-views.cd7b223b.css +2 -0
  210. package/dist/node/column-views.cd7b223b.css.map +1 -0
  211. package/dist/node/column-views.cf2a78c1.js +2 -0
  212. package/dist/node/column-views.cf2a78c1.js.map +1 -0
  213. package/dist/node/{column-views.c7f6fc0a.js → column-views.d529d3aa.js} +2 -2
  214. package/dist/node/{column-views.c7f6fc0a.js.map → column-views.d529d3aa.js.map} +1 -1
  215. package/dist/node/{column-views.7010a03b.js → column-views.dd972321.js} +2 -2
  216. package/dist/node/{column-views.7010a03b.js.map → column-views.dd972321.js.map} +1 -1
  217. package/dist/node/column-views.e065152e.js +2 -0
  218. package/dist/node/column-views.e065152e.js.map +1 -0
  219. package/dist/node/{column-views.6c7a40e0.js → column-views.e08f8715.js} +2 -2
  220. package/dist/node/{column-views.6c7a40e0.js.map → column-views.e08f8715.js.map} +1 -1
  221. package/dist/node/{column-views.507635e2.js → column-views.e0d9865e.js} +2 -2
  222. package/dist/node/column-views.e0d9865e.js.map +1 -0
  223. package/dist/node/column-views.e2562224.js +2 -0
  224. package/dist/node/column-views.e2562224.js.map +1 -0
  225. package/dist/node/column-views.e803e4ae.css +2 -0
  226. package/dist/node/column-views.e803e4ae.css.map +1 -0
  227. package/dist/node/column-views.edb4ba54.js +2 -0
  228. package/dist/node/column-views.edb4ba54.js.map +1 -0
  229. package/dist/node/index.js +1 -1
  230. package/dist/node/index.js.map +1 -1
  231. package/package.json +14 -14
  232. package/src/age-axis.module.sass +4 -2
  233. package/src/age-axis.ts +49 -15
  234. package/src/age-model-overlay.ts +22 -1
  235. package/src/column.module.sass +32 -9
  236. package/src/column.ts +91 -19
  237. package/src/correlation-chart/main.ts +10 -2
  238. package/src/correlation-chart/prepare-data.ts +7 -4
  239. package/src/correlation-chart/stories/correlation-chart.stories.ts +26 -1
  240. package/src/data-provider/base.ts +33 -25
  241. package/src/data-provider/fetch.ts +10 -3
  242. package/src/data-provider/store.ts +16 -10
  243. package/src/facets/base-sample-column.module.sass +14 -0
  244. package/src/facets/base-sample-column.ts +114 -0
  245. package/src/facets/detrital-zircon/index.ts +31 -63
  246. package/src/facets/fossils/index.module.sass +43 -13
  247. package/src/facets/fossils/index.ts +246 -80
  248. package/src/facets/fossils/provider.ts +121 -25
  249. package/src/facets/index.ts +2 -0
  250. package/src/facets/measurements/index.ts +38 -0
  251. package/src/facets/measurements/provider.ts +80 -0
  252. package/src/prepare-units/composite-scale.ts +183 -155
  253. package/src/prepare-units/dynamic-scales.ts +298 -0
  254. package/src/prepare-units/helpers.ts +99 -87
  255. package/src/prepare-units/index.ts +77 -51
  256. package/src/prepare-units/types.ts +138 -0
  257. package/src/prepare-units/utils.ts +29 -1
  258. package/src/section.ts +46 -9
  259. package/src/unit-details/panel.module.sass +8 -1
  260. package/src/unit-details/panel.ts +123 -53
  261. package/src/unit-details/popover.ts +5 -0
  262. package/src/units/boxes.ts +2 -69
  263. package/src/units/composite.ts +3 -49
  264. package/src/units/selection.ts +21 -7
  265. package/dist/esm/column-views.07db2ab1.js.map +0 -1
  266. package/dist/esm/column-views.0e06c069.js.map +0 -1
  267. package/dist/esm/column-views.1c92b88f.js +0 -16
  268. package/dist/esm/column-views.1c92b88f.js.map +0 -1
  269. package/dist/esm/column-views.1e055ed5.js.map +0 -1
  270. package/dist/esm/column-views.2e0ff311.js.map +0 -1
  271. package/dist/esm/column-views.3048acc1.js +0 -66
  272. package/dist/esm/column-views.3048acc1.js.map +0 -1
  273. package/dist/esm/column-views.34a1ac4f.js.map +0 -1
  274. package/dist/esm/column-views.3729c372.js +0 -13
  275. package/dist/esm/column-views.39657bbf.js.map +0 -1
  276. package/dist/esm/column-views.3b637517.js.map +0 -1
  277. package/dist/esm/column-views.3f246167.js.map +0 -1
  278. package/dist/esm/column-views.4ab0ec82.js.map +0 -1
  279. package/dist/esm/column-views.4d22c21c.js.map +0 -1
  280. package/dist/esm/column-views.57636733.css.map +0 -1
  281. package/dist/esm/column-views.60dc6bfc.js +0 -108
  282. package/dist/esm/column-views.60dc6bfc.js.map +0 -1
  283. package/dist/esm/column-views.64a84c43.js.map +0 -1
  284. package/dist/esm/column-views.6d5e3098.js +0 -11
  285. package/dist/esm/column-views.9771145a.js.map +0 -1
  286. package/dist/esm/column-views.9892f825.js.map +0 -1
  287. package/dist/esm/column-views.a23b2c92.js.map +0 -1
  288. package/dist/esm/column-views.a2cf8f33.js.map +0 -1
  289. package/dist/esm/column-views.abe90091.js.map +0 -1
  290. package/dist/esm/column-views.b12a6374.css.map +0 -1
  291. package/dist/esm/column-views.b17f793f.css.map +0 -1
  292. package/dist/esm/column-views.b72918ce.css.map +0 -1
  293. package/dist/esm/column-views.c71c321c.js +0 -104
  294. package/dist/esm/column-views.c71c321c.js.map +0 -1
  295. package/dist/esm/column-views.cdadc5c2.js.map +0 -1
  296. package/dist/esm/column-views.d48cb0d8.js.map +0 -1
  297. package/dist/esm/column-views.f08929e2.js.map +0 -1
  298. package/dist/esm/column-views.ff031876.js.map +0 -1
  299. package/dist/node/column-views.0bb1ec93.js +0 -2
  300. package/dist/node/column-views.0bb1ec93.js.map +0 -1
  301. package/dist/node/column-views.13c4ea85.js +0 -2
  302. package/dist/node/column-views.13c4ea85.js.map +0 -1
  303. package/dist/node/column-views.1a0b56fc.js +0 -2
  304. package/dist/node/column-views.1a0b56fc.js.map +0 -1
  305. package/dist/node/column-views.226d0bdb.js +0 -2
  306. package/dist/node/column-views.226d0bdb.js.map +0 -1
  307. package/dist/node/column-views.2926f656.css +0 -2
  308. package/dist/node/column-views.2926f656.css.map +0 -1
  309. package/dist/node/column-views.2ab1c2f8.js +0 -2
  310. package/dist/node/column-views.2ab1c2f8.js.map +0 -1
  311. package/dist/node/column-views.3345cd7a.js +0 -2
  312. package/dist/node/column-views.3345cd7a.js.map +0 -1
  313. package/dist/node/column-views.33752461.js +0 -2
  314. package/dist/node/column-views.33752461.js.map +0 -1
  315. package/dist/node/column-views.372bbee2.js +0 -2
  316. package/dist/node/column-views.372bbee2.js.map +0 -1
  317. package/dist/node/column-views.38357d4a.js +0 -2
  318. package/dist/node/column-views.38357d4a.js.map +0 -1
  319. package/dist/node/column-views.3a55ecd7.css.map +0 -1
  320. package/dist/node/column-views.3eeac38d.js +0 -2
  321. package/dist/node/column-views.3eeac38d.js.map +0 -1
  322. package/dist/node/column-views.3f032518.js +0 -2
  323. package/dist/node/column-views.3f032518.js.map +0 -1
  324. package/dist/node/column-views.45168c80.js +0 -2
  325. package/dist/node/column-views.45168c80.js.map +0 -1
  326. package/dist/node/column-views.507635e2.js.map +0 -1
  327. package/dist/node/column-views.556e8f69.js +0 -2
  328. package/dist/node/column-views.556e8f69.js.map +0 -1
  329. package/dist/node/column-views.5f05b73f.js +0 -2
  330. package/dist/node/column-views.5f05b73f.js.map +0 -1
  331. package/dist/node/column-views.6ae7bb69.js +0 -2
  332. package/dist/node/column-views.6ae7bb69.js.map +0 -1
  333. package/dist/node/column-views.755f726e.js +0 -2
  334. package/dist/node/column-views.755f726e.js.map +0 -1
  335. package/dist/node/column-views.75b0a8f8.js +0 -2
  336. package/dist/node/column-views.75b0a8f8.js.map +0 -1
  337. package/dist/node/column-views.78d3f3c5.js +0 -2
  338. package/dist/node/column-views.78d3f3c5.js.map +0 -1
  339. package/dist/node/column-views.8cfed88b.js +0 -2
  340. package/dist/node/column-views.8cfed88b.js.map +0 -1
  341. package/dist/node/column-views.99fb74c0.js +0 -2
  342. package/dist/node/column-views.99fb74c0.js.map +0 -1
  343. package/dist/node/column-views.a501cea0.js +0 -2
  344. package/dist/node/column-views.a501cea0.js.map +0 -1
  345. package/dist/node/column-views.af275c48.js +0 -2
  346. package/dist/node/column-views.af275c48.js.map +0 -1
  347. package/dist/node/column-views.afbf351c.js +0 -2
  348. package/dist/node/column-views.afbf351c.js.map +0 -1
  349. package/dist/node/column-views.b180e8c9.js +0 -2
  350. package/dist/node/column-views.b180e8c9.js.map +0 -1
  351. package/dist/node/column-views.cd468adb.css +0 -2
  352. package/dist/node/column-views.cd468adb.css.map +0 -1
  353. package/dist/node/column-views.d6708353.js +0 -2
  354. package/dist/node/column-views.d6708353.js.map +0 -1
  355. package/dist/node/column-views.e1a43131.css +0 -2
  356. package/dist/node/column-views.e1a43131.css.map +0 -1
  357. package/dist/node/column-views.e9515ec1.js +0 -2
  358. package/dist/node/column-views.e9515ec1.js.map +0 -1
  359. package/dist/node/column-views.f15a6ed4.js +0 -2
  360. package/dist/node/column-views.f15a6ed4.js.map +0 -1
  361. package/dist/node/column-views.fc05616e.js +0 -2
  362. package/dist/node/column-views.fc05616e.js.map +0 -1
@@ -0,0 +1,298 @@
1
+ import type { UnitLong } from "@macrostrat/api-types";
2
+ import { scaleLinear } from "d3-scale";
3
+ import { getUnitHeightRange } from "./utils";
4
+ import { ColumnAxisType } from "@macrostrat/column-components";
5
+ import { mergeAgeRanges, MergeMode } from "@macrostrat/stratigraphy-utils";
6
+ import type {
7
+ ApproxHeightScaleOptions,
8
+ ExtUnit,
9
+ HybridScaleDefinition,
10
+ HybridScaleOptions,
11
+ PackageScaleInfo,
12
+ } from "./types";
13
+ import { HybridScaleType, HeightMethod } from "./types";
14
+
15
+ interface BaseSurface {
16
+ index: number;
17
+ age: number;
18
+ units_below: number[];
19
+ units_above: number[];
20
+ }
21
+
22
+ export function buildColumnSurfaces<T extends UnitLong>(
23
+ units: T[],
24
+ tolerance: number = 0.001,
25
+ ): BaseSurface[] {
26
+ /** Compute age surfaces for a column based on unit tops and bottoms */
27
+ const surfaces: Omit<BaseSurface, "index">[] = [];
28
+ for (const unit of units) {
29
+ // Top surface
30
+ surfaces.push({
31
+ age: unit.t_age,
32
+ units_below: [unit.unit_id],
33
+ units_above: [],
34
+ });
35
+ // Bottom surface
36
+ surfaces.push({
37
+ age: unit.b_age,
38
+ units_above: [unit.unit_id],
39
+ units_below: [],
40
+ });
41
+ }
42
+
43
+ // Merge duplicate surfaces (same age)
44
+ const mergedSurfaces: Omit<BaseSurface, "index">[] = [];
45
+ for (const surface of surfaces) {
46
+ const existingSurface = mergedSurfaces.find(
47
+ (s) => Math.abs(s.age - surface.age) < tolerance,
48
+ );
49
+ if (existingSurface) {
50
+ existingSurface.units_above.push(...surface.units_above);
51
+ existingSurface.units_below.push(...surface.units_below);
52
+ } else {
53
+ mergedSurfaces.push(surface);
54
+ }
55
+ }
56
+
57
+ // Sort surfaces by age (ascending)
58
+ mergedSurfaces.sort((a, b) => a.age - b.age);
59
+
60
+ return mergedSurfaces.map((s, i) => ({ ...s, index: i }));
61
+ }
62
+
63
+ interface AgeDomainUnitInfo {
64
+ t_age: number;
65
+ b_age: number;
66
+ units: ExtUnit[];
67
+ }
68
+
69
+ function getUnitsInAgeDomains(
70
+ surfaces: BaseSurface[],
71
+ units: ExtUnit[],
72
+ ): AgeDomainUnitInfo[] {
73
+ // Get unit IDs represented between the same surface, and the proportion of their total height represented
74
+ const domainUnitInfo: AgeDomainUnitInfo[] = [];
75
+ for (let i = 0; i < surfaces.length - 1; i++) {
76
+ const topSurface = surfaces[i];
77
+ const bottomSurface = surfaces[i + 1];
78
+ const unitsInDomain = units.filter((unit) => {
79
+ return (
80
+ unit.t_age <= topSurface.age + 0.001 &&
81
+ unit.b_age >= bottomSurface.age - 0.001
82
+ );
83
+ });
84
+ domainUnitInfo.push({
85
+ t_age: topSurface.age,
86
+ b_age: bottomSurface.age,
87
+ units: unitsInDomain,
88
+ });
89
+ }
90
+ return domainUnitInfo;
91
+ }
92
+
93
+ function proportionOfUnitInDomain(
94
+ unit: ExtUnit,
95
+ t_age: number,
96
+ b_age: number,
97
+ ): number {
98
+ // Compute the proportion of a unit's height that lies within the given age domain
99
+
100
+ const rng = getUnitHeightRange(unit, ColumnAxisType.AGE);
101
+ const rng1: [number, number] = [b_age, t_age];
102
+ // Compute overlap
103
+
104
+ const mergedRange = mergeAgeRanges([rng, rng1], MergeMode.Inner);
105
+
106
+ const unitHeight = Math.abs(rng[1] - rng[0]);
107
+ const mergedHeight = Math.abs(mergedRange[1] - mergedRange[0]);
108
+
109
+ return mergedHeight / unitHeight;
110
+ }
111
+
112
+ export function buildHybridScale<T extends UnitLong>(
113
+ def: HybridScaleDefinition,
114
+ units: T[],
115
+ domain: [number, number],
116
+ options: HybridScaleOptions = {},
117
+ ): PackageScaleInfo {
118
+ const surfaces = buildColumnSurfaces(units);
119
+
120
+ const filteredSurfaces = surfaces.filter(
121
+ (s) => s.age < Math.max(...domain) && s.age > Math.min(...domain),
122
+ );
123
+
124
+ const s1 = [
125
+ { index: -1, age: Math.min(...domain), units_above: [], units_below: [] },
126
+ ...filteredSurfaces,
127
+ {
128
+ index: -1,
129
+ age: Math.max(...domain),
130
+ units_above: [],
131
+ units_below: [],
132
+ },
133
+ ];
134
+
135
+ const { type, ...rest } = def;
136
+
137
+ if (type === HybridScaleType.EquidistantSurfaces) {
138
+ return buildScaleFromSurfacesSimple(s1, options);
139
+ }
140
+
141
+ return buildApproximateHeightScale(s1, units, { ...options, ...rest });
142
+ }
143
+
144
+ function getApproximateHeight(
145
+ unit: ExtUnit,
146
+ method: HeightMethod = HeightMethod.Maximum,
147
+ ): number | null {
148
+ // Get approximate height of a unit based on specified method
149
+ const heights = [];
150
+ let minHeight = unit.min_thick;
151
+ if (method === HeightMethod.Minimum || method === HeightMethod.Average) {
152
+ const h = unit.min_thick;
153
+ if (h != null && !isNaN(h) && h > 0) heights.push(h);
154
+ }
155
+ if (method === HeightMethod.Average || method === HeightMethod.Maximum) {
156
+ const h = unit.max_thick;
157
+ if (h != null && !isNaN(h) && h > 0) heights.push(h);
158
+ }
159
+
160
+ if (heights.length === 0) return null;
161
+
162
+ if (method === HeightMethod.Average) {
163
+ return heights.reduce((sum, h) => sum + h, 0) / heights.length;
164
+ } else {
165
+ return heights[0];
166
+ }
167
+ }
168
+
169
+ export function buildApproximateHeightScale(
170
+ surfaces: BaseSurface[],
171
+ units: UnitLong[],
172
+ options: HybridScaleOptions & ApproxHeightScaleOptions = {},
173
+ ): PackageScaleInfo {
174
+ /** Build a variable age scale that places age surfaces equally far apart in height space.
175
+ * It is presumed that gaps are already removed from the unit set provided.
176
+ * */
177
+
178
+ const {
179
+ pixelScale = 1, // pixels per meter
180
+ pixelOffset = 0,
181
+ minHeight = 5,
182
+ heightMethod = HeightMethod.Maximum,
183
+ // Default height for when height is unknown
184
+ defaultHeight = 100,
185
+ } = options;
186
+
187
+ // Get units associated with each surface
188
+ // Note: we could hoist this if it proved useful for other scale types
189
+ const domainInfo = getUnitsInAgeDomains(surfaces, units as ExtUnit[]);
190
+
191
+ // Compute the height in pixels for each surface
192
+
193
+ const surfaceHeights = [];
194
+ const ageDomain = [];
195
+ let lastHeight = pixelOffset;
196
+
197
+ for (const domain of domainInfo) {
198
+ if (lastHeight == pixelOffset) {
199
+ surfaceHeights.push(lastHeight);
200
+ ageDomain.push(domain.t_age);
201
+ }
202
+
203
+ // Approximate height based on units in this domain
204
+ const units = domain.units;
205
+ let unitHeightInfo: { unit: ExtUnit; height: number }[] = [];
206
+
207
+ for (const unit of units) {
208
+ const proportion = proportionOfUnitInDomain(
209
+ unit,
210
+ domain.t_age,
211
+ domain.b_age,
212
+ );
213
+ const height = getApproximateHeight(unit, heightMethod);
214
+ if (height != null) {
215
+ unitHeightInfo.push({ unit, height: height * proportion });
216
+ }
217
+ }
218
+
219
+ let thisHeight = 0;
220
+ if (unitHeightInfo.length === 0) {
221
+ thisHeight = defaultHeight; // Default height if no units with height info
222
+ } else {
223
+ // Normalize weights (take the mean)
224
+
225
+ const meanHeight =
226
+ unitHeightInfo.reduce((sum, d) => sum + d.height, 0) /
227
+ unitHeightInfo.length;
228
+
229
+ if (meanHeight == 0) {
230
+ thisHeight = defaultHeight; // Arbitrary height for zero-height intervals
231
+ } else if (meanHeight < minHeight) {
232
+ thisHeight = minHeight; // Minimum height
233
+ } else {
234
+ thisHeight = meanHeight;
235
+ }
236
+ }
237
+
238
+ lastHeight += thisHeight;
239
+ surfaceHeights.push(lastHeight);
240
+ ageDomain.push(domain.b_age);
241
+ }
242
+
243
+ // Build a piecewise linear scale mapping age to pixel height
244
+ const pixelRange = surfaceHeights.map((h) => h * pixelScale);
245
+
246
+ const scale = scaleLinear().domain(ageDomain).range(pixelRange);
247
+
248
+ const heightDomain = surfaceHeights.map((h) => lastHeight - h);
249
+
250
+ const heightScale = scaleLinear().domain(heightDomain).range(pixelRange);
251
+
252
+ const domain: [number, number] = [
253
+ ageDomain[ageDomain.length - 1],
254
+ ageDomain[0],
255
+ ];
256
+
257
+ return {
258
+ scale,
259
+ pixelScale: null, // pixels per unit
260
+ domain,
261
+ pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),
262
+ heightScale,
263
+ };
264
+ }
265
+
266
+ export function buildScaleFromSurfacesSimple(
267
+ surfaces: BaseSurface[],
268
+ options: HybridScaleOptions = {},
269
+ ): PackageScaleInfo {
270
+ /** Build a variable age scale that places age surfaces equally far apart in height space.
271
+ * It is presumed that gaps are already removed from the unit set provided.
272
+ * */
273
+
274
+ const { pixelScale = 30 } = options;
275
+
276
+ const domain: [number, number] = [
277
+ surfaces[surfaces.length - 1].age,
278
+ surfaces[0].age,
279
+ ];
280
+ // Compute the height in pixels for each surface
281
+
282
+ const surfaceHeights = surfaces.map((surface, i) => {
283
+ return i * pixelScale;
284
+ });
285
+
286
+ // Build a piecewise linear scale mapping age to pixel height
287
+ const ageDomain = surfaces.map((s) => s.age);
288
+ const pixelRange = surfaceHeights;
289
+
290
+ const scale = scaleLinear().domain(ageDomain).range(pixelRange);
291
+
292
+ return {
293
+ scale,
294
+ pixelScale: null, // pixels per unit
295
+ domain,
296
+ pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),
297
+ };
298
+ }
@@ -2,48 +2,27 @@ import type { BaseUnit, UnitLong } from "@macrostrat/api-types";
2
2
  import { group } from "d3-array";
3
3
  import { ColumnAxisType } from "@macrostrat/column-components";
4
4
  import {
5
- unitsOverlap,
6
- getUnitHeightRange,
7
5
  createUnitSorter,
8
6
  ensureArray,
9
7
  ensureRealFloat,
10
- PossiblyClippedUnit,
8
+ getUnitHeightRange,
9
+ unitsOverlap,
11
10
  } from "./utils";
12
- import { compareAgeRanges } from "@macrostrat/stratigraphy-utils";
11
+ import {
12
+ AgeRangeRelationship,
13
+ compareAgeRanges,
14
+ } from "@macrostrat/stratigraphy-utils";
15
+ import type { ExtUnit, SectionInfo, StratigraphicPackage } from "./types";
13
16
 
14
17
  const dt = 0.001;
15
18
 
16
- export interface StratigraphicPackage {
17
- /** A collection of stratigraphic information organized in time, corresponding
18
- * to single or multiple columns. */
19
- t_age: number;
20
- b_age: number;
21
- }
22
-
23
- export interface SectionInfo<T extends UnitLong = ExtUnit>
24
- extends StratigraphicPackage {
25
- /** A time-bounded part of a single stratigraphic column. */
26
- section_id: number | number[];
27
- units: T[];
28
- }
29
-
30
- export interface ExtUnit extends UnitLong {
31
- bottomOverlap: boolean;
32
- overlappingUnits: number[];
33
- column?: number;
34
- /* Positions (ages or heights) where the unit is clipped to its containing section.
35
- * This is relevant if we are filtering by age/height/depth range.
36
- */
37
- t_clip_pos?: number;
38
- b_clip_pos?: number;
39
- }
40
-
41
19
  export function preprocessUnits<T extends UnitLong = UnitLong>(
42
20
  section: SectionInfo<T>,
43
21
  axisType: ColumnAxisType = ColumnAxisType.AGE,
44
22
  ): ExtUnit[] {
45
23
  /** Preprocess units to add overlapping units and columns. */
46
- const units = section.units;
24
+ let units = section.units;
25
+
47
26
  let divisions = units.map((...args) => extendDivision(...args, axisType));
48
27
  for (let d of divisions) {
49
28
  const overlappingUnits = divisions.filter((u) =>
@@ -63,8 +42,8 @@ export function preprocessUnits<T extends UnitLong = UnitLong>(
63
42
  }
64
43
 
65
44
  // If unit overlaps the edges of a section, set the clip positions
45
+ const [b_pos, t_pos] = getUnitHeightRange(d, axisType);
66
46
  if (axisType == ColumnAxisType.AGE) {
67
- const [b_pos, t_pos] = getUnitHeightRange(d, axisType);
68
47
  if (b_pos > section.b_age) {
69
48
  d.b_clip_pos = section.b_age;
70
49
  }
@@ -72,14 +51,24 @@ export function preprocessUnits<T extends UnitLong = UnitLong>(
72
51
  d.t_clip_pos = section.t_age;
73
52
  }
74
53
  }
54
+ if (axisType == ColumnAxisType.DEPTH) {
55
+ if (b_pos > section.b_pos) {
56
+ d.b_clip_pos = section.b_pos;
57
+ }
58
+ if (t_pos < section.t_pos) {
59
+ d.t_clip_pos = section.t_pos;
60
+ }
61
+ }
62
+ // if (axisType == ColumnAxisType.HEIGHT) {
63
+ // if (b_pos < section.b_pos) {
64
+ // d.b_clip_pos = section.b_pos;
65
+ // }
66
+ // if (t_pos > section.t_pos) {
67
+ // d.t_clip_pos = section.t_pos;
68
+ // }
69
+ // }
75
70
  }
76
71
 
77
- // TODO: we may want to re-enable this simpler processing for sections,
78
- // but we want it to be less universally applied.
79
- // if (axisType != ColumnAxisType.AGE) {
80
- // return preprocessSectionUnits(divisions, axisType);
81
- // }
82
- //
83
72
  return divisions;
84
73
  }
85
74
 
@@ -89,8 +78,15 @@ function extendDivision(
89
78
  divisions: UnitLong[],
90
79
  axisType: ColumnAxisType = ColumnAxisType.AGE,
91
80
  ): ExtUnit {
81
+ // TODO: make this configurable
82
+ let tolerance = 0.001; // 1 kyr tolerance for age columns
83
+ if (axisType != ColumnAxisType.AGE) {
84
+ tolerance = 0.01; // 1cm tolerance for height/depth columns
85
+ }
86
+
92
87
  const overlappingUnits = divisions.filter(
93
- (d) => d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType),
88
+ (d) =>
89
+ d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType, tolerance),
94
90
  );
95
91
  const u_pos = getUnitHeightRange(unit, axisType);
96
92
  const bottomOverlap = overlappingUnits.some((d) => {
@@ -111,14 +107,10 @@ function extendDivision(
111
107
  };
112
108
  }
113
109
 
114
- export function groupUnitsIntoSections<T extends UnitLong>(
110
+ export function groupUnitsIntoSectionsBySectionID<T extends UnitLong>(
115
111
  units: T[],
116
112
  axisType: ColumnAxisType = ColumnAxisType.AGE,
117
113
  ): SectionInfo<T>[] {
118
- if (axisType != ColumnAxisType.AGE) {
119
- return groupUnitsIntoSectionByOverlap(units, axisType);
120
- }
121
-
122
114
  /** Group units into sections by section_id.
123
115
  * This works for large-scale Macrostrat columns, where units are grouped by section_id.
124
116
  * */
@@ -127,13 +119,15 @@ export function groupUnitsIntoSections<T extends UnitLong>(
127
119
 
128
120
  const groups1 = groups.map(([section_id, sectionUnits]) => {
129
121
  const [b_age, t_age] = getSectionAgeRange(sectionUnits);
122
+ const [b_pos, t_pos] = getSectionPosRange(sectionUnits, axisType);
123
+
130
124
  // sort units by position
131
125
  sectionUnits.sort(unitComparator);
132
- return { section_id, t_age, b_age, units: sectionUnits };
126
+ return { section_id, t_age, b_age, b_pos, t_pos, units: sectionUnits };
133
127
  });
134
128
  // Sort sections by increasing top age, then increasing bottom age.
135
129
  // Sections have no relative ordinal position other than age...
136
- const compareSections = createUnitSorter(ColumnAxisType.AGE) as (
130
+ const compareSections = createUnitSorter(axisType) as (
137
131
  a: StratigraphicPackage,
138
132
  b: StratigraphicPackage,
139
133
  ) => number;
@@ -147,7 +141,7 @@ interface WorkingSection {
147
141
  heightRange?: [number, number];
148
142
  }
149
143
 
150
- function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
144
+ export function groupUnitsIntoSectionsByOverlap<T extends UnitLong>(
151
145
  units: T[],
152
146
  axisType: ColumnAxisType = ColumnAxisType.AGE,
153
147
  ): SectionInfo<T>[] {
@@ -161,8 +155,10 @@ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
161
155
  for (const unit of units) {
162
156
  // Check if the unit overlaps with any existing section
163
157
  const heightRange = getUnitHeightRange(unit, axisType);
164
- let section: WorkingSection | undefined = sectionList.find((s) =>
165
- compareAgeRanges(heightRange, s.heightRange),
158
+ let section: WorkingSection | undefined = sectionList.find(
159
+ (s) =>
160
+ compareAgeRanges(heightRange, s.heightRange) !==
161
+ AgeRangeRelationship.Disjoint,
166
162
  );
167
163
  if (section == null) {
168
164
  // No overlap, create a new section
@@ -174,10 +170,17 @@ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
174
170
  // Overlap, merge the unit into the section
175
171
  section.units.push(unit);
176
172
  // Update the height range
177
- section.heightRange = [
178
- Math.max(section.heightRange[0], heightRange[0]),
179
- Math.min(section.heightRange[1], heightRange[1]),
180
- ];
173
+ if (axisType == ColumnAxisType.DEPTH || axisType == ColumnAxisType.AGE) {
174
+ section.heightRange = [
175
+ Math.max(section.heightRange[0], heightRange[0]),
176
+ Math.min(section.heightRange[1], heightRange[1]),
177
+ ];
178
+ } else {
179
+ section.heightRange = [
180
+ Math.min(section.heightRange[0], heightRange[0]),
181
+ Math.max(section.heightRange[1], heightRange[1]),
182
+ ];
183
+ }
181
184
  }
182
185
  }
183
186
  // We should have a section for each unit, now we can convert to SectionInfo
@@ -185,23 +188,58 @@ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
185
188
 
186
189
  return sectionList.map((section, i) => {
187
190
  const [b_age, t_age] = getSectionAgeRange(section.units);
191
+ const [b_pos, t_pos] = getSectionPosRange(section.units, axisType);
188
192
  return {
189
193
  // Negative section IDs are used to indicate that these are synthetic sections
190
194
  section_id: -i,
191
- t_age: t_age,
192
- b_age: b_age,
195
+ t_age,
196
+ b_age,
197
+ t_pos,
198
+ b_pos,
193
199
  units: section.units as T[],
194
200
  };
195
201
  });
196
202
  }
197
203
 
204
+ export function getSectionPosRange(
205
+ units: BaseUnit[],
206
+ axisType: ColumnAxisType,
207
+ ): [number, number] {
208
+ /** Get the overall position range of a set of units. */
209
+ const t_positions = units.map((d) => {
210
+ switch (axisType) {
211
+ case ColumnAxisType.AGE:
212
+ return d.t_age;
213
+ case ColumnAxisType.DEPTH:
214
+ case ColumnAxisType.HEIGHT:
215
+ case ColumnAxisType.ORDINAL:
216
+ return d.t_pos;
217
+ default:
218
+ throw new Error(`Unknown axis type: ${axisType}`);
219
+ }
220
+ });
221
+ const b_positions = units.map((d) => {
222
+ switch (axisType) {
223
+ case ColumnAxisType.AGE:
224
+ return d.b_age;
225
+ case ColumnAxisType.DEPTH:
226
+ case ColumnAxisType.HEIGHT:
227
+ case ColumnAxisType.ORDINAL:
228
+ return d.b_pos;
229
+ default:
230
+ throw new Error(`Unknown axis type: ${axisType}`);
231
+ }
232
+ });
233
+ if (axisType == ColumnAxisType.AGE || axisType == ColumnAxisType.DEPTH) {
234
+ return [Math.max(...b_positions), Math.min(...t_positions)];
235
+ } else {
236
+ return [Math.min(...b_positions), Math.max(...t_positions)];
237
+ }
238
+ }
239
+
198
240
  export function getSectionAgeRange(units: BaseUnit[]): [number, number] {
199
241
  /** Get the overall age range of a set of units. */
200
- const t_ages = units.map((d) => d.t_age);
201
- const b_ages = units.map((d) => d.b_age);
202
- const t_age = Math.min(...t_ages);
203
- const b_age = Math.max(...b_ages);
204
- return [b_age, t_age];
242
+ return getSectionPosRange(units, ColumnAxisType.AGE);
205
243
  }
206
244
 
207
245
  export function mergeOverlappingSections<T extends UnitLong>(
@@ -235,38 +273,14 @@ export function mergeOverlappingSections<T extends UnitLong>(
235
273
  return newSections;
236
274
  }
237
275
 
238
- function preprocessSectionUnits(
239
- units: UnitLong[],
240
- axisType: ColumnAxisType = ColumnAxisType.DEPTH,
241
- ): ExtUnit[] {
242
- /** Preprocess units for a "section" column type, which is guaranteed to be simpler. */
243
- // We have to assume the units are ordered...
244
- let thickness = 0;
245
- return units.map((unit, i) => {
246
- let u1 = preprocessSectionUnit(unit, i, units, thickness, axisType);
247
- thickness += Math.abs(u1.t_pos - u1.b_pos);
248
- return u1;
249
- });
250
- }
251
-
252
- function preprocessSectionUnit(
253
- unit: UnitLong,
254
- i: number,
255
- units: UnitLong[],
256
- accumulatedThickness: number = 0,
257
- axisType: ColumnAxisType = ColumnAxisType.DEPTH,
258
- ): ExtUnit {
276
+ export function preprocessSectionUnit(unit: UnitLong): UnitLong {
259
277
  /** Preprocess a single unit for a "section" column type.
260
- * No provision for overlapping units.
278
+ * This mostly handles vagaries of eODP-style columns.
261
279
  * */
262
280
 
263
281
  let b_pos = unit.b_pos;
264
282
  let t_pos = unit.t_pos;
265
283
 
266
- if (b_pos == t_pos && axisType == ColumnAxisType.ORDINAL) {
267
- t_pos = t_pos - 1;
268
- }
269
-
270
284
  let unit_name = unit.unit_name;
271
285
 
272
286
  // eODP columns sometimes have overlapping core sections, which are encoded in the name field
@@ -285,7 +299,5 @@ function preprocessSectionUnit(
285
299
  b_pos: ensureRealFloat(b_pos),
286
300
  t_pos: ensureRealFloat(t_pos),
287
301
  unit_name,
288
- bottomOverlap: false,
289
- overlappingUnits: [],
290
302
  };
291
303
  }