@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
@@ -0,0 +1,220 @@
1
+ import hyper from "@macrostrat/hyper";
2
+ import { FossilDataType, PBDBOccurrence, useFossilData } from "./provider";
3
+ import { Box, useElementSize } from "@macrostrat/ui-components";
4
+ import { group } from "d3-array";
5
+ import { ColumnAxisType, ColumnSVG } from "@macrostrat/column-components";
6
+ import {
7
+ useMacrostratColumnData,
8
+ useCompositeScale,
9
+ } from "../../data-provider";
10
+ import { UnitLong } from "@macrostrat/api-types";
11
+ import styles from "./taxon-ranges.module.sass";
12
+ import { useRef } from "react";
13
+
14
+ const h = hyper.styled(styles);
15
+
16
+ export { FossilDataType };
17
+
18
+ export function PBDBOccurrencesMatrix({ columnID }) {
19
+ /* A column for a matrix of taxon occurrences displayed as a table beside the main column. This will
20
+ eventually be extended with first/last occurrence markers and range bars.
21
+ */
22
+ const data = useFossilData(columnID, FossilDataType.Occurrences);
23
+ const col = useMacrostratColumnData();
24
+ const scale = useCompositeScale();
25
+
26
+ if (data == null) return null;
27
+
28
+ const data1 = group(data, (d) => d.unit_id);
29
+
30
+ // convert the data to a map
31
+ const occurrenceMap = new Map(data1);
32
+
33
+ const matrix = createOccurrenceMatrix(col.units, occurrenceMap, col.axisType);
34
+
35
+ const { taxonRanges } = matrix;
36
+
37
+ const padding = 16;
38
+ const spacing = 16;
39
+
40
+ const taxonEntries = Array.from(taxonRanges.entries());
41
+ //const taxon = taxonEntries.slice(0, 50); // limit to top 50 taxa
42
+
43
+ const width = padding * 2 + spacing * taxonEntries.length;
44
+
45
+ return h(Box, { className: "taxon-ranges", width, height: col.totalHeight }, [
46
+ h(TaxonOccurrenceLabels, {
47
+ taxonEntries,
48
+ padding,
49
+ spacing,
50
+ scale,
51
+ }),
52
+ h(
53
+ ColumnSVG,
54
+ {
55
+ width: padding * 2 + spacing * taxonEntries.length,
56
+ },
57
+ h(
58
+ "g.taxa-occurrences-matrix",
59
+ taxonEntries.map(([taxonName, ranges], rowIndex) => {
60
+ const xPosition = padding + rowIndex * spacing;
61
+ return h("g", { transform: `translate(${xPosition})` }, [
62
+ ranges.map(([top, bottom]) => {
63
+ return h("line", {
64
+ y1: scale(top),
65
+ y2: scale(bottom),
66
+ });
67
+ }),
68
+ ]);
69
+ }),
70
+ ),
71
+ ),
72
+ ]);
73
+ }
74
+
75
+ function TaxonOccurrenceLabels({ taxonEntries, padding, spacing, scale }) {
76
+ return h("div.taxon-labels", [
77
+ taxonEntries.map(([taxonName, ranges], rowIndex) => {
78
+ const top = ranges[0]?.[0] ?? 0;
79
+ let topPx = scale(top) - 20;
80
+ if (topPx < 200) topPx = 0;
81
+
82
+ return h(TaxonLabel, {
83
+ top: topPx,
84
+ left: padding + rowIndex * spacing,
85
+ taxonName,
86
+ });
87
+ }),
88
+ ]);
89
+ }
90
+
91
+ function TaxonLabel({ top, left, taxonName }) {
92
+ const ref = useRef();
93
+ const textSize = useElementSize(ref);
94
+ const labelWidth = textSize?.height ?? 200;
95
+ return h(
96
+ "div.taxon-label",
97
+ {
98
+ style: {
99
+ top: `${top}px`,
100
+ marginLeft: `${left}px`,
101
+ "--label-width": `${labelWidth}px`,
102
+ },
103
+ },
104
+ h("div.taxon-label-inner", h("div.taxon-label-text", { ref }, taxonName)),
105
+ );
106
+ }
107
+
108
+ type TaxonUnitMap = Map<string, Set<number>>;
109
+
110
+ interface OccurrenceMatrixData {
111
+ occurrenceMap: Map<number, PBDBOccurrence[]>; // Map of unit IDs to occurrences (original data)
112
+ taxonUnitMap: TaxonUnitMap; // Map of taxon names to sets of unit IDs
113
+ taxonOccurrenceMap: Map<string, PBDBOccurrence[]>; // Map of taxon names to occurrences
114
+ taxonRanges: Map<string, [number, number][]>; // Map of taxon names to [top, bottom] pixel ranges
115
+ }
116
+
117
+ function TaxonOccurrenceEntry({
118
+ xPosition,
119
+ ranges,
120
+ scale,
121
+ name,
122
+ }: {
123
+ xPosition: number;
124
+ units: Set<number>;
125
+ }) {
126
+ return h("g", { transform: `translate(${xPosition})` }, [
127
+ ranges.map(([top, bottom]) => {
128
+ return h("line", {
129
+ y1: scale(top),
130
+ y2: scale(bottom),
131
+ });
132
+ }),
133
+ ]);
134
+ }
135
+
136
+ function createOccurrenceMatrix(
137
+ units: UnitLong[],
138
+ data: Map<number, PBDBOccurrence[]>,
139
+ axisType: ColumnAxisType = ColumnAxisType.AGE,
140
+ ): OccurrenceMatrixData {
141
+ const taxonUnitMap = new Map<string, Set<number>>();
142
+ const taxonOccurrenceMap = new Map<string, PBDBOccurrence[]>();
143
+
144
+ for (const [unit_id, occurrences] of data.entries()) {
145
+ for (const occ of occurrences) {
146
+ const taxonName = occ.best_name ?? occ.taxon_name;
147
+ if (!taxonUnitMap.has(taxonName)) {
148
+ taxonUnitMap.set(taxonName, new Set());
149
+ taxonOccurrenceMap.set(taxonName, []);
150
+ }
151
+ taxonUnitMap.get(taxonName).add(unit_id);
152
+ taxonOccurrenceMap.get(taxonName).push(occ);
153
+ }
154
+ }
155
+
156
+ // sort the taxon occurrence map by number of occurrences
157
+ const sortedTaxa = Array.from(taxonUnitMap.entries()).sort((a, b) => {
158
+ // Sort alphabetically by taxon name
159
+ return b[0].localeCompare(a[0]);
160
+ });
161
+
162
+ const taxonRanges = new Map<string, [number, number][]>();
163
+ for (const [taxonName, unitSet] of taxonUnitMap.entries()) {
164
+ taxonRanges.set(
165
+ taxonName,
166
+ accumulatePresenceDomains(units, unitSet, axisType),
167
+ );
168
+ }
169
+
170
+ return {
171
+ occurrenceMap: data,
172
+ taxonUnitMap: new Map(sortedTaxa),
173
+ taxonOccurrenceMap: taxonOccurrenceMap,
174
+ taxonRanges,
175
+ };
176
+ }
177
+
178
+ function accumulatePresenceDomains(
179
+ unit: UnitLong[],
180
+ presenceUnits: Set<number>,
181
+ axisType: ColumnAxisType,
182
+ ): Array<[number, number]> {
183
+ const domains: Array<[number, number]> = [];
184
+ let currentDomain: [number, number] | null = null;
185
+
186
+ for (const u of unit) {
187
+ if (presenceUnits.has(u.unit_id)) {
188
+ if (currentDomain == null) {
189
+ if (
190
+ axisType == ColumnAxisType.DEPTH ||
191
+ axisType == ColumnAxisType.HEIGHT
192
+ ) {
193
+ currentDomain = [u.t_pos, u.b_pos];
194
+ } else {
195
+ currentDomain = [u.t_age, u.b_age];
196
+ }
197
+ } else {
198
+ if (
199
+ axisType == ColumnAxisType.DEPTH ||
200
+ axisType == ColumnAxisType.HEIGHT
201
+ ) {
202
+ currentDomain[1] = u.b_pos;
203
+ } else {
204
+ currentDomain[1] = u.b_age;
205
+ }
206
+ }
207
+ } else {
208
+ if (currentDomain != null) {
209
+ domains.push(currentDomain);
210
+ currentDomain = null;
211
+ }
212
+ }
213
+ }
214
+
215
+ if (currentDomain != null) {
216
+ domains.push(currentDomain);
217
+ }
218
+
219
+ return domains;
220
+ }
@@ -2,4 +2,3 @@ export * from "./fossils";
2
2
  export * from "./detrital-zircon";
