@macrostrat/column-views 2.0.1 → 2.1.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 (375) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/esm/{column-views.8dd877af.js → column-views.006d5180.js} +2 -1
  3. package/dist/esm/column-views.006d5180.js.map +1 -0
  4. package/dist/esm/column-views.05586d1f.js +22 -0
  5. package/dist/esm/column-views.05586d1f.js.map +1 -0
  6. package/dist/esm/column-views.0732894f.js +86 -0
  7. package/dist/esm/column-views.0732894f.js.map +1 -0
  8. package/dist/esm/{column-views.134b2e2a.js → column-views.08440694.js} +2 -2
  9. package/dist/esm/{column-views.134b2e2a.js.map → column-views.08440694.js.map} +1 -1
  10. package/dist/esm/{column-views.aa9fcdba.js → column-views.0c14e18e.js} +18 -15
  11. package/dist/esm/column-views.0c14e18e.js.map +1 -0
  12. package/dist/esm/column-views.10eba967.js +11 -0
  13. package/dist/esm/column-views.10eba967.js.map +1 -0
  14. package/dist/esm/{column-views.8e51206e.js → column-views.1af9761e.js} +19 -3
  15. package/dist/esm/column-views.1af9761e.js.map +1 -0
  16. package/dist/esm/column-views.1c92b88f.js +16 -0
  17. package/dist/esm/column-views.1c92b88f.js.map +1 -0
  18. package/dist/esm/{column-views.ea237aa8.js → column-views.1e055ed5.js} +6 -5
  19. package/dist/esm/column-views.1e055ed5.js.map +1 -0
  20. package/dist/esm/{column-views.1ece326b.js → column-views.1f123354.js} +60 -11
  21. package/dist/esm/column-views.1f123354.js.map +1 -0
  22. package/dist/esm/{column-views.240ef158.css → column-views.217078ab.css} +4 -3
  23. package/dist/esm/column-views.217078ab.css.map +1 -0
  24. package/dist/esm/column-views.2c45a7b5.js +25 -0
  25. package/dist/esm/column-views.2c45a7b5.js.map +1 -0
  26. package/dist/esm/column-views.2ca34210.js +151 -0
  27. package/dist/esm/column-views.2ca34210.js.map +1 -0
  28. package/dist/esm/{column-views.3bec70d6.js → column-views.2d8e0e0f.js} +9 -8
  29. package/dist/esm/column-views.2d8e0e0f.js.map +1 -0
  30. package/dist/esm/column-views.3048acc1.js +66 -0
  31. package/dist/esm/column-views.3048acc1.js.map +1 -0
  32. package/dist/esm/column-views.39657bbf.js.map +1 -1
  33. package/dist/esm/{column-views.28ee5f43.js → column-views.3ba9213d.js} +16 -5
  34. package/dist/esm/column-views.3ba9213d.js.map +1 -0
  35. package/dist/esm/column-views.3de4dc43.js.map +1 -1
  36. package/dist/esm/column-views.403a7b48.css +24 -0
  37. package/dist/esm/column-views.403a7b48.css.map +1 -0
  38. package/dist/esm/column-views.4637f4ce.js.map +1 -1
  39. package/dist/esm/{column-views.86c4b36f.js → column-views.4ab0ec82.js} +44 -13
  40. package/dist/esm/column-views.4ab0ec82.js.map +1 -0
  41. package/dist/esm/{column-views.9bdd477a.js → column-views.4d22c21c.js} +2 -2
  42. package/dist/esm/{column-views.9bdd477a.js.map → column-views.4d22c21c.js.map} +1 -1
  43. package/dist/esm/{column-views.fa6f3292.js → column-views.4df0b803.js} +7 -8
  44. package/dist/esm/column-views.4df0b803.js.map +1 -0
  45. package/dist/esm/{column-views.b775c0a3.js → column-views.52a6eb47.js} +3 -3
  46. package/dist/esm/{column-views.b775c0a3.js.map → column-views.52a6eb47.js.map} +1 -1
  47. package/dist/esm/column-views.57636733.css +22 -0
  48. package/dist/esm/column-views.57636733.css.map +1 -0
  49. package/dist/esm/{column-views.68409161.js → column-views.59bb0cba.js} +2 -3
  50. package/dist/esm/column-views.59bb0cba.js.map +1 -0
  51. package/dist/esm/column-views.5cc09c1d.js.map +1 -1
  52. package/dist/esm/column-views.5e2dc19d.js +187 -0
  53. package/dist/esm/column-views.5e2dc19d.js.map +1 -0
  54. package/dist/esm/{column-views.33dbc778.js → column-views.633c42a3.js} +2 -1
  55. package/dist/esm/column-views.633c42a3.js.map +1 -0
  56. package/dist/esm/{column-views.e77b9d6b.js → column-views.6549388a.js} +4 -5
  57. package/dist/esm/column-views.6549388a.js.map +1 -0
  58. package/dist/esm/{column-views.dff52504.js → column-views.686d21ad.js} +10 -1
  59. package/dist/esm/column-views.686d21ad.js.map +1 -0
  60. package/dist/esm/column-views.6992ca88.js +25 -0
  61. package/dist/esm/column-views.6992ca88.js.map +1 -0
  62. package/dist/esm/column-views.6d6b73b4.js.map +1 -1
  63. package/dist/esm/column-views.708140ab.css +36 -0
  64. package/dist/esm/column-views.708140ab.css.map +1 -0
  65. package/dist/esm/{column-views.650bd9f5.js → column-views.7715e35e.js} +17 -13
  66. package/dist/esm/column-views.7715e35e.js.map +1 -0
  67. package/dist/esm/{column-views.a98214b2.js → column-views.7e350ae2.js} +3 -3
  68. package/dist/esm/{column-views.a98214b2.js.map → column-views.7e350ae2.js.map} +1 -1
  69. package/dist/esm/{column-views.30646469.js → column-views.85c6a716.js} +2 -2
  70. package/dist/esm/column-views.85c6a716.js.map +1 -0
  71. package/dist/esm/column-views.86619334.js +9 -0
  72. package/dist/esm/column-views.86619334.js.map +1 -0
  73. package/dist/esm/{column-views.40c1f361.js → column-views.89b9e542.js} +11 -18
  74. package/dist/esm/column-views.89b9e542.js.map +1 -0
  75. package/dist/esm/{column-views.1c589cc4.js → column-views.9892f825.js} +55 -4
  76. package/dist/esm/column-views.9892f825.js.map +1 -0
  77. package/dist/esm/{column-views.1edc7300.js → column-views.9b77388d.js} +6 -5
  78. package/dist/esm/column-views.9b77388d.js.map +1 -0
  79. package/dist/esm/column-views.a7c5ae16.js +25 -0
  80. package/dist/esm/column-views.a7c5ae16.js.map +1 -0
  81. package/dist/esm/{column-views.5c02fee2.js → column-views.a91dde4a.js} +10 -9
  82. package/dist/esm/column-views.a91dde4a.js.map +1 -0
  83. package/dist/esm/{column-views.fc2b4611.js → column-views.a94e99a2.js} +2 -2
  84. package/dist/esm/{column-views.fc2b4611.js.map → column-views.a94e99a2.js.map} +1 -1
  85. package/dist/esm/{column-views.e2b9c23c.css → column-views.b17f793f.css} +21 -1
  86. package/dist/esm/column-views.b17f793f.css.map +1 -0
  87. package/dist/esm/{column-views.9804efda.js → column-views.b9fe5176.js} +14 -8
  88. package/dist/esm/column-views.b9fe5176.js.map +1 -0
  89. package/dist/esm/{column-views.b2e5f1d9.js → column-views.bcffe6e5.js} +4 -4
  90. package/dist/esm/{column-views.b2e5f1d9.js.map → column-views.bcffe6e5.js.map} +1 -1
  91. package/dist/esm/{column-views.f1efcc2c.js → column-views.c25e8b32.js} +3 -3
  92. package/dist/esm/{column-views.f1efcc2c.js.map → column-views.c25e8b32.js.map} +1 -1
  93. package/dist/esm/{column-views.9ced149e.js → column-views.c32d6ad0.js} +25 -6
  94. package/dist/esm/column-views.c32d6ad0.js.map +1 -0
  95. package/dist/esm/{column-views.34636ec7.js → column-views.c71c321c.js} +11 -11
  96. package/dist/esm/column-views.c71c321c.js.map +1 -0
  97. package/dist/esm/{column-views.f2e5a72f.js → column-views.c8cc249a.js} +3 -3
  98. package/dist/esm/{column-views.f2e5a72f.js.map → column-views.c8cc249a.js.map} +1 -1
  99. package/dist/esm/{column-views.5b2635fd.js → column-views.c8e2983a.js} +4 -4
  100. package/dist/esm/{column-views.5b2635fd.js.map → column-views.c8e2983a.js.map} +1 -1
  101. package/dist/esm/{column-views.88de2cee.js → column-views.cfcf6096.js} +4 -4
  102. package/dist/esm/{column-views.88de2cee.js.map → column-views.cfcf6096.js.map} +1 -1
  103. package/dist/esm/{column-views.4c4c5bac.js → column-views.d2037465.js} +14 -8
  104. package/dist/esm/column-views.d2037465.js.map +1 -0
  105. package/dist/esm/column-views.dc42f5d0.js.map +1 -1
  106. package/dist/esm/column-views.e20f6a4b.js +124 -0
  107. package/dist/esm/column-views.e20f6a4b.js.map +1 -0
  108. package/dist/esm/{column-views.57c4ddf3.js → column-views.f08929e2.js} +2 -2
  109. package/dist/esm/column-views.f08929e2.js.map +1 -0
  110. package/dist/esm/column-views.f13a1d6e.js +37 -0
  111. package/dist/esm/column-views.f13a1d6e.js.map +1 -0
  112. package/dist/esm/column-views.f9dab157.js.map +1 -1
  113. package/dist/esm/column-views.fa19cea0.js +108 -0
  114. package/dist/esm/column-views.fa19cea0.js.map +1 -0
  115. package/dist/esm/{column-views.f71ec4b4.js → column-views.fdb0e9ec.js} +67 -30
  116. package/dist/esm/column-views.fdb0e9ec.js.map +1 -0
  117. package/dist/esm/index.d.ts +325 -296
  118. package/dist/esm/index.d.ts.map +1 -1
  119. package/dist/esm/index.js +13 -11
  120. package/dist/esm/index.js.map +1 -1
  121. package/dist/node/column-views.04407342.js +2 -0
  122. package/dist/node/column-views.04407342.js.map +1 -0
  123. package/dist/node/column-views.06951a55.js +2 -0
  124. package/dist/node/column-views.06951a55.js.map +1 -0
  125. package/dist/node/column-views.06b0534e.js +2 -0
  126. package/dist/node/column-views.06b0534e.js.map +1 -0
  127. package/dist/node/column-views.0859f5d2.js +2 -0
  128. package/dist/node/column-views.0859f5d2.js.map +1 -0
  129. package/dist/node/column-views.10a2bad6.js +2 -0
  130. package/dist/node/column-views.10a2bad6.js.map +1 -0
  131. package/dist/node/column-views.12a70e9d.js +2 -0
  132. package/dist/node/column-views.12a70e9d.js.map +1 -0
  133. package/dist/node/column-views.139b0855.js +2 -0
  134. package/dist/node/column-views.139b0855.js.map +1 -0
  135. package/dist/node/column-views.1a0b56fc.js +2 -0
  136. package/dist/node/column-views.1a0b56fc.js.map +1 -0
  137. package/dist/node/column-views.1de87649.js +2 -0
  138. package/dist/node/column-views.1de87649.js.map +1 -0
  139. package/dist/node/column-views.1e94d562.js +2 -0
  140. package/dist/node/column-views.1e94d562.js.map +1 -0
  141. package/dist/node/column-views.28609db2.css +2 -0
  142. package/dist/node/column-views.28609db2.css.map +1 -0
  143. package/dist/node/column-views.286d444d.js +2 -0
  144. package/dist/node/column-views.286d444d.js.map +1 -0
  145. package/dist/node/column-views.2877f398.js +2 -0
  146. package/dist/node/column-views.2877f398.js.map +1 -0
  147. package/dist/node/column-views.2a70b9a2.js +2 -0
  148. package/dist/node/column-views.2a70b9a2.js.map +1 -0
  149. package/dist/node/column-views.2e4e357d.js +2 -0
  150. package/dist/node/column-views.2e4e357d.js.map +1 -0
  151. package/dist/node/column-views.3345cd7a.js +2 -0
  152. package/dist/node/column-views.3345cd7a.js.map +1 -0
  153. package/dist/node/column-views.33752461.js +2 -0
  154. package/dist/node/column-views.33752461.js.map +1 -0
  155. package/dist/node/column-views.39d3a0be.js +2 -0
  156. package/dist/node/column-views.39d3a0be.js.map +1 -0
  157. package/dist/node/column-views.3a55ecd7.css +2 -0
  158. package/dist/node/column-views.3a55ecd7.css.map +1 -0
  159. package/dist/node/column-views.3bd09ad6.js +2 -0
  160. package/dist/node/column-views.3bd09ad6.js.map +1 -0
  161. package/dist/node/column-views.3cb3345e.js +2 -0
  162. package/dist/node/column-views.3cb3345e.js.map +1 -0
  163. package/dist/node/column-views.41876859.js +2 -0
  164. package/dist/node/column-views.41876859.js.map +1 -0
  165. package/dist/node/column-views.45168c80.js +2 -0
  166. package/dist/node/column-views.45168c80.js.map +1 -0
  167. package/dist/node/column-views.4e2bdf9b.js +2 -0
  168. package/dist/node/column-views.4e2bdf9b.js.map +1 -0
  169. package/dist/node/column-views.51fbed89.js +2 -0
  170. package/dist/node/column-views.51fbed89.js.map +1 -0
  171. package/dist/node/column-views.536dc54e.js +2 -0
  172. package/dist/node/column-views.536dc54e.js.map +1 -0
  173. package/dist/node/column-views.5b6833f0.js +2 -0
  174. package/dist/node/column-views.5b6833f0.js.map +1 -0
  175. package/dist/node/column-views.5c1b0eeb.css +2 -0
  176. package/dist/node/column-views.5c1b0eeb.css.map +1 -0
  177. package/dist/node/column-views.664dc6c9.js +2 -0
  178. package/dist/node/column-views.664dc6c9.js.map +1 -0
  179. package/dist/node/column-views.6a0a35e7.js +2 -0
  180. package/dist/node/column-views.6a0a35e7.js.map +1 -0
  181. package/dist/node/column-views.6a4c2100.css +2 -0
  182. package/dist/node/column-views.6a4c2100.css.map +1 -0
  183. package/dist/node/column-views.6a9da051.js +2 -0
  184. package/dist/node/column-views.6a9da051.js.map +1 -0
  185. package/dist/node/column-views.6b441349.js +2 -0
  186. package/dist/node/column-views.6b441349.js.map +1 -0
  187. package/dist/node/column-views.6b6b756b.js +2 -0
  188. package/dist/node/column-views.6b6b756b.js.map +1 -0
  189. package/dist/node/column-views.6bba8c57.js +2 -0
  190. package/dist/node/column-views.6bba8c57.js.map +1 -0
  191. package/dist/node/column-views.6da49480.js +2 -0
  192. package/dist/node/column-views.6da49480.js.map +1 -0
  193. package/dist/node/column-views.7350ac73.js +2 -0
  194. package/dist/node/column-views.7350ac73.js.map +1 -0
  195. package/dist/node/column-views.755f726e.js +2 -0
  196. package/dist/node/column-views.755f726e.js.map +1 -0
  197. package/dist/node/column-views.770d2c95.js +2 -0
  198. package/dist/node/column-views.770d2c95.js.map +1 -0
  199. package/dist/node/column-views.78d3f3c5.js +2 -0
  200. package/dist/node/column-views.78d3f3c5.js.map +1 -0
  201. package/dist/node/column-views.7b9bd06e.css +2 -0
  202. package/dist/node/column-views.7b9bd06e.css.map +1 -0
  203. package/dist/node/column-views.7d45bbeb.js +2 -0
  204. package/dist/node/column-views.7d45bbeb.js.map +1 -0
  205. package/dist/node/column-views.82cf7c0d.js +2 -0
  206. package/dist/node/column-views.82cf7c0d.js.map +1 -0
  207. package/dist/node/column-views.869c7199.js +2 -0
  208. package/dist/node/column-views.869c7199.js.map +1 -0
  209. package/dist/node/column-views.8c00beb4.js +2 -0
  210. package/dist/node/column-views.8c00beb4.js.map +1 -0
  211. package/dist/node/column-views.8cfed88b.js +2 -0
  212. package/dist/node/column-views.8cfed88b.js.map +1 -0
  213. package/dist/node/column-views.8f54691f.js +2 -0
  214. package/dist/node/column-views.8f54691f.js.map +1 -0
  215. package/dist/node/column-views.95411f1b.js +2 -0
  216. package/dist/node/column-views.95411f1b.js.map +1 -0
  217. package/dist/node/column-views.9cb13e51.css +2 -0
  218. package/dist/node/column-views.9cb13e51.css.map +1 -0
  219. package/dist/node/column-views.a025fbe3.js +2 -0
  220. package/dist/node/column-views.a025fbe3.js.map +1 -0
  221. package/dist/node/column-views.a0aac838.js +2 -0
  222. package/dist/node/column-views.a0aac838.js.map +1 -0
  223. package/dist/node/column-views.a501cea0.js +2 -0
  224. package/dist/node/column-views.a501cea0.js.map +1 -0
  225. package/dist/node/column-views.a8ffe072.js +2 -0
  226. package/dist/node/column-views.a8ffe072.js.map +1 -0
  227. package/dist/node/column-views.aff245a8.js +2 -0
  228. package/dist/node/column-views.aff245a8.js.map +1 -0
  229. package/dist/node/column-views.b169b4b5.css +2 -0
  230. package/dist/node/column-views.b169b4b5.css.map +1 -0
  231. package/dist/node/column-views.b773edb8.js +2 -0
  232. package/dist/node/column-views.b773edb8.js.map +1 -0
  233. package/dist/node/column-views.c968a185.css +2 -0
  234. package/dist/node/column-views.c968a185.css.map +1 -0
  235. package/dist/node/column-views.cd3c430b.js +2 -0
  236. package/dist/node/column-views.cd3c430b.js.map +1 -0
  237. package/dist/node/column-views.cd468adb.css +2 -0
  238. package/dist/node/column-views.cd468adb.css.map +1 -0
  239. package/dist/node/column-views.cdcce702.js +2 -0
  240. package/dist/node/column-views.cdcce702.js.map +1 -0
  241. package/dist/node/column-views.ce6808fe.js +2 -0
  242. package/dist/node/column-views.ce6808fe.js.map +1 -0
  243. package/dist/node/column-views.cf90f63d.js +2 -0
  244. package/dist/node/column-views.cf90f63d.js.map +1 -0
  245. package/dist/node/column-views.d6708353.js +2 -0
  246. package/dist/node/column-views.d6708353.js.map +1 -0
  247. package/dist/node/column-views.d9bbd6fb.css +2 -0
  248. package/dist/node/column-views.d9bbd6fb.css.map +1 -0
  249. package/dist/node/column-views.e6720522.js +2 -0
  250. package/dist/node/column-views.e6720522.js.map +1 -0
  251. package/dist/node/column-views.e7e26765.js +2 -0
  252. package/dist/node/column-views.e7e26765.js.map +1 -0
  253. package/dist/node/column-views.e9515ec1.js +2 -0
  254. package/dist/node/column-views.e9515ec1.js.map +1 -0
  255. package/dist/node/column-views.ebb44b7d.js +2 -0
  256. package/dist/node/column-views.ebb44b7d.js.map +1 -0
  257. package/dist/node/column-views.ecc2394a.js +2 -0
  258. package/dist/node/column-views.ecc2394a.js.map +1 -0
  259. package/dist/node/column-views.eea80478.js +2 -0
  260. package/dist/node/column-views.eea80478.js.map +1 -0
  261. package/dist/node/column-views.f7315cbc.css +2 -0
  262. package/dist/node/column-views.f7315cbc.css.map +1 -0
  263. package/dist/node/column-views.f76ba19f.js +2 -0
  264. package/dist/node/column-views.f76ba19f.js.map +1 -0
  265. package/dist/node/column-views.fdaa2963.js +2 -0
  266. package/dist/node/column-views.fdaa2963.js.map +1 -0
  267. package/dist/node/column-views.fea32686.js +2 -0
  268. package/dist/node/column-views.fea32686.js.map +1 -0
  269. package/dist/node/index.js +1 -1
  270. package/dist/node/index.js.map +1 -1
  271. package/package.json +16 -15
  272. package/src/age-axis.module.sass +20 -0
  273. package/src/age-axis.ts +25 -3
  274. package/src/age-model-overlay.ts +2 -2
  275. package/src/column.module.sass +3 -3
  276. package/src/column.ts +92 -19
  277. package/src/correlation-chart/main.ts +25 -12
  278. package/src/correlation-chart/prepare-data.ts +6 -6
  279. package/src/correlation-chart/stories/correlation-chart.stories.ts +12 -6
  280. package/src/data-provider/base.ts +20 -11
  281. package/src/data-provider/column-nav.ts +2 -2
  282. package/src/data-provider/fetch.ts +9 -9
  283. package/src/data-provider/store.ts +15 -10
  284. package/src/{carbon-isotopes → facets/carbon-isotopes}/data-area.ts +5 -4
  285. package/src/{carbon-isotopes → facets/carbon-isotopes}/index.ts +0 -1
  286. package/src/facets/carbon-isotopes/isotopes-column.module.sass +31 -0
  287. package/src/{carbon-isotopes → facets/carbon-isotopes}/isotopes-column.ts +119 -87
  288. package/src/facets/detrital-zircon/index.module.sass +22 -0
  289. package/src/facets/detrital-zircon/index.ts +132 -0
  290. package/src/facets/detrital-zircon/provider.ts +51 -0
  291. package/src/facets/fossils/index.module.sass +14 -0
  292. package/src/facets/fossils/index.ts +120 -0
  293. package/src/facets/fossils/provider.ts +80 -0
  294. package/src/facets/index.ts +3 -0
  295. package/src/index.ts +2 -1
  296. package/src/maps/_shared/inset-map.stories.ts +1 -1
  297. package/src/maps/_shared/inset-map.ts +2 -2
  298. package/src/maps/_shared/styles.ts +3 -1
  299. package/src/maps/column-correlation/column-correlation-map.stories.ts +3 -3
  300. package/src/maps/column-correlation/core.ts +17 -26
  301. package/src/maps/column-correlation/state.ts +9 -9
  302. package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +177 -1
  303. package/src/maps/column-navigation/mapbox/index.ts +18 -15
  304. package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +4 -4
  305. package/src/maps/column-navigation/mapbox/state.ts +16 -6
  306. package/src/maps/column-navigation/svg/animated.ts +2 -2
  307. package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +2 -2
  308. package/src/maps/column-navigation/svg/index.ts +2 -4
  309. package/src/maps/column-navigation/svg/layers.ts +5 -7
  310. package/src/maps/column-navigation/utils/keyboard-navigation.ts +1 -1
  311. package/src/notes.ts +49 -0
  312. package/src/prepare-units/composite-scale.ts +73 -25
  313. package/src/prepare-units/helpers.ts +78 -13
  314. package/src/prepare-units/index.ts +17 -17
  315. package/src/prepare-units/utils.ts +7 -7
  316. package/src/section.ts +8 -8
  317. package/src/unit-details/panel.ts +100 -17
  318. package/src/unit-details/popover.ts +5 -5
  319. package/src/units/boxes.ts +20 -10
  320. package/src/units/colors.ts +12 -5
  321. package/src/units/composite.ts +16 -11
  322. package/src/units/index.ts +77 -10
  323. package/src/units/names.ts +19 -16
  324. package/src/units/resolvers.ts +3 -0
  325. package/src/units/selection.ts +44 -11
  326. package/src/units/types.ts +2 -0
  327. package/dist/esm/column-views.062d164a.js +0 -86
  328. package/dist/esm/column-views.062d164a.js.map +0 -1
  329. package/dist/esm/column-views.07521ce6.js +0 -25
  330. package/dist/esm/column-views.07521ce6.js.map +0 -1
  331. package/dist/esm/column-views.1c589cc4.js.map +0 -1
  332. package/dist/esm/column-views.1ece326b.js.map +0 -1
  333. package/dist/esm/column-views.1edc7300.js.map +0 -1
  334. package/dist/esm/column-views.240ef158.css.map +0 -1
  335. package/dist/esm/column-views.28ee5f43.js.map +0 -1
  336. package/dist/esm/column-views.30646469.js.map +0 -1
  337. package/dist/esm/column-views.33dbc778.js.map +0 -1
  338. package/dist/esm/column-views.343b5aa2.js +0 -98
  339. package/dist/esm/column-views.343b5aa2.js.map +0 -1
  340. package/dist/esm/column-views.34636ec7.js.map +0 -1
  341. package/dist/esm/column-views.3bec70d6.js.map +0 -1
  342. package/dist/esm/column-views.3f4db8cb.js +0 -117
  343. package/dist/esm/column-views.3f4db8cb.js.map +0 -1
  344. package/dist/esm/column-views.40c1f361.js.map +0 -1
  345. package/dist/esm/column-views.4c4c5bac.js.map +0 -1
  346. package/dist/esm/column-views.57c4ddf3.js.map +0 -1
  347. package/dist/esm/column-views.5c02fee2.js.map +0 -1
  348. package/dist/esm/column-views.650bd9f5.js.map +0 -1
  349. package/dist/esm/column-views.68409161.js.map +0 -1
  350. package/dist/esm/column-views.86c4b36f.js.map +0 -1
  351. package/dist/esm/column-views.8dd877af.js.map +0 -1
  352. package/dist/esm/column-views.8e51206e.js.map +0 -1
  353. package/dist/esm/column-views.94b5cca1.js +0 -34
  354. package/dist/esm/column-views.94b5cca1.js.map +0 -1
  355. package/dist/esm/column-views.9804efda.js.map +0 -1
  356. package/dist/esm/column-views.9ced149e.js.map +0 -1
  357. package/dist/esm/column-views.a7be0a4a.css +0 -157
  358. package/dist/esm/column-views.a7be0a4a.css.map +0 -1
  359. package/dist/esm/column-views.aa9fcdba.js.map +0 -1
  360. package/dist/esm/column-views.ac9fb5e1.js +0 -163
  361. package/dist/esm/column-views.ac9fb5e1.js.map +0 -1
  362. package/dist/esm/column-views.c58aad3f.js +0 -88
  363. package/dist/esm/column-views.c58aad3f.js.map +0 -1
  364. package/dist/esm/column-views.d1ad48eb.js +0 -11
  365. package/dist/esm/column-views.d1ad48eb.js.map +0 -1
  366. package/dist/esm/column-views.dff52504.js.map +0 -1
  367. package/dist/esm/column-views.e2b9c23c.css.map +0 -1
  368. package/dist/esm/column-views.e77b9d6b.js.map +0 -1
  369. package/dist/esm/column-views.ea237aa8.js.map +0 -1
  370. package/dist/esm/column-views.f71ec4b4.js.map +0 -1
  371. package/dist/esm/column-views.fa6f3292.js.map +0 -1
  372. package/src/carbon-isotopes/column.module.sass +0 -136
  373. package/src/carbon-isotopes/column.ts +0 -133
  374. package/src/carbon-isotopes/core.ts +0 -81
  375. /package/src/{carbon-isotopes → facets/carbon-isotopes}/data-provider.ts +0 -0
