@macrostrat/column-views 2.2.2 → 2.3.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 (276) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/esm/{column-views.b0e6c0b3.js → column-views.04636815.js} +3 -3
  3. package/dist/esm/{column-views.b0e6c0b3.js.map → column-views.04636815.js.map} +1 -1
  4. package/dist/esm/{column-views.54f8b909.js → column-views.052498a6.js} +37 -4
  5. package/dist/esm/column-views.052498a6.js.map +1 -0
  6. package/dist/esm/{column-views.5456a1ee.js → column-views.0da4503a.js} +2 -2
  7. package/dist/esm/{column-views.5456a1ee.js.map → column-views.0da4503a.js.map} +1 -1
  8. package/dist/esm/{column-views.ee525e88.js → column-views.107b47b4.js} +8 -8
  9. package/dist/esm/{column-views.ee525e88.js.map → column-views.107b47b4.js.map} +1 -1
  10. package/dist/esm/column-views.17a70358.js +16 -0
  11. package/dist/esm/column-views.17a70358.js.map +1 -0
  12. package/dist/esm/{column-views.073c42da.js → column-views.1b5bf0c6.js} +3 -3
  13. package/dist/esm/{column-views.073c42da.js.map → column-views.1b5bf0c6.js.map} +1 -1
  14. package/dist/esm/{column-views.52ad973a.js → column-views.2708e176.js} +8 -8
  15. package/dist/esm/column-views.2708e176.js.map +1 -0
  16. package/dist/esm/{column-views.88d63dd0.js → column-views.275ba52b.js} +3 -3
  17. package/dist/esm/{column-views.88d63dd0.js.map → column-views.275ba52b.js.map} +1 -1
  18. package/dist/esm/{column-views.7c95c3d7.js → column-views.2bac03a2.js} +2 -2
  19. package/dist/esm/{column-views.7c95c3d7.js.map → column-views.2bac03a2.js.map} +1 -1
  20. package/dist/esm/column-views.2c45a7b5.js.map +1 -1
  21. package/dist/esm/column-views.322790f3.js +138 -0
  22. package/dist/esm/column-views.322790f3.js.map +1 -0
  23. package/dist/esm/{column-views.6698b95a.js → column-views.343fc926.js} +9 -18
  24. package/dist/esm/column-views.343fc926.js.map +1 -0
  25. package/dist/esm/{column-views.aeb61926.js → column-views.3d3e00be.js} +2 -2
  26. package/dist/esm/{column-views.aeb61926.js.map → column-views.3d3e00be.js.map} +1 -1
  27. package/dist/esm/{column-views.7d69838d.js → column-views.40094dd9.js} +3 -3
  28. package/dist/esm/{column-views.7d69838d.js.map → column-views.40094dd9.js.map} +1 -1
  29. package/dist/esm/{column-views.d2214a99.js → column-views.44373a90.js} +8 -7
  30. package/dist/esm/column-views.44373a90.js.map +1 -0
  31. package/dist/esm/column-views.479f68bd.js +152 -0
  32. package/dist/esm/column-views.479f68bd.js.map +1 -0
  33. package/dist/esm/{column-views.ad080c0e.js → column-views.488f24b6.js} +2 -2
  34. package/dist/esm/{column-views.ad080c0e.js.map → column-views.488f24b6.js.map} +1 -1
  35. package/dist/esm/{column-views.abf6aedd.js → column-views.4b259f9e.js} +2 -2
  36. package/dist/esm/{column-views.abf6aedd.js.map → column-views.4b259f9e.js.map} +1 -1
  37. package/dist/esm/{column-views.1151416d.css → column-views.54c1f382.css} +6 -5
  38. package/dist/esm/column-views.54c1f382.css.map +1 -0
  39. package/dist/esm/{column-views.729a6728.js → column-views.565b193a.js} +2 -2
  40. package/dist/esm/{column-views.729a6728.js.map → column-views.565b193a.js.map} +1 -1
  41. package/dist/esm/{column-views.058c0083.js → column-views.5ca2b219.js} +5 -5
  42. package/dist/esm/{column-views.058c0083.js.map → column-views.5ca2b219.js.map} +1 -1
  43. package/dist/esm/{column-views.218e8f5d.js → column-views.5eb4e6ff.js} +4 -4
  44. package/dist/esm/{column-views.218e8f5d.js.map → column-views.5eb4e6ff.js.map} +1 -1
  45. package/dist/esm/{column-views.11ae78f7.js → column-views.5fff0716.js} +3 -3
  46. package/dist/esm/{column-views.11ae78f7.js.map → column-views.5fff0716.js.map} +1 -1
  47. package/dist/esm/{column-views.05586d1f.js → column-views.60e97132.js} +2 -4
  48. package/dist/esm/column-views.60e97132.js.map +1 -0
  49. package/dist/esm/{column-views.75e5aebe.js → column-views.63d40878.js} +4 -4
  50. package/dist/esm/{column-views.75e5aebe.js.map → column-views.63d40878.js.map} +1 -1
  51. package/dist/esm/{column-views.d6d6df77.js → column-views.6c9e5069.js} +40 -62
  52. package/dist/esm/column-views.6c9e5069.js.map +1 -0
  53. package/dist/esm/column-views.6df65dab.js +9 -0
  54. package/dist/esm/column-views.6df65dab.js.map +1 -0
  55. package/dist/esm/{column-views.403a7b48.css → column-views.6f9511d1.css} +2 -1
  56. package/dist/esm/column-views.6f9511d1.css.map +1 -0
  57. package/dist/esm/column-views.7fa0d026.js +62 -0
  58. package/dist/esm/column-views.7fa0d026.js.map +1 -0
  59. package/dist/esm/{column-views.3a7179c4.js → column-views.82eb5026.js} +12 -7
  60. package/dist/esm/column-views.82eb5026.js.map +1 -0
  61. package/dist/esm/{column-views.9dd25b5b.js → column-views.92575b87.js} +3 -3
  62. package/dist/esm/column-views.92575b87.js.map +1 -0
  63. package/dist/esm/{column-views.833c2b74.js → column-views.9d51a5ab.js} +3 -3
  64. package/dist/esm/{column-views.833c2b74.js.map → column-views.9d51a5ab.js.map} +1 -1
  65. package/dist/esm/{column-views.817752b6.js → column-views.9ffc089b.js} +3 -3
  66. package/dist/esm/{column-views.817752b6.js.map → column-views.9ffc089b.js.map} +1 -1
  67. package/dist/esm/{column-views.70164236.js → column-views.aa9ede4d.js} +2 -2
  68. package/dist/esm/{column-views.70164236.js.map → column-views.aa9ede4d.js.map} +1 -1
  69. package/dist/esm/{column-views.6d63971b.js → column-views.ad2fe46c.js} +2 -2
  70. package/dist/esm/{column-views.6d63971b.js.map → column-views.ad2fe46c.js.map} +1 -1
  71. package/dist/esm/{column-views.7b4a1f15.js → column-views.afe0bb48.js} +5 -5
  72. package/dist/esm/{column-views.7b4a1f15.js.map → column-views.afe0bb48.js.map} +1 -1
  73. package/dist/esm/{column-views.aecf25bc.js → column-views.b4e1236d.js} +2 -2
  74. package/dist/esm/{column-views.aecf25bc.js.map → column-views.b4e1236d.js.map} +1 -1
  75. package/dist/esm/{column-views.6ce8cb61.js → column-views.c149f7a5.js} +3 -3
  76. package/dist/esm/{column-views.6ce8cb61.js.map → column-views.c149f7a5.js.map} +1 -1
  77. package/dist/esm/{column-views.b7016f82.css → column-views.cb6fc808.css} +10 -10
  78. package/dist/esm/column-views.cb6fc808.css.map +1 -0
  79. package/dist/esm/{column-views.35efe006.js → column-views.ce3a3ac8.js} +2 -2
  80. package/dist/esm/{column-views.35efe006.js.map → column-views.ce3a3ac8.js.map} +1 -1
  81. package/dist/esm/{column-views.77e22590.js → column-views.d1b49f5c.js} +2 -2
  82. package/dist/esm/{column-views.77e22590.js.map → column-views.d1b49f5c.js.map} +1 -1
  83. package/dist/esm/{column-views.faa4e06d.js → column-views.d524075b.js} +4 -4
  84. package/dist/esm/{column-views.faa4e06d.js.map → column-views.d524075b.js.map} +1 -1
  85. package/dist/esm/column-views.d5e788e8.js +31 -0
  86. package/dist/esm/column-views.d5e788e8.js.map +1 -0
  87. package/dist/esm/{column-views.30950997.js → column-views.d6c0b7bc.js} +2 -2
  88. package/dist/esm/{column-views.30950997.js.map → column-views.d6c0b7bc.js.map} +1 -1
  89. package/dist/esm/{column-views.44d3797a.js → column-views.dc195174.js} +2 -2
  90. package/dist/esm/{column-views.44d3797a.js.map → column-views.dc195174.js.map} +1 -1
  91. package/dist/esm/column-views.de433f18.js +139 -0
  92. package/dist/esm/column-views.de433f18.js.map +1 -0
  93. package/dist/esm/{column-views.ef88c46c.js → column-views.e075af15.js} +2 -2
  94. package/dist/esm/{column-views.ef88c46c.js.map → column-views.e075af15.js.map} +1 -1
  95. package/dist/esm/{column-views.7faf00ed.js → column-views.f7cdf6be.js} +3 -3
  96. package/dist/esm/{column-views.7faf00ed.js.map → column-views.f7cdf6be.js.map} +1 -1
  97. package/dist/esm/{column-views.66ccfc44.js → column-views.faa7e52e.js} +3 -3
  98. package/dist/esm/{column-views.66ccfc44.js.map → column-views.faa7e52e.js.map} +1 -1
  99. package/dist/esm/column-views.fba36cbb.js +13 -0
  100. package/dist/esm/{column-views.43beafa3.js.map → column-views.fba36cbb.js.map} +1 -1
  101. package/dist/esm/index.d.ts +40 -19
  102. package/dist/esm/index.d.ts.map +1 -1
  103. package/dist/esm/index.js +12 -12
  104. package/dist/node/column-views.012fa10c.js +2 -0
  105. package/dist/node/column-views.012fa10c.js.map +1 -0
  106. package/dist/node/{column-views.edb4ba54.js → column-views.021a6961.js} +2 -2
  107. package/dist/node/{column-views.edb4ba54.js.map → column-views.021a6961.js.map} +1 -1
  108. package/dist/node/{column-views.a19be00f.js → column-views.08bef1f6.js} +2 -2
  109. package/dist/node/{column-views.a19be00f.js.map → column-views.08bef1f6.js.map} +1 -1
  110. package/dist/node/{column-views.ae22e8b1.js → column-views.0f401891.js} +2 -2
  111. package/dist/node/{column-views.ae22e8b1.js.map → column-views.0f401891.js.map} +1 -1
  112. package/dist/node/column-views.1d064426.js +2 -0
  113. package/dist/node/column-views.1d064426.js.map +1 -0
  114. package/dist/node/{column-views.ae54d3e1.js → column-views.2577dec0.js} +2 -2
  115. package/dist/node/{column-views.ae54d3e1.js.map → column-views.2577dec0.js.map} +1 -1
  116. package/dist/node/{column-views.1ac9e2ed.js → column-views.2fe8feb9.js} +2 -2
  117. package/dist/node/{column-views.1ac9e2ed.js.map → column-views.2fe8feb9.js.map} +1 -1
  118. package/dist/node/column-views.3a079e34.css +2 -0
  119. package/dist/node/column-views.3a079e34.css.map +1 -0
  120. package/dist/node/{column-views.a281d5bb.js → column-views.42bc66a8.js} +2 -2
  121. package/dist/node/{column-views.a281d5bb.js.map → column-views.42bc66a8.js.map} +1 -1
  122. package/dist/node/{column-views.4ce5f5e4.js → column-views.465e593b.js} +2 -2
  123. package/dist/node/{column-views.4ce5f5e4.js.map → column-views.465e593b.js.map} +1 -1
  124. package/dist/node/{column-views.e1813308.js → column-views.46efb749.js} +2 -2
  125. package/dist/node/{column-views.e1813308.js.map → column-views.46efb749.js.map} +1 -1
  126. package/dist/node/{column-views.61dc64bc.js → column-views.47440961.js} +2 -2
  127. package/dist/node/{column-views.61dc64bc.js.map → column-views.47440961.js.map} +1 -1
  128. package/dist/node/{column-views.38835c99.js → column-views.5559de6a.js} +2 -2
  129. package/dist/node/{column-views.38835c99.js.map → column-views.5559de6a.js.map} +1 -1
  130. package/dist/node/{column-views.52cc4dd0.js → column-views.56f88b8c.js} +2 -2
  131. package/dist/node/{column-views.52cc4dd0.js.map → column-views.56f88b8c.js.map} +1 -1
  132. package/dist/node/{column-views.0b3a384e.js → column-views.5a9331a9.js} +2 -2
  133. package/dist/node/{column-views.0b3a384e.js.map → column-views.5a9331a9.js.map} +1 -1
  134. package/dist/node/column-views.5cb51833.js +2 -0
  135. package/dist/node/column-views.5cb51833.js.map +1 -0
  136. package/dist/node/column-views.5fd6e11a.js +2 -0
  137. package/dist/node/column-views.5fd6e11a.js.map +1 -0
  138. package/dist/node/column-views.672b683c.js +2 -0
  139. package/dist/node/column-views.672b683c.js.map +1 -0
  140. package/dist/node/{column-views.a08b0c9f.js → column-views.6c7f9245.js} +2 -2
  141. package/dist/node/{column-views.a08b0c9f.js.map → column-views.6c7f9245.js.map} +1 -1
  142. package/dist/node/{column-views.67fed1f5.js → column-views.75456275.js} +2 -2
  143. package/dist/node/{column-views.67fed1f5.js.map → column-views.75456275.js.map} +1 -1
  144. package/dist/node/column-views.75ba0464.css +2 -0
  145. package/dist/node/column-views.75ba0464.css.map +1 -0
  146. package/dist/node/{column-views.21a73236.js → column-views.7c322202.js} +2 -2
  147. package/dist/node/{column-views.21a73236.js.map → column-views.7c322202.js.map} +1 -1
  148. package/dist/node/column-views.7cc1a14f.js +2 -0
  149. package/dist/node/column-views.7cc1a14f.js.map +1 -0
  150. package/dist/node/{column-views.7faaf6c8.js → column-views.8e846c57.js} +2 -2
  151. package/dist/node/{column-views.7faaf6c8.js.map → column-views.8e846c57.js.map} +1 -1
  152. package/dist/node/{column-views.003348f6.js → column-views.8ee8469d.js} +2 -2
  153. package/dist/node/{column-views.003348f6.js.map → column-views.8ee8469d.js.map} +1 -1
  154. package/dist/node/{column-views.420b60d2.js → column-views.93bde6c1.js} +2 -2
  155. package/dist/node/{column-views.420b60d2.js.map → column-views.93bde6c1.js.map} +1 -1
  156. package/dist/node/{column-views.f2ee436e.js → column-views.a14f0134.js} +2 -2
  157. package/dist/node/{column-views.f2ee436e.js.map → column-views.a14f0134.js.map} +1 -1
  158. package/dist/node/column-views.a230263f.js +2 -0
  159. package/dist/node/column-views.a230263f.js.map +1 -0
  160. package/dist/node/{column-views.aef76eee.js → column-views.a596b1f5.js} +2 -2
  161. package/dist/node/{column-views.aef76eee.js.map → column-views.a596b1f5.js.map} +1 -1
  162. package/dist/node/column-views.af480651.js +2 -0
  163. package/dist/node/column-views.af480651.js.map +1 -0
  164. package/dist/node/column-views.b103acbc.js +2 -0
  165. package/dist/node/column-views.b103acbc.js.map +1 -0
  166. package/dist/node/{column-views.60b5663d.js → column-views.b40c1b9c.js} +2 -2
  167. package/dist/node/{column-views.60b5663d.js.map → column-views.b40c1b9c.js.map} +1 -1
  168. package/dist/node/column-views.b6e86cf0.js +2 -0
  169. package/dist/node/column-views.b6e86cf0.js.map +1 -0
  170. package/dist/node/{column-views.22c2d45b.js → column-views.c007152b.js} +2 -2
  171. package/dist/node/{column-views.22c2d45b.js.map → column-views.c007152b.js.map} +1 -1
  172. package/dist/node/{column-views.b6943236.js → column-views.c921fa1a.js} +2 -2
  173. package/dist/node/{column-views.b6943236.js.map → column-views.c921fa1a.js.map} +1 -1
  174. package/dist/node/{column-views.05cfc627.js → column-views.c9880a4d.js} +2 -2
  175. package/dist/node/{column-views.05cfc627.js.map → column-views.c9880a4d.js.map} +1 -1
  176. package/dist/node/column-views.ccfb9afb.css +2 -0
  177. package/dist/node/column-views.ccfb9afb.css.map +1 -0
  178. package/dist/node/{column-views.bde2dfa8.js → column-views.cd54f1b1.js} +2 -2
  179. package/dist/node/{column-views.bde2dfa8.js.map → column-views.cd54f1b1.js.map} +1 -1
  180. package/dist/node/{column-views.db47fe3c.js → column-views.d77d260b.js} +2 -2
  181. package/dist/node/{column-views.db47fe3c.js.map → column-views.d77d260b.js.map} +1 -1
  182. package/dist/node/{column-views.105c28fa.js → column-views.d818b387.js} +2 -2
  183. package/dist/node/{column-views.105c28fa.js.map → column-views.d818b387.js.map} +1 -1
  184. package/dist/node/{column-views.2d00d842.js → column-views.d8821a96.js} +2 -2
  185. package/dist/node/{column-views.2d00d842.js.map → column-views.d8821a96.js.map} +1 -1
  186. package/dist/node/column-views.dbb4a46b.js +2 -0
  187. package/dist/node/column-views.dbb4a46b.js.map +1 -0
  188. package/dist/node/{column-views.b12f8c81.js → column-views.e264a767.js} +2 -2
  189. package/dist/node/{column-views.b12f8c81.js.map → column-views.e264a767.js.map} +1 -1
  190. package/dist/node/column-views.e93b3bdb.js +2 -0
  191. package/dist/node/column-views.e93b3bdb.js.map +1 -0
  192. package/dist/node/{column-views.3913cd0f.js → column-views.ec691859.js} +2 -2
  193. package/dist/node/{column-views.3913cd0f.js.map → column-views.ec691859.js.map} +1 -1
  194. package/dist/node/column-views.ec7cc7cc.js +2 -0
  195. package/dist/node/column-views.ec7cc7cc.js.map +1 -0
  196. package/dist/node/{column-views.aae09aca.js → column-views.eecdc727.js} +2 -2
  197. package/dist/node/{column-views.aae09aca.js.map → column-views.eecdc727.js.map} +1 -1
  198. package/dist/node/{column-views.d08e4328.js → column-views.f577d065.js} +2 -2
  199. package/dist/node/{column-views.d08e4328.js.map → column-views.f577d065.js.map} +1 -1
  200. package/dist/node/column-views.fac4baff.js +2 -0
  201. package/dist/node/column-views.fac4baff.js.map +1 -0
  202. package/dist/node/index.js +1 -1
  203. package/dist/node/index.js.map +1 -1
  204. package/package.json +2 -2
  205. package/src/age-axis.ts +1 -1
  206. package/src/column.ts +4 -1
  207. package/src/correlation-chart/stories/correlation-chart.stories.ts +1 -1
  208. package/src/facets/detrital-zircon/index.module.sass +2 -3
  209. package/src/facets/detrital-zircon/index.ts +81 -11
  210. package/src/facets/detrital-zircon/provider.ts +1 -1
  211. package/src/facets/fossils/index.ts +145 -215
  212. package/src/facets/fossils/provider.ts +18 -25
  213. package/src/facets/fossils/taxon-ranges.ts +220 -0
  214. package/src/facets/index.ts +0 -1
  215. package/src/facets/{base-sample-column.module.sass → measurements/base.module.sass} +1 -0
  216. package/src/facets/measurements/base.ts +215 -0
  217. package/src/facets/measurements/index.ts +2 -38
  218. package/src/facets/measurements/sgp.ts +91 -0
  219. package/src/notes.ts +6 -3
  220. package/src/prepare-units/index.ts +8 -2
  221. package/src/prepare-units/utils.ts +55 -9
  222. package/dist/esm/column-views.05586d1f.js.map +0 -1
  223. package/dist/esm/column-views.1151416d.css.map +0 -1
  224. package/dist/esm/column-views.1e579112.js +0 -92
  225. package/dist/esm/column-views.1e579112.js.map +0 -1
  226. package/dist/esm/column-views.3a7179c4.js.map +0 -1
  227. package/dist/esm/column-views.403a7b48.css.map +0 -1
  228. package/dist/esm/column-views.43beafa3.js +0 -15
  229. package/dist/esm/column-views.52ad973a.js.map +0 -1
  230. package/dist/esm/column-views.54f8b909.js.map +0 -1
  231. package/dist/esm/column-views.6698b95a.js.map +0 -1
  232. package/dist/esm/column-views.6e7082db.js +0 -16
  233. package/dist/esm/column-views.6e7082db.js.map +0 -1
  234. package/dist/esm/column-views.7243e77d.js +0 -37
  235. package/dist/esm/column-views.7243e77d.js.map +0 -1
  236. package/dist/esm/column-views.76a220c4.js +0 -95
  237. package/dist/esm/column-views.76a220c4.js.map +0 -1
  238. package/dist/esm/column-views.9dd25b5b.js.map +0 -1
  239. package/dist/esm/column-views.b7016f82.css.map +0 -1
  240. package/dist/esm/column-views.d2214a99.js.map +0 -1
  241. package/dist/esm/column-views.d6d6df77.js.map +0 -1
  242. package/dist/esm/column-views.ea4ebbb7.js +0 -31
  243. package/dist/esm/column-views.ea4ebbb7.js.map +0 -1
  244. package/dist/node/column-views.16f336ee.js +0 -2
  245. package/dist/node/column-views.16f336ee.js.map +0 -1
  246. package/dist/node/column-views.1c567bfd.js +0 -2
  247. package/dist/node/column-views.1c567bfd.js.map +0 -1
  248. package/dist/node/column-views.28609db2.css +0 -2
  249. package/dist/node/column-views.28609db2.css.map +0 -1
  250. package/dist/node/column-views.2901b649.js +0 -2
  251. package/dist/node/column-views.2901b649.js.map +0 -1
  252. package/dist/node/column-views.29eb25bd.css +0 -2
  253. package/dist/node/column-views.29eb25bd.css.map +0 -1
  254. package/dist/node/column-views.39c21f22.js +0 -2
  255. package/dist/node/column-views.39c21f22.js.map +0 -1
  256. package/dist/node/column-views.573cb29d.js +0 -2
  257. package/dist/node/column-views.573cb29d.js.map +0 -1
  258. package/dist/node/column-views.5f3b0b04.js +0 -2
  259. package/dist/node/column-views.5f3b0b04.js.map +0 -1
  260. package/dist/node/column-views.77ace3a2.js +0 -2
  261. package/dist/node/column-views.77ace3a2.js.map +0 -1
  262. package/dist/node/column-views.8f54691f.js +0 -2
  263. package/dist/node/column-views.8f54691f.js.map +0 -1
  264. package/dist/node/column-views.a16cd1f2.js +0 -2
  265. package/dist/node/column-views.a16cd1f2.js.map +0 -1
  266. package/dist/node/column-views.a9576bac.js +0 -2
  267. package/dist/node/column-views.a9576bac.js.map +0 -1
  268. package/dist/node/column-views.c3c15cc2.js +0 -2
  269. package/dist/node/column-views.c3c15cc2.js.map +0 -1
  270. package/dist/node/column-views.cd7b223b.css +0 -2
  271. package/dist/node/column-views.cd7b223b.css.map +0 -1
  272. package/dist/node/column-views.f6ac1161.js +0 -2
  273. package/dist/node/column-views.f6ac1161.js.map +0 -1
  274. package/src/facets/base-sample-column.ts +0 -114
  275. package/src/facets/measurements/provider.ts +0 -80
  276. /package/src/facets/fossils/{index.module.sass → taxon-ranges.module.sass} +0 -0