3
3
  export * from "./carbon-isotopes";
4
4
  export * from "./measurements";
5
- export * from "./base-sample-column";
@@ -4,6 +4,7 @@
4
4
  list-style: none
5
5
  border-left: 1px solid var(--column-stroke-color)
6
6
  margin: 1px 0
7
+ background-color: var(--column-background-color)
7
8
  li
8
9
  display: inline
9
10
  &:not(:last-child):after
@@ -0,0 +1,215 @@
1
+ import hyper from "@macrostrat/hyper";
2
+ import styles from "./base.module.sass";
3
+ import { getPositionWithinUnit, getUnitHeightRange } from "../../prepare-units";
4
+ import { ColumnNotes } from "../../notes";
5
+ import { UnitLong } from "@macrostrat/api-types";
6
+ import { ColumnAxisType } from "@macrostrat/column-components";
7
+ import type { CompositeColumnScale } from "../../units";
8
+ const h = hyper.styled(styles);
9
+
10
+ type GetHeightRangeFn<T> = (
11
+ data: T,
12
+ unit: UnitLong | null,
13
+ axisType: ColumnAxisType,
14
+ ) => MeasurementHeightData;
15
+
16
+ export interface BaseMeasurementsColumnProps<T> {
17
+ data: T[];
18
+ noteComponent?: any;
19
+ width?: number;
20
+ paddingLeft?: number;
21
+ className?: string;
22
+ // TODO: these props are confusing
23
+ getUnitID?: (d: T) => number | string;
24
+ isMatchingUnit?: (d: T, unit: UnitLong) => boolean;
25
+ getHeightRange?: GetHeightRangeFn<T>;
26
+ deltaConnectorAttachment?: number;
27
+ }
28
+
29
+ export interface ColumnMeasurementData<T = any> extends MeasurementHeightData {
30
+ data: T;
31
+ id: string | number;
32
+ }
33
+
34
+ type MeasurementPositionInformation =
35
+ | MeasurementHeightData
36
+ | {
37
+ unit_id: number;
38
+ unit_rel_pos?: number;
39
+ };
40
+
41
+ export function standardizeMeasurementHeight(
42
+ pos: MeasurementPositionInformation,
43
+ units: UnitLong[],
44
+ axisType: ColumnAxisType,
45
+ ): MeasurementHeightData | null {
46
+ /** Get a standardized height representation from position information for
47
+ * a measurement
48
+ */
49
+ if ("height" in pos) {
50
+ return pos;
51
+ }
52
+ const unit = units.find((u) => u.unit_id === pos.unit_id);
53
+ if (unit == null) {
54
+ return null;
55
+ }
56
+ if (pos.unit_rel_pos != null) {
57
+ const res = getPositionWithinUnit(pos.unit_rel_pos, unit, axisType);
58
+ if (res == null) return null;
59
+ return { height: res };
60
+ } else {
61
+ const [height, top_height] = getUnitHeightRange(unit, axisType);
62
+ return { height, top_height };
63
+ }
64
+ }
65
+
66
+ export function mergeHeightRanges(
67
+ data: MeasurementHeightData[],
68
+ axisType: ColumnAxisType,
69
+ ): MeasurementHeightData {
70
+ /** Merge multiple height ranges into a single range */
71
+ const heights = [];
72
+
73
+ for (const d of data) {
74
+ heights.push(d.height);
75
+ if (d.top_height != null) {
76
+ heights.push(d.top_height);
77
+ }
78
+ }
79
+
80
+ let height: number;
81
+ let top_height: number;
82
+ if (axisType === ColumnAxisType.AGE || axisType === ColumnAxisType.DEPTH) {
83
+ height = Math.max(...heights);
84
+ top_height = Math.min(...heights);
85
+ } else {
86
+ height = Math.min(...heights);
87
+ top_height = Math.max(...heights);
88
+ }
89
+
90
+ if (top_height === height) {
91
+ return { height };
92
+ }
93
+ return { height, top_height };
94
+ }
95
+
96
+ export type MeasurementHeightData = {
97
+ height: number;
98
+ top_height?: number | null;
99
+ };
100
+
101
+ export function BaseMeasurementsColumn({
102
+ data,
103
+ noteComponent,
104
+ width = 500,
105
+ paddingLeft = 40,
106
+ className,
107
+ deltaConnectorAttachment,
108
+ focusedNoteComponent,
109
+ }: BaseMeasurementsColumnProps<any>) {
110
+ if (data == null) return null;
111
+
112
+ return h(
113
+ "div.measurements-column",
114
+ { className },
115
+ h(ColumnNotes, {
116
+ width,
117
+ paddingLeft,
118
+ notes: data,
119
+ noteComponent,
120
+ deltaConnectorAttachment,
121
+ focusedNoteComponent,
122
+ }),
123
+ );
124
+ }
125
+
126
+ interface TruncatedListProps {
127
+ data: any[];
128
+ className?: string;
129
+ maxItems?: number;
130
+ itemRenderer?: (props: { data: any }) => any;
131
+ }
132
+
133
+ export function TruncatedList({
134
+ data,
135
+ className,
136
+ maxItems = 5,
137
+ itemRenderer = (p) => h("span", p.data),
138
+ }: TruncatedListProps) {
139
+ let tooMany = null;
140
+ let d1 = data;
141
+ if (data.length > maxItems) {
142
+ const n = data.length - maxItems;
143
+ d1 = data.slice(0, maxItems);
144
+ tooMany = h("li.too-many", `and ${n} more`);
145
+ }
146
+
147
+ return h("ul.truncated-list", { className }, [
148
+ d1.map((d, i) => {
149
+ return h("li.element", { key: i }, h(itemRenderer, { data: d }));
150
+ }),
151
+ tooMany,
152
+ ]);
153
+ }
154
+
155
+ export function groupNotesByPixelDistance<T = any>(
156
+ data: ColumnMeasurementData<T[]>[],
157
+ scale: CompositeColumnScale,
158
+ axisType: ColumnAxisType,
159
+ groupDistance: number,
160
+ ) {
161
+ /** Group notes that are within a certain pixel distance of each other
162
+ * in display space
163
+ */
164
+ if (data.length === 0 || groupDistance <= 0) return data;
165
+ if (axisType === ColumnAxisType.AGE || axisType === ColumnAxisType.DEPTH) {
166
+ data.sort((a, b) => b.height - a.height);
167
+ } else {
168
+ // Sort data by height (ascending up the column)
169
+ data.sort((a, b) => a.height - b.height);
170
+ }
171
+
172
+ const groupedData: ColumnMeasurementData<T[]>[] = [];
173
+ let currentGroup: ColumnMeasurementData<T[]> | null = null;
174
+ let currentGroupPosition: number = Infinity;
175
+
176
+ for (const d of data) {
177
+ // Check distance from current max position
178
+ // Pixels go up as we go down in the section
179
+
180
+ // The _top_ of the next group must be within groupDistance of the
181
+ // _bottom_ of the current group. This makes sure that we don't collapse
182
+ // groups that are separated by a large distance
183
+ const distance = currentGroupPosition - scale(d.top_height ?? d.height);
184
+
185
+ if (distance <= groupDistance) {
186
+ if (currentGroup == null) {
187
+ throw new Error("Current group is null when it shouldn't be");
188
+ }
189
+ // Merge into current group
190
+ currentGroup.data.push(...d.data);
191
+ // Update height range
192
+ const top_height = d.top_height ?? d.height;
193
+ if (
194
+ axisType === ColumnAxisType.AGE ||
195
+ axisType === ColumnAxisType.DEPTH
196
+ ) {
197
+ // Inverted axis
198
+ currentGroup.top_height = Math.min(currentGroup.top_height, top_height);
199
+ } else {
200
+ currentGroup.top_height = Math.max(currentGroup.top_height, top_height);
201
+ }
202
+ currentGroup.key = `${currentGroup.height}-${currentGroup.top_height}`;
203
+ } else {
204
+ // Start a new group
205
+ currentGroup = { ...d, data: [...d.data] };
206
+ currentGroupPosition =
207
+ scale(currentGroup.height) ??
208
+ scale(currentGroup.top_height) ??
209
+ Infinity;
210
+ groupedData.push(currentGroup);
211
+ }
212
+ }
213
+
214
+ return groupedData;
215
+ }
@@ -1,38 +1,2 @@
1
- import h from "@macrostrat/hyper";
2
- import { useAPIResult } from "@macrostrat/ui-components";
3
- import { BaseMeasurementsColumn, TruncatedList } from "../base-sample-column";
4
-
5
- function useSGPData({ col_id }) {
6
- const res = useAPIResult(
7
- "https://dev.macrostrat.org/api/pg/sgp_unit_matches",
8
- {
9
- col_id: `eq.${col_id}`,
10
- },
11
- (d) => d,
12
- );
13
- return res;
14
- }
15
-
16
- export function SGPMeasurementsColumn({ columnID, color = "magenta" }) {
17
- const data = useSGPData({ col_id: columnID });
18
-
19
- if (data == null) return null;
20
-
21
- return h(BaseMeasurementsColumn, {
22
- data,
23
- noteComponent: SGPSamplesNote,
24
- });
25
- }
26
-
27
- function SGPSamplesNote(props) {
28
- const { note } = props;
29
- const sgp_samples = note?.data?.sgp_samples;
30
-
31
- if (sgp_samples == null || sgp_samples.length === 0) return null;
32
-
33
- return h(TruncatedList, {
34
- className: "sgp-samples",
35
- data: sgp_samples,
36
- itemRenderer: (p) => h("span", p.data.name),
37
- });
38
- }
1
+ export * from "./base";
2
+ export * from "./sgp";
@@ -0,0 +1,91 @@
1
+ import h from "@macrostrat/hyper";
2
+ import { useAPIResult } from "@macrostrat/ui-components";
3
+ import {
4
+ BaseMeasurementsColumn,
5
+ groupNotesByPixelDistance,
6
+ standardizeMeasurementHeight,
7
+ TruncatedList,
8
+ } from "./base";
9
+ import { UnitLong } from "@macrostrat/api-types";
10
+ import { ColumnAxisType } from "@macrostrat/column-components";
11
+ import {
12
+ useCompositeScale,
13
+ useMacrostratColumnData,
14
+ } from "../../data-provider";
15
+ import { CompositeColumnScale } from "../../prepare-units/composite-scale";
16
+
17
+ function useSGPData({ col_id }) {
18
+ const res = useAPIResult(
19
+ "https://dev.macrostrat.org/api/pg/sgp_unit_matches",
20
+ {
21
+ col_id: `eq.${col_id}`,
22
+ },
23
+ (d) => d,
24
+ );
25
+ return res;
26
+ }
27
+
28
+ interface SGPSampleData {
29
+ col_id: number;
30
+ unit_id: number;
31
+ sgp_samples: { name: string; id: number }[];
32
+ }
33
+
34
+ export function SGPMeasurementsColumn({ columnID, color = "magenta" }) {
35
+ const data: SGPSampleData[] | null = useSGPData({ col_id: columnID });
36
+ const { axisType, units } = useMacrostratColumnData();
37
+ const scale = useCompositeScale();
38
+
39
+ if (data == null || units == null || scale == null) return null;
40
+
41
+ const data1 = prepareSGPData(data, scale, units, axisType);
42
+
43
+ return h(BaseMeasurementsColumn, {
44
+ data: data1,
45
+ noteComponent: SGPSamplesNote,
46
+ focusedNoteComponent: SGPSamplesNote,
47
+ });
48
+ }
49
+
50
+ function SGPSamplesNote(props) {
51
+ const { note, focused } = props;
52
+ const sgp_samples = note?.data;
53
+
54
+ if (sgp_samples == null || sgp_samples.length === 0) return null;
55
+
56
+ return h(TruncatedList, {
57
+ className: "sgp-samples",
58
+ data: sgp_samples,
59
+ itemRenderer: (p) => h("span", p.data.name),
60
+ maxItems: focused ? Infinity : 5,
61
+ });
62
+ }
63
+
64
+ function prepareSGPData(
65
+ data: SGPSampleData[],
66
+ scale: CompositeColumnScale,
67
+ units: UnitLong[],
68
+ axisType: ColumnAxisType,
69
+ ) {
70
+ // Find matching units for samples
71
+ const d1 = data
72
+ .map((sample) => {
73
+ const data = sample.sgp_samples;
74
+ if (data == null || data.length === 0) return null;
75
+ const heightData = standardizeMeasurementHeight(
76
+ { unit_id: sample.unit_id },
77
+ units,
78
+ axisType,
79
+ );
80
+ if (heightData == null) return null;
81
+ data.sort((a, b) => a.id - b.id);
82
+ return {
83
+ ...heightData,
84
+ data,
85
+ id: sample.unit_id,
86
+ };
87
+ })
88
+ .filter(Boolean);
89
+
90
+ return groupNotesByPixelDistance(d1, scale, axisType, 5);
91
+ }
package/src/notes.ts CHANGED
@@ -2,9 +2,9 @@ import h from "@macrostrat/hyper";
2
2
 