@@ -35,7 +35,7 @@ export function ColumnKeyboardNavigation(props: KeyboardNavProps) {
35
35
  };
36
36
 
37
37
  const currentIndex = columns.findIndex(
38
- (d) => d.properties.col_id == col_id
38
+ (d) => d.properties.col_id == col_id,
39
39
  );
40
40
 
41
41
  const neighbors = voronoi.tri.delaunay.neighbors[currentIndex];
@@ -43,7 +43,7 @@ export function ColumnKeyboardNavigation(props: KeyboardNavProps) {
43
43
  neighbors,
44
44
  voronoi.centroids,
45
45
  currentIndex,
46
- projection
46
+ projection,
47
47
  );
48
48
  }, [col_id, columns, voronoi, map]);
49
49
 
@@ -58,7 +58,7 @@ export function ColumnKeyboardNavigation(props: KeyboardNavProps) {
58
58
  selectColumn(columns[nextColumnIx].id);
59
59
  return false;
60
60
  },
61
- [keyMapping, selectColumn]
61
+ [keyMapping, selectColumn],
62
62
  );
63
63
 
64
64
  useEffect(() => {
@@ -80,7 +80,7 @@ export function ColumnKeyboardNavigation(props: KeyboardNavProps) {
80
80
  features,
81
81
  });
82
82
  },