@@ -2,26 +2,58 @@ import hyper from "@macrostrat/hyper";
2
2
  import {
3
3
  FossilDataType,
4
4
  PBDBCollection,
5
+ PBDBEntity,
5
6
  PBDBOccurrence,
6
7
  useFossilData,
7
8
  } from "./provider";
8
- import type { IUnit } from "../../units";
9
- import { BaseMeasurementsColumn, TruncatedList } from "../base-sample-column";
10
- import { Box, useElementSize } from "@macrostrat/ui-components";
11
- import { InternMap } from "d3-array";
12
- import { ColumnAxisType, ColumnSVG } from "@macrostrat/column-components";
9
+ import type { CompositeColumnScale, IUnit } from "../../units";
10
+ import {
11
+ BaseMeasurementsColumn,
12
+ ColumnMeasurementData,
13
+ MeasurementHeightData,
14
+ standardizeMeasurementHeight,
15
+ groupNotesByPixelDistance,
16
+ TruncatedList,
17
+ } from "../measurements";
18
+ import { ColumnAxisType } from "@macrostrat/column-components";
13
19
  import {
14
- useMacrostratColumnData,
15
20
  useCompositeScale,
21
+ useMacrostratColumnData,
16
22
  } from "../../data-provider";
17
23
  import { UnitLong } from "@macrostrat/api-types";