3
3
  import { ColumnNotesProvider } from "./units";
4
4
 
5
- import { StaticNotesColumn, SVG } from "@macrostrat/column-components";
5
+ import { NotesColumn, SVG } from "@macrostrat/column-components";
6
6
  import { useCompositeScale, useMacrostratColumnData } from "./data-provider";
7
- import type { ReactNode } from "react";
7
+ import type { ComponentType, ReactNode } from "react";
8
8
 
9
9
  interface ColumnNotesProps {
10
10
  notes: any[];
@@ -13,6 +13,7 @@ interface ColumnNotesProps {
13
13
  paddingLeft?: number;
14
14
  deltaConnectorAttachment?: number;
15
15
  children?: ReactNode;
16
+ focusedNoteComponent?: ComponentType<any> | null;
16
17
  }
17
18
 
18
19
  export function ColumnNotes({
@@ -21,6 +22,7 @@ export function ColumnNotes({
21
22
  noteComponent,
22
23
  paddingLeft = 60,
23
24
  deltaConnectorAttachment,
25
+ focusedNoteComponent,
24
26
  children,
25
27
  }: ColumnNotesProps) {
26
28
  const { totalHeight } = useMacrostratColumnData();
@@ -35,12 +37,13 @@ export function ColumnNotes({
35
37
  },
36
38
  [
37
39
  h(SVG, { width, height: totalHeight, paddingH: 4 }, [
38
- h(StaticNotesColumn, {
40
+ h(NotesColumn, {
39
41
  width,
40
42
  notes,
41
43
  noteComponent,
42
44
  paddingLeft,
43
45
  deltaConnectorAttachment,
46
+ focusedNoteComponent,
44
47
  }),
45
48
  ]),
46
49
  children,
@@ -57,15 +57,19 @@ export function prepareColumnUnits(
57
57
  scale,
58
58
  } = options;
59
59
 
60
+ let _totalHeight = null;
61
+
60
62
  if (scale != null) {
61
63
  // Set t_age and b_age based on scale domain if not already set
62
64
  const domain = scale.domain();
63
65
  if (axisType == ColumnAxisType.AGE) {
64
66
  if (t_age == null) t_age = Math.min(...domain);
65
67
  if (b_age == null) b_age = Math.max(...domain);
68
+ _totalHeight = Math.abs(scale(b_age) - scale(t_age));
66
69
  } else {
67
70
  if (t_pos == null) t_pos = Math.min(...domain);
68
71
  if (b_pos == null) b_pos = Math.max(...domain);
72
+ _totalHeight = Math.abs(scale(b_pos) - scale(t_pos));
69
73
  }
70
74
  }
71
75
 
@@ -166,7 +170,9 @@ export function prepareColumnUnits(
166
170
  );
167
171
  }
168
172
 
169
- /** Prepare section scale information using groups */
173
+ /** Prepare section scale information using groups.
174
+ * Total height is computed from section scales.
175
+ * */
170
176
  let { totalHeight, sections: sections2 } = finalizeSectionHeights(
171
177
  sectionsWithScales,
172
178
  unconformityHeight,
@@ -197,7 +203,7 @@ export function prepareColumnUnits(
197
203
 
198
204
  return {
199
205
  units: units2,
200
- totalHeight,
206
+ totalHeight: _totalHeight ?? totalHeight,
201
207
  sections: sectionsOut,
202
208
  };
203
209
  }