83
- [voronoi, showTriangulation]
83
+ [voronoi, showTriangulation],
84
84
  );
85
85
 
86
86
  //if (neighbors == null) return null;
@@ -6,6 +6,7 @@ import {
6
6
  useContext,
7
7
  ReactNode,
8
8
  useEffect,
9
+ useMemo,
9
10
  } from "react";
10
11
  import h from "@macrostrat/hyper";
11
12
  import {
@@ -27,18 +28,20 @@ export interface NavigationProviderProps {
27
28
  selectedColumn?: number | null;
28
29
  hoveredColumn?: number | null;
29
30
  columns?: ColumnGeoJSONRecordWithID[] | null;
31
+ columnIDs?: number[] | null;
30
32
  children: ReactNode;
31
33
  onSelectColumn?: (col_id: number | null, column: any) => void;
32
34
  onHoverColumn?: (col_id: number | null, column: any) => void;
33
35
  }
34
36
 
35
37
  const NavigationStoreContext = createContext<StoreApi<NavigationStore> | null>(
36
- null
38
+ null,
37
39
  );
38
40
 
39
41
  export function ColumnNavigationProvider({
40
42
  children,
41
43
  columns,
44
+ columnIDs,
42
45
  selectedColumn,
43
46
  projectID,
44
47
  inProcess,
@@ -76,17 +79,24 @@ export function ColumnNavigationProvider({
76
79
  // store.setState({ columns: _columns, selectedColumn });
77
80
  // }, [projectID, inProcess, columns, getColumns]);
78
81
 
79
- const _columns = columns ?? useMacrostratColumns(projectID, inProcess);
82
+ let _columns = columns ?? useMacrostratColumns(projectID, inProcess);
83
+
84
+ // filter columns if specified
85
+ if (columnIDs?.length > 0) {
86
+ _columns = useMemo(() => {
87
+ return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));
88
+ }, [columnIDs, _columns]);
89
+ }
90
+
80
91
  useEffect(() => {
81
- if (_columns != null) {
92
+ if (_columns?.length > 0) {
82
93
  store.setState({ columns: _columns, selectedColumn });
83
94
  }
84
95
  }, [_columns]);
85
- // Update selected colun if it is changed externally
96
+ // Update selected column if it is changed externally
86
97
 
87
98
  // Kind of an awkward way to do this but we need to allow the selector to run
88
99
  useEffect(() => {
89
- console.log("Selecting column", selectedColumn);
90
100
  const { selectColumn, selectedColumn: _internalSelectedColumn } =
91
101
  store.getState();
92
102
  if (selectedColumn == _internalSelectedColumn) {
@@ -99,7 +109,7 @@ export function ColumnNavigationProvider({
99
109
  }
100
110
 
101
111
  export function useColumnNavigationStore(
102
- selector: (state: NavigationStore) => any
112
+ selector: (state: NavigationStore) => any,
103
113
  ) {
104
114
  const storeApi = useContext(NavigationStoreContext);
105
115
  if (storeApi == null) {
@@ -48,7 +48,7 @@ const MapViewFrame = (props) => {
48
48
  setExpanded(true);
49
49
  },
50
50
  },
51
- [h(LandLayer), children]
51
+ [h(LandLayer), children],
52
52
  ),
53
53
  h.if(expanded)(Button, {
54
54
  className: "close-button",
@@ -60,7 +60,7 @@ const MapViewFrame = (props) => {
60
60
  intent: "danger",
61
61
  }),
62
62
  ]),
63
- ]
63
+ ],
64
64
  );
65
65
  };
66
66
 
@@ -1,6 +1,6 @@
1
1
  import h from "@macrostrat/hyper";
2
2
 
3
- import { Meta } from "@storybook/react";
3
+ import { Meta } from "@storybook/react-vite";
4
4
  import { ColumnNavigationSVGMap, ColumnNavigationSVGMapProps } from ".";
5
5
  import { MacrostratDataProvider } from "../../../data-provider";
6
6
  import { useState } from "react";
@@ -12,7 +12,7 @@ interface ColumnIndexMapProps extends ColumnNavigationSVGMapProps {
12
12
  function BasicColumnNavigationSVGMap(props: ColumnIndexMapProps) {
13
13
  return h(
14
14
  MacrostratDataProvider,
15
- h(ColumnNavigationSVGMap, { style: { width: 500, height: 500 }, ...props })
15
+ h(ColumnNavigationSVGMap, { style: { width: 500, height: 500 }, ...props }),
16
16
  );
17
17
  }
18
18
 
@@ -41,7 +41,7 @@ export function ResizableMapFrame(props) {
41
41
  ...rest,
42
42
  scale,
43
43
  },
44
- [h(LandLayer), children]
44
+ [h(LandLayer), children],
45
45
  ),
46
46
  ]);
47
47
  }