18
- import styles from "./index.module.sass";
19
- import { useRef } from "react";
24
+ import styles from "./taxon-ranges.module.sass";
25
+ import { getPositionWithinUnit, getUnitHeightRange } from "../../prepare-units";
26
+ import { scaleLinear } from "d3-scale";
27
+
28
+ export * from "./taxon-ranges";
20
29
 
21
30
  const h = hyper.styled(styles);
22
31
 
23
32
  export { FossilDataType };
24
33
 
34
+ export function PBDBFossilsColumn({
35
+ columnID,
36
+ type = FossilDataType.Collections,
37
+ }: {
38
+ columnID: number;
39
+ type: FossilDataType;
40
+ }) {
41
+ const data = useFossilData(columnID, type);
42
+ const { axisType, units } = useMacrostratColumnData();
43
+ const scale = useCompositeScale();
44
+
45
+ if (data == null || units == null || scale == null) return null;
46
+
47
+ const data1 = preparePBDBData(data, units, scale, axisType);
48
+
49
+ return h(BaseMeasurementsColumn, {
50
+ data: data1,
51
+ noteComponent: FossilInfo,
52
+ focusedNoteComponent: FossilInfo,
53
+ className: "fossil-collections",
54
+ });
55
+ }
56
+
25
57
  interface FossilItemProps {
26
58
  note: {
27
59
  data: PBDBCollection[];
@@ -34,19 +66,30 @@ interface FossilItemProps {
34
66
  width?: number;
35
67
  height?: number;
36
68
  color?: string;
69
+ focused?: boolean;
37
70
  }
38
71
 
39
72
  function FossilInfo(props: FossilItemProps) {
40
- const { note, spacing } = props;
41
- const { data, unit } = note;
73
+ const { note, maxItems, focused = false } = props;
74
+ const { data } = note;
75
+ // Sort collections by name
76
+ data.sort((a, b) => {
77
+ const nameA = a.best_name ?? a.cltn_name ?? "";
78
+ const nameB = b.best_name ?? b.cltn_name ?? "";
79
+ return nameA.localeCompare(nameB);
80
+ });
42
81
 
43
82
  return h(TruncatedList, {
44
83
  data,
45
84
  className: "fossil-collections",
46
85
  itemRenderer: PBDBCollectionLink,
86
+ maxItems: focused ? Infinity : (maxItems ?? 5),
47
87
  });
48
88
  }
49
89
 
90
+ const FocusedFossilInfo = (props: FossilItemProps) =>
91
+ h(FossilInfo, { ...props, maxItems: Infinity });
92
+
50
93
  function PBDBCollectionLink({
51
94
  data,
52
95
  }: {
@@ -56,231 +99,118 @@ function PBDBCollectionLink({
56
99
  return h(
57
100
  "a.link-id",
58
101
  {
59
- href: `https://paleobiodb.org/classic/basicCollectionSearch?collection_no=${data.cltn_id}`,
102
+ href: `https://paleobiodb.org/app/collections#display=col:${data.cltn_id}`,
103
+ target: "_blank",
104
+ onClick(e) {
105
+ e.stopPropagation();
106
+ },
60
107
  },
61
108
  data.best_name ?? data.cltn_name,
62
109
  );
63
110
  }
64
111
 
65
- const matchingUnit = (dz) => (d) => d.unit_id == dz[0].unit_id;
66
-
67
- export function PBDBFossilsColumn({
68
- columnID,
69
- type = FossilDataType.Collections,
70
- }: {
71
- columnID: number;
72
- type: FossilDataType;
73
- }) {
74
- const data = useFossilData(columnID, type);
75
-
76
- return h(BaseMeasurementsColumn, {
77
- data,
78
- noteComponent: FossilInfo,
79
- className: "fossil-collections",
80
- matchingUnit,
81
- });
82
- }
83
-
84
- export function PBDBOccurrencesMatrix({ columnID }) {
85
- /* A column for a matrix of taxon occurrences displayed as a table beside the main column. This will
86
- eventually be extended with first/last occurrence markers and range bars.
112
+ interface PreparePBDBDataOptions {
113
+ /** If set, group close notes within this distance (in pixels in display space)
114
+ * into a single note. If a number is provided, that number is used as the distance,
115
+ * otherwise a default of 5 pixels is used.
87
116
  */
88
- const data = useFossilData(columnID, FossilDataType.Occurrences) as InternMap<
89
- number,
90
- PBDBOccurrence[]
91
- >;
92
-
93
- // convert the data to a map
94
- const occurrenceMap = new Map(data);
95
-
96
- const col = useMacrostratColumnData();
97
- const matrix = createOccurrenceMatrix(col.units, occurrenceMap, col.axisType);
98
-
99
- const scale = useCompositeScale();
100
-
101
- const { taxonRanges } = matrix;
102
-
103
- const padding = 16;
104
- const spacing = 16;
105
-
106
- const taxonEntries = Array.from(taxonRanges.entries());
107
- //const taxon = taxonEntries.slice(0, 50); // limit to top 50 taxa
108
-
109
- const width = padding * 2 + spacing * taxonEntries.length;
110
-
111
- return h(Box, { className: "taxon-ranges", width, height: col.totalHeight }, [
112
- h(TaxonOccurrenceLabels, {
113
- taxonEntries,
114
- padding,
115
- spacing,
116
- scale,
117
- }),
118
- h(
119
- ColumnSVG,
120
- {
121
- width: padding * 2 + spacing * taxonEntries.length,
122
- },
123
- h(
124
- "g.taxa-occurrences-matrix",
125
- taxonEntries.map(([taxonName, ranges], rowIndex) => {
126
- const xPosition = padding + rowIndex * spacing;
127
- return h("g", { transform: `translate(${xPosition})` }, [
128
- ranges.map(([top, bottom]) => {
129
- return h("line", {
130
- y1: scale(top),
131
- y2: scale(bottom),
132
- });
133
- }),
134
- ]);
135
- }),
136
- ),
137
- ),
138
- ]);
117
+ groupCloseNotes?: boolean | number;
139
118
  }
140
119
 
141
- function TaxonOccurrenceLabels({ taxonEntries, padding, spacing, scale }) {
142
- return h("div.taxon-labels", [
143
- taxonEntries.map(([taxonName, ranges], rowIndex) => {
144
- const top = ranges[0]?.[0] ?? 0;
145
- let topPx = scale(top) - 20;
146
- if (topPx < 200) topPx = 0;
120
+ function preparePBDBData<T extends PBDBEntity>(
121
+ data: T[],
122
+ units: UnitLong[],
123
+ scale: CompositeColumnScale,
124
+ axisType: ColumnAxisType,
125
+ options?: { groupCloseNotes?: boolean | number },
126
+ ) {
127
+ /** Prepare PBDB fossil data for display in a measurements column */
128
+ const { groupCloseNotes = true } = options ?? {};
129
+ const groupDistance =
130
+ typeof groupCloseNotes === "number" ? groupCloseNotes : 10;
131
+
132
+ // Map of data to its defined height ranges
133
+ const dataMap = new Map<string, ColumnMeasurementData<T[]>>();
134
+
135
+ // Todo: if we wanted, we could add a step where we group notes that are too close together here...
136
+
137
+ for (const d of data) {
138
+ const range = getHeightRangeForPBDBEntity(d, units, axisType);
139
+
140
+ if (range == null) continue;
141
+ const { height, top_height } = range;
142
+ // compose the key based on height info
143
+ let key = `${height}`;
144
+ if (top_height != null) {
145
+ key += `-${top_height}`;
146
+ }
147
147
 
148
- return h(TaxonLabel, {
149
- top: topPx,
150
- left: padding + rowIndex * spacing,
151
- taxonName,
148
+ // Group by height key
149
+ if (!dataMap.has(key)) {
150
+ dataMap.set(key, {
151
+ height,
152
+ top_height: top_height ?? height,
153
+ data: [],
154
+ id: key,
152
155
  });
153
- }),
154
- ]);
155
- }
156
+ }
157
+ dataMap.get(key)!.data.push(d);
158
+ }
156
159
 
157
- function TaxonLabel({ top, left, taxonName }) {
158
- const ref = useRef();
159
- const textSize = useElementSize(ref);
160
- const labelWidth = textSize?.height ?? 200;
161
- return h(
162
- "div.taxon-label",
163
- {
164
- style: {
165
- top: `${top}px`,
166
- marginLeft: `${left}px`,
167
- "--label-width": `${labelWidth}px`,
168
- },
169
- },
170
- h("div.taxon-label-inner", h("div.taxon-label-text", { ref }, taxonName)),
160
+ return groupNotesByPixelDistance(
161
+ Array.from(dataMap.values()),
162
+ scale,
163
+ axisType,
164
+ groupDistance,
171
165
  );
172
166
  }
173
167
 
174
- type TaxonUnitMap = Map<string, Set<number>>;
175
-
176
- interface OccurrenceMatrixData {
177
- occurrenceMap: Map<number, PBDBOccurrence[]>; // Map of unit IDs to occurrences (original data)
178
- taxonUnitMap: TaxonUnitMap; // Map of taxon names to sets of unit IDs
179
- taxonOccurrenceMap: Map<string, PBDBOccurrence[]>; // Map of taxon names to occurrences
180
- taxonRanges: Map<string, [number, number][]>; // Map of taxon names to [top, bottom] pixel ranges
181
- }
182
-
183
- function TaxonOccurrenceEntry({
184
- xPosition,
185
- ranges,
186
- scale,
187
- name,
188
- }: {
189
- xPosition: number;
190
- units: Set<number>;
191
- }) {
192
- return h("g", { transform: `translate(${xPosition})` }, [
193
- ranges.map(([top, bottom]) => {
194
- return h("line", {
195
- y1: scale(top),
196
- y2: scale(bottom),
197
- });
198
- }),
199
- ]);
200
- }
201
-
202
- function createOccurrenceMatrix(
168
+ function getHeightRangeForPBDBEntity<T extends PBDBEntity>(
169
+ d: T,
203
170
  units: UnitLong[],
204
- data: Map<number, PBDBOccurrence[]>,
205
- axisType: ColumnAxisType = ColumnAxisType.AGE,
206
- ): OccurrenceMatrixData {
207
- const taxonUnitMap = new Map<string, Set<number>>();
208
- const taxonOccurrenceMap = new Map<string, PBDBOccurrence[]>();
209
-
210
- for (const [unit_id, occurrences] of data.entries()) {
211
- for (const occ of occurrences) {
212
- const taxonName = occ.best_name ?? occ.taxon_name;
213
- if (!taxonUnitMap.has(taxonName)) {
214
- taxonUnitMap.set(taxonName, new Set());
215
- taxonOccurrenceMap.set(taxonName, []);
216
- }
217
- taxonUnitMap.get(taxonName).add(unit_id);
218
- taxonOccurrenceMap.get(taxonName).push(occ);
171
+ axisType: ColumnAxisType,
172
+ ): MeasurementHeightData | null {
173
+ let height: number | null = null;
174
+ if (d.slb != null && d.slu == "mbsf") {
175
+ // Meters below sea floor - special case for eODP where we have
176
+ // specific depth data referenced
177
+ height = Number(d.slb);
178
+ if (axisType === ColumnAxisType.DEPTH) {
179
+ // Data is already in depth units
180
+ return { height };
219
181
  }
220
182
  }
221
-
222
- // sort the taxon occurrence map by number of occurrences
223
- const sortedTaxa = Array.from(taxonUnitMap.entries()).sort((a, b) => {
224
- // Sort alphabetically by taxon name
225
- return b[0].localeCompare(a[0]);
226
- });
227
-
228
- const taxonRanges = new Map<string, [number, number][]>();
229
- for (const [taxonName, unitSet] of taxonUnitMap.entries()) {
230
- taxonRanges.set(
231
- taxonName,
232
- accumulatePresenceDomains(units, unitSet, axisType),
183
+ if (d.unit_id == null) return null;
184
+ if (height != null) {
185
+ // If we have both height and unit info, we need to adjust the height
186
+ // to fit whatever scale type we're using.
187
+ // TODO: we could improve how this works by having concurrent age and
188
+ // height scales, which would allow us to do this without having to
189
+ // reference to a specific unit.
190
+ const unit = units.find((u) => u.unit_id === d.unit_id);
191
+ if (unit == null) return null;
192
+ const relHeight = getRelativePositionInUnit(
193
+ height,
194
+ unit,
195
+ ColumnAxisType.DEPTH,
233
196
  );
197
+ if (relHeight == null) return null;
198
+ height = getPositionWithinUnit(relHeight, unit, axisType);
199
+ return { height };
234
200
  }
235
-
236
- return {
237
- occurrenceMap: data,
238
- taxonUnitMap: new Map(sortedTaxa),
239
- taxonOccurrenceMap: taxonOccurrenceMap,
240
- taxonRanges,
241
- };
201
+ // We can just get the height within the unit, clipped to the unit boundaries
202
+ return standardizeMeasurementHeight({ unit_id: d.unit_id }, units, axisType);
242
203
  }
243
204
 
244
- function accumulatePresenceDomains(
245
- unit: UnitLong[],
246
- presenceUnits: Set<number>,
205
+ function getRelativePositionInUnit<T extends PBDBEntity>(
206
+ pos: number,
207
+ unit: UnitLong,
247
208
  axisType: ColumnAxisType,
248
- ): Array<[number, number]> {
249
- const domains: Array<[number, number]> = [];
250
- let currentDomain: [number, number] | null = null;
251
-
252
- for (const u of unit) {
253
- if (presenceUnits.has(u.unit_id)) {
254
- if (currentDomain == null) {
255
- if (
256
- axisType == ColumnAxisType.DEPTH ||
257
- axisType == ColumnAxisType.HEIGHT
258
- ) {
259
- currentDomain = [u.t_pos, u.b_pos];
260
- } else {
261
- currentDomain = [u.t_age, u.b_age];
262
- }
263
- } else {
264
- if (
265
- axisType == ColumnAxisType.DEPTH ||
266
- axisType == ColumnAxisType.HEIGHT
267
- ) {
268
- currentDomain[1] = u.b_pos;
269
- } else {
270
- currentDomain[1] = u.b_age;
271
- }
272
- }
273
- } else {
274
- if (currentDomain != null) {
275
- domains.push(currentDomain);
276
- currentDomain = null;
277
- }
278
- }
279
- }
280
-
281
- if (currentDomain != null) {
282
- domains.push(currentDomain);
283
- }
284
-
285
- return domains;
209
+ ): number | null {
210
+ // This is the inverse of getPositionWithinUnit
211
+ const heights = getUnitHeightRange(unit, axisType, false);
212
+ const scale = scaleLinear(heights).domain([0, 1]);
213
+ const relPos = scale.invert(pos);
214
+ if (relPos < 0 || relPos > 1) return null;
215
+ return relPos;
286
216
  }
@@ -1,4 +1,3 @@
1
- import { group, InternMap } from "d3-array";
2
1
  import {
3
2
  createAPIContext,
4
3
  useAPIResult,
@@ -7,8 +6,10 @@ import {
7
6
 
8
7
  const responseUnwrapper = (d) => d.records;
9
8
 
9
+ const pbdbAPIBase = "https://paleobiodb.org/data1.2";
10
+
10
11
  const pbdbAPIContext = createAPIContext({
11
- baseURL: "https://paleobiodb.org/data1.2",
12
+ baseURL: pbdbAPIBase,
12
13
  unwrapResponse: responseUnwrapper,
13
14
  });
14
15
 
@@ -17,26 +18,17 @@ export enum FossilDataType {
17
18
  Collections = "colls",
18
19
  }
19
20
 
20
- export function usePBDBFossilData(
21
- type: FossilDataType,
22
- { col_id },
23
- ): any[] | null {
24
- const params = {
25
- ms_column: col_id,
26
- show: "full,mslink",
27
- };
28
- return useAPIResult(`/${type}/list.json`, params, {
29
- context: pbdbAPIContext,
30
- });
31
- }
32
-
33
- export interface PBDBIdentifier {
21
+ export interface PBDBEntity {
34
22
  unit_id: number;
35
23
  col_id: number;
36
24
  cltn_id: number;
25
+ // For eODP, slb/slu are used to store the heights of fossil locations found in measured sections.
26
+ // They may have a more general set of uses as well but these are not currently explored.
27
+ slb?: string; // The local bed in which the fossil was found
28
+ slu?: string; // The unit of measurement used to designate the local bed
37
29
  }
38
30
 
39
- export interface PBDBCollection extends PBDBIdentifier {
31
+ export interface PBDBCollection extends PBDBEntity {
40
32
  cltn_name: string;
41
33
  pbdb_occs: number;
42
34
  t_age: number;
@@ -44,7 +36,7 @@ export interface PBDBCollection extends PBDBIdentifier {
44
36
  [key: string]: any; // Allow for additional properties
45
37
  }
46
38
 
47
- export interface PBDBOccurrence extends PBDBIdentifier {
39
+ export interface PBDBOccurrence extends PBDBEntity {
48
40
  occ_id: number;
49
41
  cltn_id: number;
50
42
  taxon_name: string;
@@ -86,8 +78,9 @@ async function fetchPDBDFossilData(
86
78
  col_id: number,
87
79
  type: FossilDataType,
88
80
  ): Promise<PBDBCollection[]> {
81
+ // Note: show=rank does not work on training PBDB server
89
82
  const resp = await fetch(
90
- `https://paleobiodb.org/data1.2/${type}/list.json?ms_column=${col_id}&show=mslink,full`,
83
+ pbdbAPIBase + `/${type}/list.json?ms_column=${col_id}&show=mslink,stratext`,
91
84
  );
92
85
  const res = await resp.json();
93
86
  return res.records.map(
@@ -97,21 +90,21 @@ async function fetchPDBDFossilData(
97
90
  );
98
91
  }
99
92
 
100
- async function fetchFossilData(
93
+ async function fetchFossilData<T extends PBDBEntity>(
101
94
  colID: number,
102
95
  type: FossilDataType,
103
- ): Promise<InternMap<number, PBDBOccurrence[] | PBDBCollection[]>> {
96
+ ): Promise<T[]> {
104
97
  const [macrostratData, pbdbData] = await Promise.all([
105
98
  fetchMacrostratFossilData(colID, type),
106
99
  fetchPDBDFossilData(colID, type),
107
100
  ]);
108
-
109
- const data = [...macrostratData, ...pbdbData];
110
-
111
- return group(data, (d) => d.unit_id);
101
+ return [...macrostratData, ...pbdbData];
112
102
  }
113
103
 
114
104
  function preprocessOccurrence(d): PBDBOccurrence {
105
+ if (d.msu == null || d.msc == null) {
106
+ return d;
107
+ }
115
108
  /* Preprocess data for an occurrence into a Macrostrat-like format */
116
109
  // Standardize names of Macrostrat units and columns
117
110
  const unit_id = parseInt(d.msu.replace(/^\w+:/, ""));