@@ -70,8 +70,6 @@ export function ColumnNavigationSVGMap(props) {
70
70
  _center = geoCentroid(currentColumn);
71
71
  }
72
72
 
73
- console.log(currentColumn);
74
-
75
73
  return h(
76
74
  ResizableMapFrame,
77
75
  { center: _center, style, margin, scale, className },
@@ -91,7 +89,7 @@ export function ColumnNavigationSVGMap(props) {
91
89
  ...rest,
92
90
  }),
93
91
  h.if(currentColumn != null)(CurrentColumn, { feature: currentColumn }),
94
- ]
92
+ ],
95
93
  );
96
94
  }
97
95
 
@@ -32,7 +32,7 @@ export function MeasurementsLayer(props) {
32
32
  return h(FeatureLayer, {
33
33
  useCanvas: false,
34
34
  style,
35
- features: res.features.filter((d) => d.properties.unit_id != null),
35
+ features: res.features?.filter((d) => d.properties.unit_id != null) ?? [],
36
36
  });
37
37
  }
38
38
 
@@ -48,8 +48,6 @@ function ColumnFeatures(props) {
48
48
  singleFeature = true,
49
49
  } = props;
50
50
 
51
- console.log(features);
52
-
53
51
  const c = chroma(color);
54
52
 
55
53
  return h(
@@ -62,13 +60,13 @@ function ColumnFeatures(props) {
62
60
  stroke: c.alpha(0.4).css(),
63
61
  },
64
62
  },
65
- features.map((f) => {
63
+ features?.map((f) => {
66
64
  return h(Feature, {
67
65
  id: f.id ?? f.properties.col_id,
68
66
  onClick,
69
67
  feature: f,
70
68
  });
71
- })
69
+ }),
72
70
  );
73
71
  }
74
72
 
@@ -100,7 +98,7 @@ function ColumnKeyboardNavigation(props: KeyboardNavProps) {
100
98
  const { projection } = useContext(MapContext);
101
99
  const { centroids, tri } = useMemo(
102
100
  () => buildTriangulation(features),
103
- [features]
101
+ [features],
104
102
  );
105
103
 
106
104
  const currentIndex = useMemo(() => {
@@ -120,7 +118,7 @@ function ColumnKeyboardNavigation(props: KeyboardNavProps) {
120
118
  // @ts-ignore
121
119
  onChange(features[nextColumnIx]);
122
120
  },
123
- [keyMapping]
121
+ [keyMapping],
124
122
  );
125
123
 
126
124
  if (neighbors == null) return null;
@@ -5,7 +5,7 @@ export function buildKeyMapping(
5
5
  neighbors,
6
6
  centroids,
7
7
  currentIndex,
8
- projection
8
+ projection,
9
9
  ) {
10
10
  if (neighbors == null) return;
11
11
 
package/src/notes.ts ADDED
@@ -0,0 +1,49 @@
1
+ import h from "@macrostrat/hyper";
2
+
3
+ import { ColumnNotesProvider } from "./units";
4
+
5
+ import { StaticNotesColumn, SVG } from "@macrostrat/column-components";
6
+ import { useCompositeScale, useMacrostratColumnData } from "./data-provider";
7
+ import type { ReactNode } from "react";
8
+
9
+ interface ColumnNotesProps {
10
+ notes: any[];
11
+ width?: number;
12
+ noteComponent?: any;
13
+ paddingLeft?: number;
14
+ deltaConnectorAttachment?: number;
15
+ children?: ReactNode;
16
+ }
17
+
18
+ export function ColumnNotes({
19
+ notes,
20
+ width = 200,
21
+ noteComponent,
22
+ paddingLeft = 60,
23
+ deltaConnectorAttachment,
24
+ children,
25
+ }: ColumnNotesProps) {
26
+ const { totalHeight } = useMacrostratColumnData();
27
+ const scale = useCompositeScale();
28
+
29
+ return h(
30
+ ColumnNotesProvider,
31
+ {
32
+ scale,
33
+ totalHeight,
34
+ pixelScale: -1,
35
+ },
36
+ [
37
+ h(SVG, { width, height: totalHeight, paddingH: 4 }, [
38
+ h(StaticNotesColumn, {
39
+ width,
40
+ notes,
41
+ noteComponent,
42
+ paddingLeft,
43
+ deltaConnectorAttachment,
44
+ }),
45
+ ]),
46
+ children,
47
+ ],
48
+ );
49
+ }
@@ -77,7 +77,7 @@ export interface CompositeColumnData<T extends UnitLong = ExtUnit>
77
77
 
78
78
  export function buildCompositeScaleInfo(
79
79
  inputScales: LinearScaleDef[],
80
- unconformityHeight: number
80
+ unconformityHeight: number,
81
81
  ): CompositeScaleData {
82
82
  /** Finalize the heights of sections, including the heights of unconformities
83
83
  * between them.
@@ -112,7 +112,7 @@ export function buildCompositeScaleInfo(
112
112
 
113
113
  export function finalizeSectionHeights<T extends UnitLong>(
114
114
  sections: SectionInfoWithScale<T>[],
115
- unconformityHeight: number
115
+ unconformityHeight: number,
116
116
  ): CompositeColumnData<T> {
117
117
  /** Finalize the heights of sections, including the heights of unconformities
118
118
  * between them.
@@ -121,7 +121,7 @@ export function finalizeSectionHeights<T extends UnitLong>(
121
121
  const sectionScales = sections.map((d) => d.scaleInfo);
122
122
  const { totalHeight, sections: packages } = buildCompositeScaleInfo(
123
123
  sectionScales,
124
- unconformityHeight
124
+ unconformityHeight,
125
125
  );
126
126
 
127
127
  // This could perhaps be simplified.
@@ -148,7 +148,7 @@ interface SectionInfoWithScale<T extends UnitLong = ExtUnit>
148
148
 
149
149
  export function computeSectionHeights<T extends UnitLong>(
150
150
  sections: SectionInfo<T>[],
151
- opts: ColumnScaleOptions
151
+ opts: ColumnScaleOptions,
152
152
  ): SectionInfoWithScale<T>[] {
153
153
  return sections.map((group) => {
154
154
  return addScaleToSection<T>(group, opts);
@@ -157,7 +157,7 @@ export function computeSectionHeights<T extends UnitLong>(
157
157
 
158
158
  function addScaleToSection<T extends UnitLong = ExtUnit>(
159
159
  group: SectionInfo<T>,
160
- opts: ColumnScaleOptions
160
+ opts: ColumnScaleOptions,
161
161
  ): SectionInfoWithScale<T> {
162
162
  const { t_age, b_age, units } = group;
163
163
  let _range = null;
@@ -179,7 +179,7 @@ function addScaleToSection<T extends UnitLong = ExtUnit>(
179
179
 
180
180
  function buildSectionScale<T extends UnitLong>(
181
181
  data: T[],
182
- opts: SectionScaleOptions
182
+ opts: SectionScaleOptions,
183
183
  ): PackageScaleInfo {
184
184
  const {
185
185
  targetUnitHeight = 20,
@@ -216,7 +216,7 @@ function buildSectionScale<T extends UnitLong>(
216
216
 
217
217
  export function createPackageScale(
218
218
  def: LinearScaleDef,
219
- offset: number = 0
219
+ offset: number = 0,
220
220
  ): PackageScaleInfo {
221
221
  /** Build a section scale */
222
222
  // Domain should be oriented from bottom to top, but scale is oriented from top to bottom
@@ -234,7 +234,7 @@ export function createPackageScale(
234
234
 
235
235
  function findSectionHeightRange(
236
236
  data: UnitLong[],
237
- axisType: ColumnAxisType
237
+ axisType: ColumnAxisType,
238
238
  ): [number, number] {
239
239
  if (axisType == null) {
240
240
  throw new Error("Axis type is not set");
@@ -259,7 +259,7 @@ function findSectionHeightRange(
259
259
 
260
260
  function findAverageUnitHeight(
261
261
  data: UnitLong[],
262
- axisType: ColumnAxisType
262
+ axisType: ColumnAxisType,
263
263
  ): number {
264
264
  const unitHeights = data.map((d) => {
265
265
  const [b_pos, t_pos] = getUnitHeightRange(d, axisType);
@@ -268,15 +268,22 @@ function findAverageUnitHeight(
268
268
  return unitHeights.reduce((a, b) => a + b, 0) / unitHeights.length;
269
269
  }
270
270
 
271
+ export interface CompositeColumnScale {
272
+ (age: number): number | null;
273
+ copy(): CompositeColumnScale;
274
+ domain(): [number, number];
275
+ invert(pixelHeight: number): number | null;
276
+ }
277
+
271
278
  export function createCompositeScale(
272
279
  sections: PackageLayoutData[],
273
- interpolateUnconformities: boolean = false
274
- ): (age: number) => number | null {
280
+ interpolateUnconformities: boolean = false,
281
+ ): CompositeColumnScale {
275
282
  /** Create a scale that works across multiple packages */
276
283
  // Get surfaces at which scale breaks
277
284
  let scaleBreaks: [number, number][] = [];
278
285
  for (const section of sections) {
279
- const { pixelHeight, pixelScale, offset, domain } = section.scaleInfo;
286
+ const { pixelHeight, offset, domain } = section.scaleInfo;
280
287
 
281
288
  scaleBreaks.push([domain[1], offset]);
282
289
  scaleBreaks.push([domain[0], offset + pixelHeight]);
@@ -284,32 +291,73 @@ export function createCompositeScale(
284
291
  // Sort the scale breaks by age
285
292
  scaleBreaks.sort((a, b) => a[0] - b[0]);
286
293
 
287
- return (age) => {
288
- /** Given an age, find the corresponding pixel position */
289
- // Iterate through the sections to find the correct one
290
-
294
+ const scale = (age) => {
291
295
  // Accumulate scale breaks and pixel height
292
- let pixelHeight = 0;
293
- let pixelScale = 0;
296
+ let lastHeight = 0;
294
297
  let lastAge = null;
295
298
  for (const [age1, height] of scaleBreaks) {
296
299
  if (age <= age1) {
297
- if (lastAge != null) {
298
- pixelHeight += (age - lastAge) * pixelScale;
299
- return pixelHeight;
300
+ let deltaAge = age1 - lastAge;
301
+ if (deltaAge === 0) {
302
+ // If the age is exactly at a scale break, return the height at that break
303
+ return height;
300
304
  }
301
- lastAge = age;
302
- pixelHeight = height;
305
+ let pixelScale = (height - lastHeight) / deltaAge;
306
+ return lastHeight + (age - lastAge) * pixelScale;
303
307
  }
308
+ lastAge = age1;
309
+ lastHeight = height;
304
310
  }
305
311
  };
312
+
313
+ scale.copy = () => {
314
+ return createCompositeScale(sections, interpolateUnconformities);
315
+ };
316
+
317
+ scale.domain = () => {
318
+ /** Return the domain of the scale */
319
+ const firstSection = sections[0].scaleInfo.domain;
320
+ const lastSection = sections[sections.length - 1].scaleInfo.domain;
321
+ if (firstSection[0] < lastSection[0]) {
322
+ return [Math.min(...firstSection), Math.max(...lastSection)];
323
+ } else {
324
+ // Catches "normal" axes like height
325
+ return [Math.max(...firstSection), Math.min(...lastSection)];
326
+ }
327
+ };
328
+
329
+ scale.invert = (pixelHeight) => {
330
+ /** Invert the scale to get the age at a given pixel height */
331
+ // Iterate through the sections to find the correct one
332
+ let lastAge = null;
333
+ for (const section of sections) {
334
+ const {
335
+ pixelHeight: sectionHeight,
336
+ pixelScale,
337
+ offset,
338
+ domain,
339
+ } = section.scaleInfo;
340
+ if (
341
+ pixelHeight >= offset &&
342
+ pixelHeight <= offset + sectionHeight &&
343
+ pixelScale > 0
344
+ ) {
345
+ const age = domain[1] + (pixelHeight - offset) / pixelScale;
346
+ return age;
347
+ }
348
+ lastAge = domain[1];
349
+ }
350
+ return null;
351
+ };
352
+
353
+ return scale as CompositeColumnScale;
306
354
  }
307
355
 
308
356
  /** Collapse sections separated by unconformities that are smaller than a given pixel height. */
309
357
  export function collapseUnconformitiesByPixelHeight<T extends UnitLong>(
310
358
  sections: SectionInfoWithScale<T>[],
311
359
  threshold: number,
312
- opts: ColumnScaleOptions
360
+ opts: ColumnScaleOptions,
313
361
  ): SectionInfoWithScale<T>[] {
314
362
  const newSections = [];
315
363
  let currentSection: SectionInfoWithScale<T> | null = null;
@@ -323,7 +371,7 @@ export function collapseUnconformitiesByPixelHeight<T extends UnitLong>(
323
371
  dAge *
324
372
  Math.max(
325
373
  currentSection.scaleInfo.pixelScale,
326
- nextSection.scaleInfo.pixelScale
374
+ nextSection.scaleInfo.pixelScale,
327
375
  );
328
376
  if (pxHeight < threshold) {
329
377
  // We need to merge the sections
@@ -7,7 +7,9 @@ import {
7
7
  createUnitSorter,
8
8
  ensureArray,
9
9
  ensureRealFloat,
10
+ PossiblyClippedUnit,
10
11
  } from "./utils";
12
+ import { compareAgeRanges } from "@macrostrat/stratigraphy-utils";
11
13
 
12
14
  const dt = 0.001;
13
15
 
@@ -38,14 +40,14 @@ export interface ExtUnit extends UnitLong {
38
40
 
39
41
  export function preprocessUnits<T extends UnitLong = UnitLong>(
40
42
  section: SectionInfo<T>,
41
- axisType: ColumnAxisType = ColumnAxisType.AGE
43
+ axisType: ColumnAxisType = ColumnAxisType.AGE,
42
44
  ): ExtUnit[] {
43
45
  /** Preprocess units to add overlapping units and columns. */
44
46
  const units = section.units;
45
47
  let divisions = units.map((...args) => extendDivision(...args, axisType));
46
48
  for (let d of divisions) {
47
49
  const overlappingUnits = divisions.filter((u) =>
48
- d.overlappingUnits.includes(u.unit_id)
50
+ d.overlappingUnits.includes(u.unit_id),
49
51
  );
50
52
 
51
53
  // Overlapping columns
@@ -72,10 +74,12 @@ export function preprocessUnits<T extends UnitLong = UnitLong>(
72
74
  }
73
75
  }
74
76
 
75
- if (axisType != ColumnAxisType.AGE) {
76
- return preprocessSectionUnits(divisions, axisType);
77
- }
78
-
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
+ //
79
83
  return divisions;
80
84
  }
81
85
 
@@ -83,10 +87,10 @@ function extendDivision(
83
87
  unit: UnitLong,
84
88
  i: number,
85
89
  divisions: UnitLong[],
86
- axisType: ColumnAxisType = ColumnAxisType.AGE
90
+ axisType: ColumnAxisType = ColumnAxisType.AGE,
87
91
  ): ExtUnit {
88
92
  const overlappingUnits = divisions.filter(
89
- (d) => d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType)
93
+ (d) => d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType),
90
94
  );
91
95
  const u_pos = getUnitHeightRange(unit, axisType);
92
96
  const bottomOverlap = overlappingUnits.some((d) => {
@@ -109,8 +113,15 @@ function extendDivision(
109
113
 
110
114
  export function groupUnitsIntoSections<T extends UnitLong>(
111
115
  units: T[],
112
- axisType: ColumnAxisType = ColumnAxisType.AGE
116
+ axisType: ColumnAxisType = ColumnAxisType.AGE,
113
117
  ): SectionInfo<T>[] {
118
+ if (axisType != ColumnAxisType.AGE) {
119
+ return groupUnitsIntoSectionByOverlap(units, axisType);
120
+ }
121
+
122
+ /** Group units into sections by section_id.
123
+ * This works for large-scale Macrostrat columns, where units are grouped by section_id.
124
+ * */
114
125
  let groups = Array.from(group(units, (d) => d.section_id));
115
126
  const unitComparator = createUnitSorter(axisType);
116
127
 
@@ -124,12 +135,66 @@ export function groupUnitsIntoSections<T extends UnitLong>(
124
135
  // Sections have no relative ordinal position other than age...
125
136
  const compareSections = createUnitSorter(ColumnAxisType.AGE) as (
126
137
  a: StratigraphicPackage,
127
- b: StratigraphicPackage
138
+ b: StratigraphicPackage,
128
139
  ) => number;
129
140
  groups1.sort(compareSections);
130
141
  return groups1;
131
142
  }
132
143
 
144
+ interface WorkingSection {
145
+ units: UnitLong[];
146
+ // Position or age
147
+ heightRange?: [number, number];
148
+ }
149
+
150
+ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
151
+ units: T[],
152
+ axisType: ColumnAxisType = ColumnAxisType.AGE,
153
+ ): SectionInfo<T>[] {
154
+ /** Group units into sections by overlap.
155
+ * This creates "synthetic" sections that correspond to packages bound by scale gaps.
156
+ * This is most useful in the height and depth domains, where gaps (e.g., missing core) are
157
+ * common.
158
+ * */
159
+ // Start with each unit as its own "section", and progressively merge...
160
+ const sectionList: WorkingSection[] = [];
161
+ for (const unit of units) {
162
+ // Check if the unit overlaps with any existing section
163
+ const heightRange = getUnitHeightRange(unit, axisType);
164
+ let section: WorkingSection | undefined = sectionList.find((s) =>
165
+ compareAgeRanges(heightRange, s.heightRange),
166
+ );
167
+ if (section == null) {
168
+ // No overlap, create a new section
169
+ sectionList.push({
170
+ heightRange,
171
+ units: [unit],
172
+ });
173
+ } else {
174
+ // Overlap, merge the unit into the section
175
+ section.units.push(unit);
176
+ // Update the height range
177
+ section.heightRange = [
178
+ Math.max(section.heightRange[0], heightRange[0]),
179
+ Math.min(section.heightRange[1], heightRange[1]),
180
+ ];
181
+ }
182
+ }
183
+ // We should have a section for each unit, now we can convert to SectionInfo
184
+ // Ages have to be really actually ages, not heights
185
+
186
+ return sectionList.map((section, i) => {
187
+ const [b_age, t_age] = getSectionAgeRange(section.units);
188
+ return {
189
+ // Negative section IDs are used to indicate that these are synthetic sections
190
+ section_id: -i,
191
+ t_age: t_age,
192
+ b_age: b_age,
193
+ units: section.units as T[],
194
+ };
195
+ });
196
+ }
197
+
133
198
  export function getSectionAgeRange(units: BaseUnit[]): [number, number] {
134
199
  /** Get the overall age range of a set of units. */
135
200
  const t_ages = units.map((d) => d.t_age);
@@ -140,7 +205,7 @@ export function getSectionAgeRange(units: BaseUnit[]): [number, number] {
140
205
  }
141
206
 
142
207
  export function mergeOverlappingSections<T extends UnitLong>(
143
- sections: SectionInfo<T>[]
208
+ sections: SectionInfo<T>[],
144
209
  ): SectionInfo<T>[] {
145
210
  /** Columns can have sections that overlap in time. Here, we merge overlapping
146
211
  * sections into a single section to correctly render gap-bound packages.
@@ -172,7 +237,7 @@ export function mergeOverlappingSections<T extends UnitLong>(
172
237
 
173
238
  function preprocessSectionUnits(
174
239
  units: UnitLong[],
175
- axisType: ColumnAxisType = ColumnAxisType.DEPTH
240
+ axisType: ColumnAxisType = ColumnAxisType.DEPTH,
176
241
  ): ExtUnit[] {
177
242
  /** Preprocess units for a "section" column type, which is guaranteed to be simpler. */
178
243
  // We have to assume the units are ordered...
@@ -189,7 +254,7 @@ function preprocessSectionUnit(
189
254
  i: number,
190
255
  units: UnitLong[],
191
256
  accumulatedThickness: number = 0,
192
- axisType: ColumnAxisType = ColumnAxisType.DEPTH
257
+ axisType: ColumnAxisType = ColumnAxisType.DEPTH,
193
258
  ): ExtUnit {
194
259
  /** Preprocess a single unit for a "section" column type.
195
260
  * No provision for overlapping units.