@macrostrat/column-views 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/esm/{column-views.c2fbcba8.js → column-views.04636815.js} +4 -4
  3. package/dist/esm/{column-views.c2fbcba8.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.60365cdb.js → column-views.0da4503a.js} +2 -2
  7. package/dist/esm/{column-views.60365cdb.js.map → column-views.0da4503a.js.map} +1 -1
  8. package/dist/esm/{column-views.53722d0a.js → column-views.107b47b4.js} +9 -9
  9. package/dist/esm/{column-views.53722d0a.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.29a551f6.js → column-views.2708e176.js} +22 -16
  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.d86555b0.js → column-views.2bac03a2.js} +2 -2
  19. package/dist/esm/{column-views.d86555b0.js.map → column-views.2bac03a2.js.map} +1 -1
  20. package/dist/esm/column-views.322790f3.js +138 -0
  21. package/dist/esm/column-views.322790f3.js.map +1 -0
  22. package/dist/esm/{column-views.6698b95a.js → column-views.343fc926.js} +9 -18
  23. package/dist/esm/column-views.343fc926.js.map +1 -0
  24. package/dist/esm/column-views.3c9cba65.js +13 -0
  25. package/dist/esm/{column-views.418f948f.js.map → column-views.3c9cba65.js.map} +1 -1
  26. package/dist/esm/{column-views.c3495702.js → column-views.3d3e00be.js} +2 -2
  27. package/dist/esm/{column-views.c3495702.js.map → column-views.3d3e00be.js.map} +1 -1
  28. package/dist/esm/{column-views.e1bc3cfa.js → column-views.40094dd9.js} +3 -3
  29. package/dist/esm/{column-views.e1bc3cfa.js.map → column-views.40094dd9.js.map} +1 -1
  30. package/dist/esm/{column-views.787d7696.js → column-views.44373a90.js} +8 -7
  31. package/dist/esm/column-views.44373a90.js.map +1 -0
  32. package/dist/esm/{column-views.8b623b27.js → column-views.488f24b6.js} +2 -2
  33. package/dist/esm/{column-views.8b623b27.js.map → column-views.488f24b6.js.map} +1 -1
  34. package/dist/esm/{column-views.4ed90896.js → column-views.4b259f9e.js} +42 -11
  35. package/dist/esm/column-views.4b259f9e.js.map +1 -0
  36. package/dist/esm/{column-views.1151416d.css → column-views.54c1f382.css} +6 -5
  37. package/dist/esm/column-views.54c1f382.css.map +1 -0
  38. package/dist/esm/{column-views.382c486d.js → column-views.565b193a.js} +3 -3
  39. package/dist/esm/{column-views.382c486d.js.map → column-views.565b193a.js.map} +1 -1
  40. package/dist/esm/{column-views.df34441c.js → column-views.5ca2b219.js} +5 -5
  41. package/dist/esm/{column-views.df34441c.js.map → column-views.5ca2b219.js.map} +1 -1
  42. package/dist/esm/{column-views.8284c3a9.js → column-views.5eb4e6ff.js} +5 -5
  43. package/dist/esm/{column-views.8284c3a9.js.map → column-views.5eb4e6ff.js.map} +1 -1
  44. package/dist/esm/{column-views.2e854496.js → column-views.5fff0716.js} +3 -3
  45. package/dist/esm/{column-views.2e854496.js.map → column-views.5fff0716.js.map} +1 -1
  46. package/dist/esm/{column-views.05586d1f.js → column-views.60e97132.js} +2 -4
  47. package/dist/esm/column-views.60e97132.js.map +1 -0
  48. package/dist/esm/{column-views.7683bb52.js → column-views.63d40878.js} +5 -5
  49. package/dist/esm/{column-views.7683bb52.js.map → column-views.63d40878.js.map} +1 -1
  50. package/dist/esm/{column-views.abeab9aa.js → column-views.6c9e5069.js} +40 -62
  51. package/dist/esm/column-views.6c9e5069.js.map +1 -0
  52. package/dist/esm/column-views.6df65dab.js +9 -0
  53. package/dist/esm/column-views.6df65dab.js.map +1 -0
  54. package/dist/esm/column-views.7fa0d026.js +62 -0
  55. package/dist/esm/column-views.7fa0d026.js.map +1 -0
  56. package/dist/esm/{column-views.3a7179c4.js → column-views.82eb5026.js} +12 -7
  57. package/dist/esm/column-views.82eb5026.js.map +1 -0
  58. package/dist/esm/{column-views.adec2e4c.js → column-views.92575b87.js} +3 -3
  59. package/dist/esm/column-views.92575b87.js.map +1 -0
  60. package/dist/esm/{column-views.41e5f0dc.js → column-views.9d51a5ab.js} +3 -3
  61. package/dist/esm/{column-views.41e5f0dc.js.map → column-views.9d51a5ab.js.map} +1 -1
  62. package/dist/esm/{column-views.0ce9b697.js → column-views.9ffc089b.js} +3 -3
  63. package/dist/esm/{column-views.0ce9b697.js.map → column-views.9ffc089b.js.map} +1 -1
  64. package/dist/esm/{column-views.70164236.js → column-views.aa9ede4d.js} +2 -2
  65. package/dist/esm/{column-views.70164236.js.map → column-views.aa9ede4d.js.map} +1 -1
  66. package/dist/esm/{column-views.413217dc.js → column-views.ad2fe46c.js} +2 -2
  67. package/dist/esm/{column-views.413217dc.js.map → column-views.ad2fe46c.js.map} +1 -1
  68. package/dist/esm/{column-views.0265cf7f.js → column-views.afe0bb48.js} +15 -10
  69. package/dist/esm/column-views.afe0bb48.js.map +1 -0
  70. package/dist/esm/{column-views.aecf25bc.js → column-views.b4e1236d.js} +2 -2
  71. package/dist/esm/{column-views.aecf25bc.js.map → column-views.b4e1236d.js.map} +1 -1
  72. package/dist/esm/{column-views.469a4952.js → column-views.c149f7a5.js} +3 -3
  73. package/dist/esm/{column-views.469a4952.js.map → column-views.c149f7a5.js.map} +1 -1
  74. package/dist/esm/column-views.c3c7901a.js +149 -0
  75. package/dist/esm/column-views.c3c7901a.js.map +1 -0
  76. package/dist/esm/{column-views.a3fabf0f.js → column-views.c44febd0.js} +9 -6
  77. package/dist/esm/column-views.c44febd0.js.map +1 -0
  78. package/dist/esm/{column-views.b7016f82.css → column-views.cb6fc808.css} +10 -10
  79. package/dist/esm/column-views.cb6fc808.css.map +1 -0
  80. package/dist/esm/column-views.cc733361.js.map +1 -1
  81. package/dist/esm/{column-views.f0b0fc56.js → column-views.ce3a3ac8.js} +2 -2
  82. package/dist/esm/{column-views.f0b0fc56.js.map → column-views.ce3a3ac8.js.map} +1 -1
  83. package/dist/esm/{column-views.b08d82e6.js → column-views.d1b49f5c.js} +2 -2
  84. package/dist/esm/{column-views.b08d82e6.js.map → column-views.d1b49f5c.js.map} +1 -1
  85. package/dist/esm/{column-views.2aef5df8.js → column-views.d524075b.js} +4 -4
  86. package/dist/esm/{column-views.2aef5df8.js.map → column-views.d524075b.js.map} +1 -1
  87. package/dist/esm/column-views.d5e788e8.js +31 -0
  88. package/dist/esm/column-views.d5e788e8.js.map +1 -0
  89. package/dist/esm/{column-views.bbc77227.js → column-views.d6c0b7bc.js} +2 -2
  90. package/dist/esm/{column-views.bbc77227.js.map → column-views.d6c0b7bc.js.map} +1 -1
  91. package/dist/esm/{column-views.b29f8718.js → column-views.dc195174.js} +2 -2
  92. package/dist/esm/{column-views.b29f8718.js.map → column-views.dc195174.js.map} +1 -1
  93. package/dist/esm/column-views.de433f18.js +139 -0
  94. package/dist/esm/column-views.de433f18.js.map +1 -0
  95. package/dist/esm/{column-views.2eceafb5.js → column-views.e075af15.js} +2 -2
  96. package/dist/esm/{column-views.2eceafb5.js.map → column-views.e075af15.js.map} +1 -1
  97. package/dist/esm/{column-views.e33ac5c9.css → column-views.e93478c3.css} +7 -2
  98. package/dist/esm/column-views.e93478c3.css.map +1 -0
  99. package/dist/esm/{column-views.cae1a6a1.js → column-views.f7cdf6be.js} +3 -3
  100. package/dist/esm/{column-views.cae1a6a1.js.map → column-views.f7cdf6be.js.map} +1 -1
  101. package/dist/esm/{column-views.81bddbee.js → column-views.faa7e52e.js} +4 -4
  102. package/dist/esm/{column-views.81bddbee.js.map → column-views.faa7e52e.js.map} +1 -1
  103. package/dist/esm/index.d.ts +43 -20
  104. package/dist/esm/index.d.ts.map +1 -1
  105. package/dist/esm/index.js +12 -12
  106. package/dist/node/column-views.012fa10c.js +2 -0
  107. package/dist/node/column-views.012fa10c.js.map +1 -0
  108. package/dist/node/{column-views.edb4ba54.js → column-views.021a6961.js} +2 -2
  109. package/dist/node/{column-views.edb4ba54.js.map → column-views.021a6961.js.map} +1 -1
  110. package/dist/node/{column-views.f1ad131a.js → column-views.08bef1f6.js} +2 -2
  111. package/dist/node/{column-views.f1ad131a.js.map → column-views.08bef1f6.js.map} +1 -1
  112. package/dist/node/column-views.0beae29d.js +2 -0
  113. package/dist/node/column-views.0beae29d.js.map +1 -0
  114. package/dist/node/{column-views.6b8424fd.js → column-views.0f401891.js} +2 -2
  115. package/dist/node/{column-views.6b8424fd.js.map → column-views.0f401891.js.map} +1 -1
  116. package/dist/node/column-views.1d064426.js +2 -0
  117. package/dist/node/column-views.1d064426.js.map +1 -0
  118. package/dist/node/{column-views.ce5904a6.js → column-views.2577dec0.js} +2 -2
  119. package/dist/node/{column-views.ce5904a6.js.map → column-views.2577dec0.js.map} +1 -1
  120. package/dist/node/{column-views.45a03acc.js → column-views.2fe8feb9.js} +2 -2
  121. package/dist/node/{column-views.45a03acc.js.map → column-views.2fe8feb9.js.map} +1 -1
  122. package/dist/node/{column-views.ebe61439.js → column-views.42bc66a8.js} +2 -2
  123. package/dist/node/{column-views.ebe61439.js.map → column-views.42bc66a8.js.map} +1 -1
  124. package/dist/node/{column-views.ae9536b3.js → column-views.465e593b.js} +2 -2
  125. package/dist/node/{column-views.ae9536b3.js.map → column-views.465e593b.js.map} +1 -1
  126. package/dist/node/column-views.46efb749.js +2 -0
  127. package/dist/node/column-views.46efb749.js.map +1 -0
  128. package/dist/node/{column-views.554d44a7.js → column-views.47440961.js} +2 -2
  129. package/dist/node/{column-views.554d44a7.js.map → column-views.47440961.js.map} +1 -1
  130. package/dist/node/column-views.5361f0e2.js +2 -0
  131. package/dist/node/column-views.5361f0e2.js.map +1 -0
  132. package/dist/node/{column-views.f0f5cefd.js → column-views.5559de6a.js} +2 -2
  133. package/dist/node/{column-views.f0f5cefd.js.map → column-views.5559de6a.js.map} +1 -1
  134. package/dist/node/column-views.56f88b8c.js +2 -0
  135. package/dist/node/column-views.56f88b8c.js.map +1 -0
  136. package/dist/node/{column-views.0b3a384e.js → column-views.5a9331a9.js} +2 -2
  137. package/dist/node/{column-views.0b3a384e.js.map → column-views.5a9331a9.js.map} +1 -1
  138. package/dist/node/column-views.5fd6e11a.js +2 -0
  139. package/dist/node/column-views.5fd6e11a.js.map +1 -0
  140. package/dist/node/column-views.672b683c.js +2 -0
  141. package/dist/node/column-views.672b683c.js.map +1 -0
  142. package/dist/node/{column-views.07c503d3.js → column-views.6c7f9245.js} +2 -2
  143. package/dist/node/column-views.6c7f9245.js.map +1 -0
  144. package/dist/node/{column-views.4b4c214a.js → column-views.75456275.js} +2 -2
  145. package/dist/node/{column-views.4b4c214a.js.map → column-views.75456275.js.map} +1 -1
  146. package/dist/node/column-views.75ba0464.css +2 -0
  147. package/dist/node/column-views.75ba0464.css.map +1 -0
  148. package/dist/node/column-views.777b9bb6.js +2 -0
  149. package/dist/node/column-views.777b9bb6.js.map +1 -0
  150. package/dist/node/{column-views.93febe9b.js → column-views.7c322202.js} +2 -2
  151. package/dist/node/{column-views.93febe9b.js.map → column-views.7c322202.js.map} +1 -1
  152. package/dist/node/column-views.7cc1a14f.js +2 -0
  153. package/dist/node/column-views.7cc1a14f.js.map +1 -0
  154. package/dist/node/{column-views.fcdc74c4.js → column-views.8e846c57.js} +2 -2
  155. package/dist/node/{column-views.fcdc74c4.js.map → column-views.8e846c57.js.map} +1 -1
  156. package/dist/node/{column-views.6919fd2a.js → column-views.8ee8469d.js} +2 -2
  157. package/dist/node/{column-views.6919fd2a.js.map → column-views.8ee8469d.js.map} +1 -1
  158. package/dist/node/{column-views.588b02a1.js → column-views.93bde6c1.js} +2 -2
  159. package/dist/node/{column-views.588b02a1.js.map → column-views.93bde6c1.js.map} +1 -1
  160. package/dist/node/{column-views.94c84716.js → column-views.a14f0134.js} +2 -2
  161. package/dist/node/{column-views.94c84716.js.map → column-views.a14f0134.js.map} +1 -1
  162. package/dist/node/{column-views.aef76eee.js → column-views.a596b1f5.js} +2 -2
  163. package/dist/node/{column-views.aef76eee.js.map → column-views.a596b1f5.js.map} +1 -1
  164. package/dist/node/column-views.af480651.js +2 -0
  165. package/dist/node/column-views.af480651.js.map +1 -0
  166. package/dist/node/column-views.b103acbc.js +2 -0
  167. package/dist/node/column-views.b103acbc.js.map +1 -0
  168. package/dist/node/column-views.b40c1b9c.js +2 -0
  169. package/dist/node/column-views.b40c1b9c.js.map +1 -0
  170. package/dist/node/column-views.b6e86cf0.js +2 -0
  171. package/dist/node/column-views.b6e86cf0.js.map +1 -0
  172. package/dist/node/{column-views.6099a3a9.js → column-views.c007152b.js} +2 -2
  173. package/dist/node/{column-views.6099a3a9.js.map → column-views.c007152b.js.map} +1 -1
  174. package/dist/node/{column-views.db4ccacc.js → column-views.c921fa1a.js} +2 -2
  175. package/dist/node/{column-views.db4ccacc.js.map → column-views.c921fa1a.js.map} +1 -1
  176. package/dist/node/{column-views.a1e29a15.js → column-views.c9880a4d.js} +2 -2
  177. package/dist/node/{column-views.a1e29a15.js.map → column-views.c9880a4d.js.map} +1 -1
  178. package/dist/node/column-views.ccfb9afb.css +2 -0
  179. package/dist/node/column-views.ccfb9afb.css.map +1 -0
  180. package/dist/node/{column-views.32344397.js → column-views.cd54f1b1.js} +2 -2
  181. package/dist/node/{column-views.32344397.js.map → column-views.cd54f1b1.js.map} +1 -1
  182. package/dist/node/{column-views.0201566d.js → column-views.d77d260b.js} +2 -2
  183. package/dist/node/{column-views.0201566d.js.map → column-views.d77d260b.js.map} +1 -1
  184. package/dist/node/{column-views.54363c13.js → column-views.d818b387.js} +2 -2
  185. package/dist/node/{column-views.54363c13.js.map → column-views.d818b387.js.map} +1 -1
  186. package/dist/node/{column-views.29483479.js → column-views.d8821a96.js} +2 -2
  187. package/dist/node/{column-views.29483479.js.map → column-views.d8821a96.js.map} +1 -1
  188. package/dist/node/column-views.dbb4a46b.js +2 -0
  189. package/dist/node/column-views.dbb4a46b.js.map +1 -0
  190. package/dist/node/{column-views.e803e4ae.css → column-views.ddc6184e.css} +2 -2
  191. package/dist/node/column-views.ddc6184e.css.map +1 -0
  192. package/dist/node/{column-views.44952ae6.js → column-views.e264a767.js} +2 -2
  193. package/dist/node/{column-views.44952ae6.js.map → column-views.e264a767.js.map} +1 -1
  194. package/dist/node/column-views.e93b3bdb.js +2 -0
  195. package/dist/node/column-views.e93b3bdb.js.map +1 -0
  196. package/dist/node/{column-views.57dd069c.js → column-views.ec691859.js} +2 -2
  197. package/dist/node/{column-views.57dd069c.js.map → column-views.ec691859.js.map} +1 -1
  198. package/dist/node/column-views.ec7cc7cc.js +2 -0
  199. package/dist/node/column-views.ec7cc7cc.js.map +1 -0
  200. package/dist/node/{column-views.aae09aca.js → column-views.eecdc727.js} +2 -2
  201. package/dist/node/{column-views.aae09aca.js.map → column-views.eecdc727.js.map} +1 -1
  202. package/dist/node/{column-views.108db52e.js → column-views.f577d065.js} +2 -2
  203. package/dist/node/{column-views.108db52e.js.map → column-views.f577d065.js.map} +1 -1
  204. package/dist/node/column-views.fac4baff.js +2 -0
  205. package/dist/node/column-views.fac4baff.js.map +1 -0
  206. package/dist/node/index.js +1 -1
  207. package/dist/node/index.js.map +1 -1
  208. package/package.json +2 -2
  209. package/src/age-axis.ts +1 -1
  210. package/src/column.module.sass +7 -5
  211. package/src/column.ts +29 -7
  212. package/src/correlation-chart/stories/correlation-chart.stories.ts +1 -1
  213. package/src/data-provider/store.ts +48 -5
  214. package/src/data-provider/unit-selection.ts +1 -0
  215. package/src/facets/detrital-zircon/index.ts +78 -11
  216. package/src/facets/detrital-zircon/provider.ts +1 -1
  217. package/src/facets/fossils/index.ts +145 -215
  218. package/src/facets/fossils/provider.ts +18 -25
  219. package/src/facets/fossils/taxon-ranges.ts +220 -0
  220. package/src/facets/index.ts +0 -1
  221. package/src/facets/{base-sample-column.module.sass → measurements/base.module.sass} +1 -0
  222. package/src/facets/measurements/base.ts +215 -0
  223. package/src/facets/measurements/index.ts +2 -38
  224. package/src/facets/measurements/sgp.ts +91 -0
  225. package/src/notes.ts +6 -3
  226. package/src/prepare-units/index.ts +8 -2
  227. package/src/prepare-units/utils.ts +55 -9
  228. package/src/section.ts +9 -4
  229. package/src/unit-details/panel.ts +2 -1
  230. package/dist/esm/column-views.0265cf7f.js.map +0 -1
  231. package/dist/esm/column-views.05586d1f.js.map +0 -1
  232. package/dist/esm/column-views.1151416d.css.map +0 -1
  233. package/dist/esm/column-views.29a551f6.js.map +0 -1
  234. package/dist/esm/column-views.3a7179c4.js.map +0 -1
  235. package/dist/esm/column-views.418f948f.js +0 -15
  236. package/dist/esm/column-views.4ed90896.js.map +0 -1
  237. package/dist/esm/column-views.54f8b909.js.map +0 -1
  238. package/dist/esm/column-views.6698b95a.js.map +0 -1
  239. package/dist/esm/column-views.6e7082db.js +0 -16
  240. package/dist/esm/column-views.6e7082db.js.map +0 -1
  241. package/dist/esm/column-views.748dce47.js +0 -95
  242. package/dist/esm/column-views.748dce47.js.map +0 -1
  243. package/dist/esm/column-views.787d7696.js.map +0 -1
  244. package/dist/esm/column-views.a3fabf0f.js.map +0 -1
  245. package/dist/esm/column-views.abeab9aa.js.map +0 -1
  246. package/dist/esm/column-views.adec2e4c.js.map +0 -1
  247. package/dist/esm/column-views.b7016f82.css.map +0 -1
  248. package/dist/esm/column-views.e17f00d3.js +0 -37
  249. package/dist/esm/column-views.e17f00d3.js.map +0 -1
  250. package/dist/esm/column-views.e33ac5c9.css.map +0 -1
  251. package/dist/esm/column-views.ea4ebbb7.js +0 -31
  252. package/dist/esm/column-views.ea4ebbb7.js.map +0 -1
  253. package/dist/esm/column-views.faacfc3c.js +0 -92
  254. package/dist/esm/column-views.faacfc3c.js.map +0 -1
  255. package/dist/node/column-views.07c503d3.js.map +0 -1
  256. package/dist/node/column-views.0e7ac946.js +0 -2
  257. package/dist/node/column-views.0e7ac946.js.map +0 -1
  258. package/dist/node/column-views.16f336ee.js +0 -2
  259. package/dist/node/column-views.16f336ee.js.map +0 -1
  260. package/dist/node/column-views.18d54bbb.js +0 -2
  261. package/dist/node/column-views.18d54bbb.js.map +0 -1
  262. package/dist/node/column-views.19a84c01.js +0 -2
  263. package/dist/node/column-views.19a84c01.js.map +0 -1
  264. package/dist/node/column-views.1a3c399e.js +0 -2
  265. package/dist/node/column-views.1a3c399e.js.map +0 -1
  266. package/dist/node/column-views.29eb25bd.css +0 -2
  267. package/dist/node/column-views.29eb25bd.css.map +0 -1
  268. package/dist/node/column-views.312db572.js +0 -2
  269. package/dist/node/column-views.312db572.js.map +0 -1
  270. package/dist/node/column-views.573cb29d.js +0 -2
  271. package/dist/node/column-views.573cb29d.js.map +0 -1
  272. package/dist/node/column-views.5a8bc8e3.js +0 -2
  273. package/dist/node/column-views.5a8bc8e3.js.map +0 -1
  274. package/dist/node/column-views.5f3b0b04.js +0 -2
  275. package/dist/node/column-views.5f3b0b04.js.map +0 -1
  276. package/dist/node/column-views.77ace3a2.js +0 -2
  277. package/dist/node/column-views.77ace3a2.js.map +0 -1
  278. package/dist/node/column-views.8f54691f.js +0 -2
  279. package/dist/node/column-views.8f54691f.js.map +0 -1
  280. package/dist/node/column-views.92e29010.js +0 -2
  281. package/dist/node/column-views.92e29010.js.map +0 -1
  282. package/dist/node/column-views.a16cd1f2.js +0 -2
  283. package/dist/node/column-views.a16cd1f2.js.map +0 -1
  284. package/dist/node/column-views.abe0a664.js +0 -2
  285. package/dist/node/column-views.abe0a664.js.map +0 -1
  286. package/dist/node/column-views.cd7b223b.css +0 -2
  287. package/dist/node/column-views.cd7b223b.css.map +0 -1
  288. package/dist/node/column-views.d4545f9f.js +0 -2
  289. package/dist/node/column-views.d4545f9f.js.map +0 -1
  290. package/dist/node/column-views.e803e4ae.css.map +0 -1
  291. package/dist/node/column-views.f7d72702.js +0 -2
  292. package/dist/node/column-views.f7d72702.js.map +0 -1
  293. package/src/facets/base-sample-column.ts +0 -114
  294. package/src/facets/measurements/provider.ts +0 -80
  295. /package/src/facets/fossils/{index.module.sass → taxon-ranges.module.sass} +0 -0
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/column-views/src/prepare-units/dynamic-scales.ts"],"sourcesContent":["import type { UnitLong } from \"@macrostrat/api-types\";\nimport { scaleLinear } from \"d3-scale\";\nimport { getUnitHeightRange } from \"./utils\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { mergeAgeRanges, MergeMode } from \"@macrostrat/stratigraphy-utils\";\nimport type {\n ApproxHeightScaleOptions,\n ExtUnit,\n HybridScaleDefinition,\n HybridScaleOptions,\n PackageScaleInfo,\n} from \"./types\";\nimport { HybridScaleType, HeightMethod } from \"./types\";\n\ninterface BaseSurface {\n index: number;\n age: number;\n units_below: number[];\n units_above: number[];\n}\n\nexport function buildColumnSurfaces<T extends UnitLong>(\n units: T[],\n tolerance: number = 0.001,\n): BaseSurface[] {\n /** Compute age surfaces for a column based on unit tops and bottoms */\n const surfaces: Omit<BaseSurface, \"index\">[] = [];\n for (const unit of units) {\n // Top surface\n surfaces.push({\n age: unit.t_age,\n units_below: [unit.unit_id],\n units_above: [],\n });\n // Bottom surface\n surfaces.push({\n age: unit.b_age,\n units_above: [unit.unit_id],\n units_below: [],\n });\n }\n\n // Merge duplicate surfaces (same age)\n const mergedSurfaces: Omit<BaseSurface, \"index\">[] = [];\n for (const surface of surfaces) {\n const existingSurface = mergedSurfaces.find(\n (s) => Math.abs(s.age - surface.age) < tolerance,\n );\n if (existingSurface) {\n existingSurface.units_above.push(...surface.units_above);\n existingSurface.units_below.push(...surface.units_below);\n } else {\n mergedSurfaces.push(surface);\n }\n }\n\n // Sort surfaces by age (ascending)\n mergedSurfaces.sort((a, b) => a.age - b.age);\n\n return mergedSurfaces.map((s, i) => ({ ...s, index: i }));\n}\n\ninterface AgeDomainUnitInfo {\n t_age: number;\n b_age: number;\n units: ExtUnit[];\n}\n\nfunction getUnitsInAgeDomains(\n surfaces: BaseSurface[],\n units: ExtUnit[],\n): AgeDomainUnitInfo[] {\n // Get unit IDs represented between the same surface, and the proportion of their total height represented\n const domainUnitInfo: AgeDomainUnitInfo[] = [];\n for (let i = 0; i < surfaces.length - 1; i++) {\n const topSurface = surfaces[i];\n const bottomSurface = surfaces[i + 1];\n const unitsInDomain = units.filter((unit) => {\n return (\n unit.t_age <= topSurface.age + 0.001 &&\n unit.b_age >= bottomSurface.age - 0.001\n );\n });\n domainUnitInfo.push({\n t_age: topSurface.age,\n b_age: bottomSurface.age,\n units: unitsInDomain,\n });\n }\n return domainUnitInfo;\n}\n\nfunction proportionOfUnitInDomain(\n unit: ExtUnit,\n t_age: number,\n b_age: number,\n): number {\n // Compute the proportion of a unit's height that lies within the given age domain\n\n const rng = getUnitHeightRange(unit, ColumnAxisType.AGE);\n const rng1: [number, number] = [b_age, t_age];\n // Compute overlap\n\n const mergedRange = mergeAgeRanges([rng, rng1], MergeMode.Inner);\n\n const unitHeight = Math.abs(rng[1] - rng[0]);\n const mergedHeight = Math.abs(mergedRange[1] - mergedRange[0]);\n\n return mergedHeight / unitHeight;\n}\n\nexport function buildHybridScale<T extends UnitLong>(\n def: HybridScaleDefinition,\n units: T[],\n domain: [number, number],\n options: HybridScaleOptions = {},\n): PackageScaleInfo {\n const surfaces = buildColumnSurfaces(units);\n\n const filteredSurfaces = surfaces.filter(\n (s) => s.age < Math.max(...domain) && s.age > Math.min(...domain),\n );\n\n const s1 = [\n { index: -1, age: Math.min(...domain), units_above: [], units_below: [] },\n ...filteredSurfaces,\n {\n index: -1,\n age: Math.max(...domain),\n units_above: [],\n units_below: [],\n },\n ];\n\n const { type, ...rest } = def;\n\n if (type === HybridScaleType.EquidistantSurfaces) {\n return buildScaleFromSurfacesSimple(s1, options);\n }\n\n return buildApproximateHeightScale(s1, units, { ...options, ...rest });\n}\n\nfunction getApproximateHeight(\n unit: ExtUnit,\n method: HeightMethod = HeightMethod.Maximum,\n): number | null {\n // Get approximate height of a unit based on specified method\n const heights = [];\n let minHeight = unit.min_thick;\n if (method === HeightMethod.Minimum || method === HeightMethod.Average) {\n const h = unit.min_thick;\n if (h != null && !isNaN(h) && h > 0) heights.push(h);\n }\n if (method === HeightMethod.Average || method === HeightMethod.Maximum) {\n const h = unit.max_thick;\n if (h != null && !isNaN(h) && h > 0) heights.push(h);\n }\n\n if (heights.length === 0) return null;\n\n if (method === HeightMethod.Average) {\n return heights.reduce((sum, h) => sum + h, 0) / heights.length;\n } else {\n return heights[0];\n }\n}\n\nexport function buildApproximateHeightScale(\n surfaces: BaseSurface[],\n units: UnitLong[],\n options: HybridScaleOptions & ApproxHeightScaleOptions = {},\n): PackageScaleInfo {\n /** Build a variable age scale that places age surfaces equally far apart in height space.\n * It is presumed that gaps are already removed from the unit set provided.\n * */\n\n const {\n pixelScale = 1, // pixels per meter\n pixelOffset = 0,\n minHeight = 5,\n heightMethod = HeightMethod.Maximum,\n // Default height for when height is unknown\n defaultHeight = 100,\n } = options;\n\n // Get units associated with each surface\n // Note: we could hoist this if it proved useful for other scale types\n const domainInfo = getUnitsInAgeDomains(surfaces, units as ExtUnit[]);\n\n // Compute the height in pixels for each surface\n\n const surfaceHeights = [];\n const ageDomain = [];\n let lastHeight = pixelOffset;\n\n for (const domain of domainInfo) {\n if (lastHeight == pixelOffset) {\n surfaceHeights.push(lastHeight);\n ageDomain.push(domain.t_age);\n }\n\n // Approximate height based on units in this domain\n const units = domain.units;\n let unitHeightInfo: { unit: ExtUnit; height: number }[] = [];\n\n for (const unit of units) {\n const proportion = proportionOfUnitInDomain(\n unit,\n domain.t_age,\n domain.b_age,\n );\n const height = getApproximateHeight(unit, heightMethod);\n if (height != null) {\n unitHeightInfo.push({ unit, height: height * proportion });\n }\n }\n\n let thisHeight = 0;\n if (unitHeightInfo.length === 0) {\n thisHeight = defaultHeight; // Default height if no units with height info\n } else {\n // Normalize weights (take the mean)\n\n const meanHeight =\n unitHeightInfo.reduce((sum, d) => sum + d.height, 0) /\n unitHeightInfo.length;\n\n if (meanHeight == 0) {\n thisHeight = defaultHeight; // Arbitrary height for zero-height intervals\n } else if (meanHeight < minHeight) {\n thisHeight = minHeight; // Minimum height\n } else {\n thisHeight = meanHeight;\n }\n }\n\n lastHeight += thisHeight;\n surfaceHeights.push(lastHeight);\n ageDomain.push(domain.b_age);\n }\n\n // Build a piecewise linear scale mapping age to pixel height\n const pixelRange = surfaceHeights.map((h) => h * pixelScale);\n\n const scale = scaleLinear().domain(ageDomain).range(pixelRange);\n\n const heightDomain = surfaceHeights.map((h) => lastHeight - h);\n\n const heightScale = scaleLinear().domain(heightDomain).range(pixelRange);\n\n const domain: [number, number] = [\n ageDomain[ageDomain.length - 1],\n ageDomain[0],\n ];\n\n return {\n scale,\n pixelScale: null, // pixels per unit\n domain,\n pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),\n heightScale,\n };\n}\n\nexport function buildScaleFromSurfacesSimple(\n surfaces: BaseSurface[],\n options: HybridScaleOptions = {},\n): PackageScaleInfo {\n /** Build a variable age scale that places age surfaces equally far apart in height space.\n * It is presumed that gaps are already removed from the unit set provided.\n * */\n\n const { pixelScale = 30 } = options;\n\n const domain: [number, number] = [\n surfaces[surfaces.length - 1].age,\n surfaces[0].age,\n ];\n // Compute the height in pixels for each surface\n\n const surfaceHeights = surfaces.map((surface, i) => {\n return i * pixelScale;\n });\n\n // Build a piecewise linear scale mapping age to pixel height\n const ageDomain = surfaces.map((s) => s.age);\n const pixelRange = surfaceHeights;\n\n const scale = scaleLinear().domain(ageDomain).range(pixelRange);\n\n return {\n scale,\n pixelScale: null, // pixels per unit\n domain,\n pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),\n };\n}\n"],"names":[],"version":3,"file":"column-views.70164236.js.map"}
1
+ {"mappings":"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","sources":["packages/column-views/src/prepare-units/dynamic-scales.ts"],"sourcesContent":["import type { UnitLong } from \"@macrostrat/api-types\";\nimport { scaleLinear } from \"d3-scale\";\nimport { getUnitHeightRange } from \"./utils\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { mergeAgeRanges, MergeMode } from \"@macrostrat/stratigraphy-utils\";\nimport type {\n ApproxHeightScaleOptions,\n ExtUnit,\n HybridScaleDefinition,\n HybridScaleOptions,\n PackageScaleInfo,\n} from \"./types\";\nimport { HybridScaleType, HeightMethod } from \"./types\";\n\ninterface BaseSurface {\n index: number;\n age: number;\n units_below: number[];\n units_above: number[];\n}\n\nexport function buildColumnSurfaces<T extends UnitLong>(\n units: T[],\n tolerance: number = 0.001,\n): BaseSurface[] {\n /** Compute age surfaces for a column based on unit tops and bottoms */\n const surfaces: Omit<BaseSurface, \"index\">[] = [];\n for (const unit of units) {\n // Top surface\n surfaces.push({\n age: unit.t_age,\n units_below: [unit.unit_id],\n units_above: [],\n });\n // Bottom surface\n surfaces.push({\n age: unit.b_age,\n units_above: [unit.unit_id],\n units_below: [],\n });\n }\n\n // Merge duplicate surfaces (same age)\n const mergedSurfaces: Omit<BaseSurface, \"index\">[] = [];\n for (const surface of surfaces) {\n const existingSurface = mergedSurfaces.find(\n (s) => Math.abs(s.age - surface.age) < tolerance,\n );\n if (existingSurface) {\n existingSurface.units_above.push(...surface.units_above);\n existingSurface.units_below.push(...surface.units_below);\n } else {\n mergedSurfaces.push(surface);\n }\n }\n\n // Sort surfaces by age (ascending)\n mergedSurfaces.sort((a, b) => a.age - b.age);\n\n return mergedSurfaces.map((s, i) => ({ ...s, index: i }));\n}\n\ninterface AgeDomainUnitInfo {\n t_age: number;\n b_age: number;\n units: ExtUnit[];\n}\n\nfunction getUnitsInAgeDomains(\n surfaces: BaseSurface[],\n units: ExtUnit[],\n): AgeDomainUnitInfo[] {\n // Get unit IDs represented between the same surface, and the proportion of their total height represented\n const domainUnitInfo: AgeDomainUnitInfo[] = [];\n for (let i = 0; i < surfaces.length - 1; i++) {\n const topSurface = surfaces[i];\n const bottomSurface = surfaces[i + 1];\n const unitsInDomain = units.filter((unit) => {\n return (\n unit.t_age <= topSurface.age + 0.001 &&\n unit.b_age >= bottomSurface.age - 0.001\n );\n });\n domainUnitInfo.push({\n t_age: topSurface.age,\n b_age: bottomSurface.age,\n units: unitsInDomain,\n });\n }\n return domainUnitInfo;\n}\n\nfunction proportionOfUnitInDomain(\n unit: ExtUnit,\n t_age: number,\n b_age: number,\n): number {\n // Compute the proportion of a unit's height that lies within the given age domain\n\n const rng = getUnitHeightRange(unit, ColumnAxisType.AGE);\n const rng1: [number, number] = [b_age, t_age];\n // Compute overlap\n\n const mergedRange = mergeAgeRanges([rng, rng1], MergeMode.Inner);\n\n const unitHeight = Math.abs(rng[1] - rng[0]);\n const mergedHeight = Math.abs(mergedRange[1] - mergedRange[0]);\n\n return mergedHeight / unitHeight;\n}\n\nexport function buildHybridScale<T extends UnitLong>(\n def: HybridScaleDefinition,\n units: T[],\n domain: [number, number],\n options: HybridScaleOptions = {},\n): PackageScaleInfo {\n const surfaces = buildColumnSurfaces(units);\n\n const filteredSurfaces = surfaces.filter(\n (s) => s.age < Math.max(...domain) && s.age > Math.min(...domain),\n );\n\n const s1 = [\n { index: -1, age: Math.min(...domain), units_above: [], units_below: [] },\n ...filteredSurfaces,\n {\n index: -1,\n age: Math.max(...domain),\n units_above: [],\n units_below: [],\n },\n ];\n\n const { type, ...rest } = def;\n\n if (type === HybridScaleType.EquidistantSurfaces) {\n return buildScaleFromSurfacesSimple(s1, options);\n }\n\n return buildApproximateHeightScale(s1, units, { ...options, ...rest });\n}\n\nfunction getApproximateHeight(\n unit: ExtUnit,\n method: HeightMethod = HeightMethod.Maximum,\n): number | null {\n // Get approximate height of a unit based on specified method\n const heights = [];\n let minHeight = unit.min_thick;\n if (method === HeightMethod.Minimum || method === HeightMethod.Average) {\n const h = unit.min_thick;\n if (h != null && !isNaN(h) && h > 0) heights.push(h);\n }\n if (method === HeightMethod.Average || method === HeightMethod.Maximum) {\n const h = unit.max_thick;\n if (h != null && !isNaN(h) && h > 0) heights.push(h);\n }\n\n if (heights.length === 0) return null;\n\n if (method === HeightMethod.Average) {\n return heights.reduce((sum, h) => sum + h, 0) / heights.length;\n } else {\n return heights[0];\n }\n}\n\nexport function buildApproximateHeightScale(\n surfaces: BaseSurface[],\n units: UnitLong[],\n options: HybridScaleOptions & ApproxHeightScaleOptions = {},\n): PackageScaleInfo {\n /** Build a variable age scale that places age surfaces equally far apart in height space.\n * It is presumed that gaps are already removed from the unit set provided.\n * */\n\n const {\n pixelScale = 1, // pixels per meter\n pixelOffset = 0,\n minHeight = 5,\n heightMethod = HeightMethod.Maximum,\n // Default height for when height is unknown\n defaultHeight = 100,\n } = options;\n\n // Get units associated with each surface\n // Note: we could hoist this if it proved useful for other scale types\n const domainInfo = getUnitsInAgeDomains(surfaces, units as ExtUnit[]);\n\n // Compute the height in pixels for each surface\n\n const surfaceHeights = [];\n const ageDomain = [];\n let lastHeight = pixelOffset;\n\n for (const domain of domainInfo) {\n if (lastHeight == pixelOffset) {\n surfaceHeights.push(lastHeight);\n ageDomain.push(domain.t_age);\n }\n\n // Approximate height based on units in this domain\n const units = domain.units;\n let unitHeightInfo: { unit: ExtUnit; height: number }[] = [];\n\n for (const unit of units) {\n const proportion = proportionOfUnitInDomain(\n unit,\n domain.t_age,\n domain.b_age,\n );\n const height = getApproximateHeight(unit, heightMethod);\n if (height != null) {\n unitHeightInfo.push({ unit, height: height * proportion });\n }\n }\n\n let thisHeight = 0;\n if (unitHeightInfo.length === 0) {\n thisHeight = defaultHeight; // Default height if no units with height info\n } else {\n // Normalize weights (take the mean)\n\n const meanHeight =\n unitHeightInfo.reduce((sum, d) => sum + d.height, 0) /\n unitHeightInfo.length;\n\n if (meanHeight == 0) {\n thisHeight = defaultHeight; // Arbitrary height for zero-height intervals\n } else if (meanHeight < minHeight) {\n thisHeight = minHeight; // Minimum height\n } else {\n thisHeight = meanHeight;\n }\n }\n\n lastHeight += thisHeight;\n surfaceHeights.push(lastHeight);\n ageDomain.push(domain.b_age);\n }\n\n // Build a piecewise linear scale mapping age to pixel height\n const pixelRange = surfaceHeights.map((h) => h * pixelScale);\n\n const scale = scaleLinear().domain(ageDomain).range(pixelRange);\n\n const heightDomain = surfaceHeights.map((h) => lastHeight - h);\n\n const heightScale = scaleLinear().domain(heightDomain).range(pixelRange);\n\n const domain: [number, number] = [\n ageDomain[ageDomain.length - 1],\n ageDomain[0],\n ];\n\n return {\n scale,\n pixelScale: null, // pixels per unit\n domain,\n pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),\n heightScale,\n };\n}\n\nexport function buildScaleFromSurfacesSimple(\n surfaces: BaseSurface[],\n options: HybridScaleOptions = {},\n): PackageScaleInfo {\n /** Build a variable age scale that places age surfaces equally far apart in height space.\n * It is presumed that gaps are already removed from the unit set provided.\n * */\n\n const { pixelScale = 30 } = options;\n\n const domain: [number, number] = [\n surfaces[surfaces.length - 1].age,\n surfaces[0].age,\n ];\n // Compute the height in pixels for each surface\n\n const surfaceHeights = surfaces.map((surface, i) => {\n return i * pixelScale;\n });\n\n // Build a piecewise linear scale mapping age to pixel height\n const ageDomain = surfaces.map((s) => s.age);\n const pixelRange = surfaceHeights;\n\n const scale = scaleLinear().domain(ageDomain).range(pixelRange);\n\n return {\n scale,\n pixelScale: null, // pixels per unit\n domain,\n pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),\n };\n}\n"],"names":[],"version":3,"file":"column-views.aa9ede4d.js.map"}
@@ -1,4 +1,4 @@
1
- import {useMacrostratColumns as $774a5efa27d1c77b$export$81eaae0b474404fd} from "./column-views.2eceafb5.js";
1
+ import {useMacrostratColumns as $774a5efa27d1c77b$export$81eaae0b474404fd} from "./column-views.e075af15.js";
2
2
  import {create as $i7Wch$create, useStore as $i7Wch$useStore} from "zustand";
3
3
  import {lineIntersect as $i7Wch$lineIntersect} from "@turf/line-intersect";
4
4
  import $i7Wch$turfdistance from "@turf/distance";
@@ -115,4 +115,4 @@ function $74e211dc185c20b4$var$sorted(data, accessor) {
115
115
 
116
116
 
117
117
  export {$74e211dc185c20b4$export$72ffe141ebf87ef1 as ColumnCorrelationProvider, $74e211dc185c20b4$export$21398703d3a9bb4d as useCorrelationMapStore};
118
- //# sourceMappingURL=column-views.413217dc.js.map
118
+ //# sourceMappingURL=column-views.ad2fe46c.js.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/column-views/src/maps/column-correlation/state.ts"],"sourcesContent":["import { LineString, Point } from \"geojson\";\nimport { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecord } from \"@macrostrat/api-types\";\n// Turf intersection\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport distance from \"@turf/distance\";\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { centroid } from \"@turf/centroid\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { createComputed } from \"zustand-computed\";\nimport { useMacrostratColumns } from \"../../data-provider/base\";\n\nexport interface CorrelationMapInput {\n columns: ColumnGeoJSONRecord[];\n focusedLine: LineString | null;\n}\n\nexport interface CorrelationMapStore extends CorrelationMapInput {\n onClickMap: (event: mapboxgl.MapMouseEvent, point: Point) => void;\n}\n\nexport interface CorrelationProviderProps extends CorrelationMapInput {\n projectID?: number;\n inProcess?: boolean;\n columns: ColumnGeoJSONRecord[] | null;\n children: ReactNode;\n onSelectColumns?: (\n columns: FocusedColumnGeoJSONRecord[],\n line: LineString | null,\n ) => void;\n}\n\nconst CorrelationStoreContext =\n createContext<StoreApi<CorrelationMapStore> | null>(null);\n\ntype ComputedStore = {\n focusedColumns: FocusedColumnGeoJSONRecord[];\n};\n\n/** A computed store that will automatically update when the state changes */\nconst computed = createComputed((state: CorrelationMapStore): ComputedStore => {\n return {\n // We compute the focused columns based on columns and focusedLine\n focusedColumns: buildCorrelationColumns(state.columns, state.focusedLine),\n };\n}) as any;\n\nexport function ColumnCorrelationProvider({\n children,\n columns,\n projectID,\n inProcess,\n focusedLine,\n onSelectColumns,\n}: CorrelationProviderProps) {\n const [store] = useState(() => {\n return create<CorrelationMapStore & ComputedStore>(\n computed((set, get): CorrelationMapStore => {\n return {\n focusedLine,\n columns: null,\n onClickMap(event: mapboxgl.MapMouseEvent, point: Point) {\n const state = get();\n // Check if shift key is pressed\n const shiftKeyPressed = event.originalEvent.shiftKey;\n let existingCoords = state.focusedLine?.coordinates ?? [];\n\n if (existingCoords.length >= 2 && !shiftKeyPressed) {\n // Reset the line to zero length\n existingCoords = [];\n }\n set({\n focusedLine: {\n type: \"LineString\",\n coordinates: [...existingCoords, point.coordinates],\n },\n });\n },\n };\n }),\n );\n });\n\n // Set up the store\n /** TODO: move the fetching of all columns to within the map */\n const _columns = useMacrostratColumns(projectID, inProcess);\n useEffect(() => {\n if (_columns != null) {\n store.setState({ columns: _columns });\n }\n }, [_columns]);\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n const focusedColumns = useStore(store, (state) => state.focusedColumns);\n const _focusedLine = useStore(store, (state) => state.focusedLine);\n\n useEffect(() => {\n onSelectColumns?.(focusedColumns, _focusedLine);\n }, [focusedColumns, _focusedLine]);\n\n return h(CorrelationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useCorrelationMapStore(\n selector: (state: CorrelationMapStore & ComputedStore) => any,\n) {\n const storeApi = useContext(CorrelationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing CorrelationMapProvider\");\n }\n return useStore(storeApi, selector);\n}\n\nfunction buildCorrelationColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n if (columns == null || line == null || line.coordinates.length < 2) {\n return [];\n }\n return orderColumnsByDistance(\n computeIntersectingColumns(columns, line),\n line,\n );\n}\n\nfunction computeIntersectingColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): ColumnGeoJSONRecord[] {\n if (columns == null || line == null) {\n return [];\n }\n\n return columns.filter((col) => {\n const poly = col.geometry;\n\n // Some in-process datasets seem to have null geometries\n if (poly == null) return false;\n if (poly.type != \"Polygon\" && poly.type != \"MultiPolygon\") return false;\n\n const intersection = lineIntersect(line, poly);\n return intersection.features.length > 0;\n });\n}\n\ninterface FocusedColumnGeoJSONRecord extends ColumnGeoJSONRecord {\n properties: {\n centroid: Point;\n nearestPointOnLine: Point;\n distanceAlongLine: number;\n } & ColumnGeoJSONRecord[\"properties\"];\n}\n\nfunction orderColumnsByDistance(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n const centroids = columns.map((col) => centroid(col.geometry));\n const projectedPoints = centroids.map((point) =>\n nearestPointOnLine(line, point),\n );\n const distances = projectedPoints.map((point) =>\n distance(point.geometry.coordinates, line.coordinates[0]),\n );\n\n let newColumns = columns.map((col, i) => {\n return {\n ...col,\n properties: {\n ...col.properties,\n centroid: centroids[i],\n nearestPointOnLine: projectedPoints[i],\n distanceAlongLine: distances[i],\n },\n };\n });\n\n return sorted(newColumns, (d) => d.properties.distanceAlongLine);\n}\n\nfunction sorted(data, accessor: (d) => number) {\n return data.sort((a, b) => accessor(a) - accessor(b));\n}\n"],"names":[],"version":3,"file":"column-views.413217dc.js.map"}
1
+ {"mappings":"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","sources":["packages/column-views/src/maps/column-correlation/state.ts"],"sourcesContent":["import { LineString, Point } from \"geojson\";\nimport { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecord } from \"@macrostrat/api-types\";\n// Turf intersection\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport distance from \"@turf/distance\";\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { centroid } from \"@turf/centroid\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { createComputed } from \"zustand-computed\";\nimport { useMacrostratColumns } from \"../../data-provider/base\";\n\nexport interface CorrelationMapInput {\n columns: ColumnGeoJSONRecord[];\n focusedLine: LineString | null;\n}\n\nexport interface CorrelationMapStore extends CorrelationMapInput {\n onClickMap: (event: mapboxgl.MapMouseEvent, point: Point) => void;\n}\n\nexport interface CorrelationProviderProps extends CorrelationMapInput {\n projectID?: number;\n inProcess?: boolean;\n columns: ColumnGeoJSONRecord[] | null;\n children: ReactNode;\n onSelectColumns?: (\n columns: FocusedColumnGeoJSONRecord[],\n line: LineString | null,\n ) => void;\n}\n\nconst CorrelationStoreContext =\n createContext<StoreApi<CorrelationMapStore> | null>(null);\n\ntype ComputedStore = {\n focusedColumns: FocusedColumnGeoJSONRecord[];\n};\n\n/** A computed store that will automatically update when the state changes */\nconst computed = createComputed((state: CorrelationMapStore): ComputedStore => {\n return {\n // We compute the focused columns based on columns and focusedLine\n focusedColumns: buildCorrelationColumns(state.columns, state.focusedLine),\n };\n}) as any;\n\nexport function ColumnCorrelationProvider({\n children,\n columns,\n projectID,\n inProcess,\n focusedLine,\n onSelectColumns,\n}: CorrelationProviderProps) {\n const [store] = useState(() => {\n return create<CorrelationMapStore & ComputedStore>(\n computed((set, get): CorrelationMapStore => {\n return {\n focusedLine,\n columns: null,\n onClickMap(event: mapboxgl.MapMouseEvent, point: Point) {\n const state = get();\n // Check if shift key is pressed\n const shiftKeyPressed = event.originalEvent.shiftKey;\n let existingCoords = state.focusedLine?.coordinates ?? [];\n\n if (existingCoords.length >= 2 && !shiftKeyPressed) {\n // Reset the line to zero length\n existingCoords = [];\n }\n set({\n focusedLine: {\n type: \"LineString\",\n coordinates: [...existingCoords, point.coordinates],\n },\n });\n },\n };\n }),\n );\n });\n\n // Set up the store\n /** TODO: move the fetching of all columns to within the map */\n const _columns = useMacrostratColumns(projectID, inProcess);\n useEffect(() => {\n if (_columns != null) {\n store.setState({ columns: _columns });\n }\n }, [_columns]);\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n const focusedColumns = useStore(store, (state) => state.focusedColumns);\n const _focusedLine = useStore(store, (state) => state.focusedLine);\n\n useEffect(() => {\n onSelectColumns?.(focusedColumns, _focusedLine);\n }, [focusedColumns, _focusedLine]);\n\n return h(CorrelationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useCorrelationMapStore(\n selector: (state: CorrelationMapStore & ComputedStore) => any,\n) {\n const storeApi = useContext(CorrelationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing CorrelationMapProvider\");\n }\n return useStore(storeApi, selector);\n}\n\nfunction buildCorrelationColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n if (columns == null || line == null || line.coordinates.length < 2) {\n return [];\n }\n return orderColumnsByDistance(\n computeIntersectingColumns(columns, line),\n line,\n );\n}\n\nfunction computeIntersectingColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): ColumnGeoJSONRecord[] {\n if (columns == null || line == null) {\n return [];\n }\n\n return columns.filter((col) => {\n const poly = col.geometry;\n\n // Some in-process datasets seem to have null geometries\n if (poly == null) return false;\n if (poly.type != \"Polygon\" && poly.type != \"MultiPolygon\") return false;\n\n const intersection = lineIntersect(line, poly);\n return intersection.features.length > 0;\n });\n}\n\ninterface FocusedColumnGeoJSONRecord extends ColumnGeoJSONRecord {\n properties: {\n centroid: Point;\n nearestPointOnLine: Point;\n distanceAlongLine: number;\n } & ColumnGeoJSONRecord[\"properties\"];\n}\n\nfunction orderColumnsByDistance(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n const centroids = columns.map((col) => centroid(col.geometry));\n const projectedPoints = centroids.map((point) =>\n nearestPointOnLine(line, point),\n );\n const distances = projectedPoints.map((point) =>\n distance(point.geometry.coordinates, line.coordinates[0]),\n );\n\n let newColumns = columns.map((col, i) => {\n return {\n ...col,\n properties: {\n ...col.properties,\n centroid: centroids[i],\n nearestPointOnLine: projectedPoints[i],\n distanceAlongLine: distances[i],\n },\n };\n });\n\n return sorted(newColumns, (d) => d.properties.distanceAlongLine);\n}\n\nfunction sorted(data, accessor: (d) => number) {\n return data.sort((a, b) => accessor(a) - accessor(b));\n}\n"],"names":[],"version":3,"file":"column-views.ad2fe46c.js.map"}
@@ -1,9 +1,9 @@
1
- import {CompositeUnitsColumn as $8c8238faa5cde49c$export$a6684360fef0406e, LabelTrackerProvider as $8c8238faa5cde49c$export$e4e89ab6c86ac513, SectionLabelsColumn as $8c8238faa5cde49c$export$13984e34afdbb040} from "./column-views.7683bb52.js";
1
+ import {CompositeUnitsColumn as $8c8238faa5cde49c$export$a6684360fef0406e, LabelTrackerProvider as $8c8238faa5cde49c$export$e4e89ab6c86ac513, SectionLabelsColumn as $8c8238faa5cde49c$export$13984e34afdbb040} from "./column-views.63d40878.js";
2
2
  import $7zu8d$columnviewscc733361js from "./column-views.cc733361.js";
3
- import "./column-views.e33ac5c9.css";
4
- import {MacrostratColumnProvider as $774a5efa27d1c77b$export$9e42f9b6e0d67c7d, useMacrostratBaseURL as $774a5efa27d1c77b$export$33b1392d23dde04} from "./column-views.2eceafb5.js";
5
- import {useMacrostratColumnData as $d5074f164411387e$export$f8509b7cce386c7d, useMacrostratUnits as $d5074f164411387e$export$6fb40844db555b2} from "./column-views.4ed90896.js";
6
- import {Duration as $448b24baeef3b229$export$3b11bc38611c5941} from "./column-views.8284c3a9.js";
3
+ import "./column-views.e93478c3.css";
4
+ import {MacrostratColumnProvider as $774a5efa27d1c77b$export$9e42f9b6e0d67c7d, useMacrostratBaseURL as $774a5efa27d1c77b$export$33b1392d23dde04} from "./column-views.e075af15.js";
5
+ import {useMacrostratColumnData as $d5074f164411387e$export$f8509b7cce386c7d, useMacrostratUnits as $d5074f164411387e$export$6fb40844db555b2} from "./column-views.4b259f9e.js";
6
+ import {Duration as $448b24baeef3b229$export$3b11bc38611c5941} from "./column-views.5eb4e6ff.js";
7
7
  import {useMemo as $7zu8d$useMemo} from "react";
8
8
  import {useMacrostratIntervals as $7zu8d$useMacrostratIntervals, Timescale as $7zu8d$Timescale, TimescaleOrientation as $7zu8d$TimescaleOrientation} from "@macrostrat/timescale";
9
9
  import {SVG as $7zu8d$SVG, ColumnAxisType as $7zu8d$ColumnAxisType} from "@macrostrat/column-components";
@@ -28,7 +28,7 @@ function $7d0f52717c0de7e1$export$38cb0ab5af8f50d7(props) {
28
28
  const { unconformityLabels: unconformityLabels = true, unitComponent: unitComponent, unitComponentProps: unitComponentProps, showLabels: showLabels = true, width: width = 300, columnWidth: columnWidth = 150, showLabelColumn: showLabelColumn = true, clipUnits: clipUnits = true, maxInternalColumns: maxInternalColumns } = props;
29
29
  const units = (0, $d5074f164411387e$export$6fb40844db555b2)();
30
30
  // Get a unique key for the column
31
- const key = units[0]?.unit_id;
31
+ const key = units[0]?.col_id;
32
32
  return $7d0f52717c0de7e1$var$h((0, $8c8238faa5cde49c$export$e4e89ab6c86ac513), {
33
33
  units: units,
34
34
  key: key
@@ -205,22 +205,27 @@ function $7d0f52717c0de7e1$export$e12e53eeee198b99(props) {
205
205
  function $7d0f52717c0de7e1$var$Unconformity({ upperAge: upperAge, lowerAge: lowerAge, style: style, axisType: axisType, verbose: verbose = false }) {
206
206
  if (upperAge == null || lowerAge == null) return null;
207
207
  const ageGap = Math.abs(upperAge - lowerAge);
208
+ let maximumFractionDigits = 0;
208
209
  let className = null;
209
210
  if (ageGap > 1000) className = "giga";
210
211
  else if (ageGap > 100) className = "mega";
211
212
  else if (ageGap > 10) className = "large";
212
- else if (ageGap < 1) className = "small";
213
+ else if (ageGap < 1) {
214
+ className = "small";
215
+ maximumFractionDigits = 2;
216
+ } else maximumFractionDigits = 1;
213
217
  let val;
214
218
  if (axisType === (0, $7zu8d$ColumnAxisType).DEPTH || axisType === (0, $7zu8d$ColumnAxisType).HEIGHT) {
215
219
  const _txt = ageGap.toLocaleString("en-US", {
216
- maximumFractionDigits: 2
220
+ maximumFractionDigits: maximumFractionDigits
217
221
  });
218
222
  val = $7d0f52717c0de7e1$var$h((0, $7zu8d$Value), {
219
223
  value: _txt,
220
224
  unit: "m"
221
225
  });
222
226
  } else val = $7d0f52717c0de7e1$var$h((0, $448b24baeef3b229$export$3b11bc38611c5941), {
223
- value: ageGap
227
+ value: ageGap,
228
+ maximumFractionDigits: maximumFractionDigits
224
229
  });
225
230
  let prefix = null;
226
231
  if (verbose) prefix = $7d0f52717c0de7e1$var$h([
@@ -240,4 +245,4 @@ function $7d0f52717c0de7e1$var$Unconformity({ upperAge: upperAge, lowerAge: lowe
240
245
 
241
246
 
242
247
  export {$7d0f52717c0de7e1$export$38cb0ab5af8f50d7 as SectionsColumn, $7d0f52717c0de7e1$export$e12e53eeee198b99 as UnconformityLabels, $7d0f52717c0de7e1$export$db2df5a73a6fbe10 as CompositeTimescale, $7d0f52717c0de7e1$export$463f46772c64d403 as CompositeTimescaleCore};
243
- //# sourceMappingURL=column-views.0265cf7f.js.map
248
+ //# sourceMappingURL=column-views.afe0bb48.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/column-views/src/section.ts"],"sourcesContent":["import {\n CompositeUnitsColumn,\n LabelTrackerProvider,\n SectionLabelsColumn,\n} from \"./units\";\nimport { ReactNode, FunctionComponent, useMemo } from \"react\";\nimport {\n Timescale,\n TimescaleOrientation,\n useMacrostratIntervals,\n} from \"@macrostrat/timescale\";\nimport { ColumnAxisType, SVG } from \"@macrostrat/column-components\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./column.module.sass\";\nimport {\n useMacrostratColumnData,\n useMacrostratUnits,\n MacrostratColumnProvider,\n useMacrostratBaseURL,\n} from \"./data-provider\";\nimport { Duration } from \"./unit-details\";\nimport { Value } from \"@macrostrat/data-components\";\nimport type { ExtUnit, PackageScaleLayoutData } from \"./prepare-units/types\";\n\nconst h = hyper.styled(styles);\n\nexport interface SectionSharedProps {\n unitComponent?: FunctionComponent<any>;\n unitComponentProps?: any;\n showLabels?: boolean;\n width?: number;\n columnWidth?: number;\n children?: ReactNode;\n showLabelColumn?: boolean;\n axisType?: ColumnAxisType;\n className?: string;\n clipUnits?: boolean;\n maxInternalColumns?: number;\n // Space between sections\n verticalSpacing?: number;\n // Whether to render unconformity labels\n unconformityLabels?: boolean;\n}\n\nexport interface SectionProps extends SectionSharedProps {\n units: ExtUnit[];\n scaleInfo: PackageScaleLayoutData;\n}\n\nexport function SectionsColumn(props: SectionSharedProps) {\n const {\n unconformityLabels = true,\n unitComponent,\n unitComponentProps,\n showLabels = true,\n width = 300,\n columnWidth = 150,\n showLabelColumn = true,\n clipUnits = true,\n maxInternalColumns,\n } = props;\n\n const units = useMacrostratUnits();\n\n // Get a unique key for the column\n const key = units[0]?.col_id;\n\n return h(LabelTrackerProvider, { units, key }, [\n h(SectionUnitsColumn, {\n width: columnWidth,\n unitComponent,\n unitComponentProps,\n showLabels,\n clipUnits,\n maxInternalColumns,\n unconformityLabels,\n }),\n h.if(showLabelColumn)(SectionLabelsColumn, {\n width: width - columnWidth,\n }),\n ]);\n}\n\nfunction SectionUnitsColumn(props: SectionSharedProps) {\n const {\n width,\n showLabels,\n unitComponent,\n unitComponentProps,\n clipUnits,\n maxInternalColumns,\n axisType,\n unconformityLabels = true,\n } = props;\n\n const { sections, totalHeight } = useMacrostratColumnData();\n\n const scaleData: PackageScaleLayoutData[] = sections.map((section) => {\n return section.scaleInfo;\n });\n\n const innerWidth = width - 2;\n\n return h(\"div.section-units-container\", { style: { width } }, [\n h(\n SVG,\n {\n className: \"sections\",\n height: totalHeight,\n innerWidth,\n paddingH: 1,\n },\n sections.map((group) => {\n const { units, scaleInfo, section_id } = group;\n\n const key = `section-${section_id}`;\n return h(\n SectionUnits,\n {\n units,\n scaleInfo,\n key,\n unitComponent,\n unitComponentProps,\n showLabels,\n width: innerWidth,\n clipUnits,\n maxInternalColumns,\n }, // This unconformity is with the section _above_\n );\n }),\n ),\n h.if(unconformityLabels)(UnconformityLabels, {\n width,\n sections: scaleData,\n verbose: false,\n }),\n ]);\n}\n\nfunction SectionUnits(props: SectionProps) {\n // Section with \"squishy\" timescale\n const {\n units,\n scaleInfo,\n unitComponent,\n showLabels = true,\n width = 300,\n unitComponentProps,\n className,\n clipUnits = true,\n maxInternalColumns,\n } = props;\n\n const { domain, pixelScale, pixelHeight, scale } = scaleInfo;\n\n /** Ensure that we can arrange units into the maximum number\n * of columns defined by unitComponentProps, but that we don't\n * use more than necessary.\n */\n const _unitComponentProps = useMemo(() => {\n return {\n ...unitComponentProps,\n nColumns: Math.min(\n maxInternalColumns ?? Math.floor(width / 10),\n unitComponentProps?.nColumns ?? Infinity,\n Math.max(...units.map((d) => d.column)) + 1,\n ),\n //axisType,\n };\n }, [units, unitComponentProps, maxInternalColumns, width]);\n\n const style = {\n \"--section-height\": `${pixelHeight}px`,\n \"--section-width\": `${width}px`,\n };\n\n return h(\n \"g.section\",\n { className, style, transform: `translate(0 ${scaleInfo.offset})` },\n h(\n MacrostratColumnProvider,\n {\n units,\n domain,\n pixelScale, // Actually pixels per myr,\n scale,\n },\n h(CompositeUnitsColumn, {\n width,\n showLabels,\n unitComponent,\n unitComponentProps: _unitComponentProps,\n clipToFrame: clipUnits,\n }),\n ),\n );\n}\n\ninterface CompositeTimescaleProps {\n levels?: [number, number] | number;\n unconformityLabels?: boolean;\n}\n\nexport function CompositeTimescale(props: CompositeTimescaleProps) {\n const { sections } = useMacrostratColumnData();\n const sectionScales = sections.map((section) => {\n return section.scaleInfo;\n });\n\n return h(CompositeTimescaleCore, {\n packages: sectionScales,\n ...props,\n });\n}\n\ntype CompositeTimescaleCoreProps = CompositeTimescaleProps & {\n packages: PackageScaleLayoutData[];\n};\n\nexport function CompositeTimescaleCore(props: CompositeTimescaleCoreProps) {\n const { levels = 3, packages, unconformityLabels = false } = props;\n\n // Use intervals from Macrostrat API\n const baseURL = useMacrostratBaseURL();\n const intervals = useMacrostratIntervals(baseURL);\n\n let _levels: [number, number];\n if (typeof levels === \"number\") {\n // If levels is a number, use the most common starting level\n _levels = [2, Math.max(2 + Math.min(levels, 5) - 1, 1)];\n } else {\n _levels = levels;\n }\n\n const nCols = _levels[1] - _levels[0] + 1;\n\n return h(\"div.timescale-column\", [\n h(\n \"div.timescales\",\n packages.map((group) => {\n const { pixelHeight, paddingTop, key, scale } = group;\n return h(\n \"div.timescale-container\",\n { style: { paddingTop, \"--timescale-level-count\": nCols }, key },\n [\n h(Timescale, {\n orientation: TimescaleOrientation.VERTICAL,\n length: pixelHeight,\n levels: _levels,\n absoluteAgeScale: true,\n showAgeAxis: false,\n scale,\n intervals,\n }),\n ],\n );\n }),\n ),\n h.if(unconformityLabels)(UnconformityLabels, {\n width: \"100%\",\n sections: packages,\n className: \"unconformity-labels\",\n axisType: ColumnAxisType.AGE,\n }),\n ]);\n}\n\nexport function UnconformityLabels(props: {\n width: string | number;\n sections: PackageScaleLayoutData[];\n axisType?: ColumnAxisType;\n className?: string;\n verbose?: boolean;\n}) {\n const { width, sections, className, axisType, verbose } = props;\n\n return h(\n \"div.unconformity-labels\",\n {\n style: {\n width,\n },\n className,\n },\n sections.map((scaleInfo, i) => {\n const lastGroup = sections[i - 1];\n const top = scaleInfo.offset - scaleInfo.paddingTop;\n const upperAge = lastGroup?.domain[0];\n const lowerAge = scaleInfo.domain[1];\n return h(Unconformity, {\n axisType,\n upperAge,\n lowerAge,\n style: {\n width,\n height: scaleInfo.paddingTop,\n top,\n },\n verbose,\n });\n }),\n );\n}\n\nfunction Unconformity({\n upperAge,\n lowerAge,\n style,\n axisType,\n verbose = false,\n}) {\n if (upperAge == null || lowerAge == null) {\n return null;\n }\n\n const ageGap = Math.abs(upperAge - lowerAge);\n\n let maximumFractionDigits = 0;\n\n let className: string = null;\n if (ageGap > 1000) {\n className = \"giga\";\n } else if (ageGap > 100) {\n className = \"mega\";\n } else if (ageGap > 10) {\n className = \"large\";\n } else if (ageGap < 1) {\n className = \"small\";\n maximumFractionDigits = 2;\n } else {\n maximumFractionDigits = 1;\n }\n\n let val: ReactNode;\n if (axisType === ColumnAxisType.DEPTH || axisType === ColumnAxisType.HEIGHT) {\n const _txt = ageGap.toLocaleString(\"en-US\", { maximumFractionDigits });\n val = h(Value, { value: _txt, unit: \"m\" });\n } else {\n val = h(Duration, { value: ageGap, maximumFractionDigits });\n }\n\n let prefix: ReactNode = null;\n if (verbose) {\n prefix = h([\" \", h(\"span.prefix\", \" gap\")]);\n }\n\n return h(\"div.unconformity\", { style, className }, [\n h(\"div.unconformity-inner\", h(\"div.unconformity-text\", [val, prefix])),\n ]);\n}\n"],"names":[],"version":3,"file":"column-views.afe0bb48.js.map"}
@@ -1,4 +1,4 @@
1
- import {createUnitSorter as $b6657fba8924a702$export$ab14c04795685c55, ensureArray as $b6657fba8924a702$export$d0c8ecbd4ed8940c, ensureRealFloat as $b6657fba8924a702$export$97de5b0a6b4e4dac, getUnitHeightRange as $b6657fba8924a702$export$70e712e2ac0237a, unitsOverlap as $b6657fba8924a702$export$f1a15f539858307} from "./column-views.54f8b909.js";
1
+ import {createUnitSorter as $b6657fba8924a702$export$ab14c04795685c55, ensureArray as $b6657fba8924a702$export$d0c8ecbd4ed8940c, ensureRealFloat as $b6657fba8924a702$export$97de5b0a6b4e4dac, getUnitHeightRange as $b6657fba8924a702$export$70e712e2ac0237a, unitsOverlap as $b6657fba8924a702$export$f1a15f539858307} from "./column-views.052498a6.js";
2
2
  import {group as $ailTa$group} from "d3-array";
3
3
  import {ColumnAxisType as $ailTa$ColumnAxisType} from "@macrostrat/column-components";
4
4
  import {compareAgeRanges as $ailTa$compareAgeRanges, AgeRangeRelationship as $ailTa$AgeRangeRelationship} from "@macrostrat/stratigraphy-utils";
@@ -222,4 +222,4 @@ function $663a0cdd08b02256$export$47e05aac3f0b77d4(unit) {
222
222
 
223
223
 
224
224
  export {$663a0cdd08b02256$export$55543e159517d62d as preprocessUnits, $663a0cdd08b02256$export$eeade20e3eee4638 as groupUnitsIntoSectionsBySectionID, $663a0cdd08b02256$export$8093438ec3e4c6fd as getSectionAgeRange, $663a0cdd08b02256$export$483b05c497fd70c6 as getSectionPosRange, $663a0cdd08b02256$export$bb26cdbde9c8c08b as groupUnitsIntoSectionsByOverlap, $663a0cdd08b02256$export$e7bb744b9be37f3d as mergeOverlappingSections, $663a0cdd08b02256$export$47e05aac3f0b77d4 as preprocessSectionUnit};
225
- //# sourceMappingURL=column-views.aecf25bc.js.map
225
+ //# sourceMappingURL=column-views.b4e1236d.js.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/column-views/src/prepare-units/helpers.ts"],"sourcesContent":["import type { BaseUnit, UnitLong } from \"@macrostrat/api-types\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport {\n createUnitSorter,\n ensureArray,\n ensureRealFloat,\n getUnitHeightRange,\n unitsOverlap,\n} from \"./utils\";\nimport {\n AgeRangeRelationship,\n compareAgeRanges,\n} from \"@macrostrat/stratigraphy-utils\";\nimport type { ExtUnit, SectionInfo, StratigraphicPackage } from \"./types\";\n\nconst dt = 0.001;\n\nexport function preprocessUnits<T extends UnitLong = UnitLong>(\n section: SectionInfo<T>,\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): ExtUnit[] {\n /** Preprocess units to add overlapping units and columns. */\n let units = section.units;\n\n let divisions = units.map((...args) => extendDivision(...args, axisType));\n for (let d of divisions) {\n const overlappingUnits = divisions.filter((u) =>\n d.overlappingUnits.includes(u.unit_id),\n );\n\n // Overlapping columns\n const columns = overlappingUnits.map((d) => d.column);\n\n if (columns.includes(d.column)) {\n let col = 0;\n // Go through columns to find a better index\n while (columns.includes(col)) {\n col++;\n }\n d.column = col;\n }\n\n // If unit overlaps the edges of a section, set the clip positions\n const [b_pos, t_pos] = getUnitHeightRange(d, axisType);\n if (axisType == ColumnAxisType.AGE) {\n if (b_pos > section.b_age) {\n d.b_clip_pos = section.b_age;\n }\n if (t_pos < section.t_age) {\n d.t_clip_pos = section.t_age;\n }\n }\n if (axisType == ColumnAxisType.DEPTH) {\n if (b_pos > section.b_pos) {\n d.b_clip_pos = section.b_pos;\n }\n if (t_pos < section.t_pos) {\n d.t_clip_pos = section.t_pos;\n }\n }\n // if (axisType == ColumnAxisType.HEIGHT) {\n // if (b_pos < section.b_pos) {\n // d.b_clip_pos = section.b_pos;\n // }\n // if (t_pos > section.t_pos) {\n // d.t_clip_pos = section.t_pos;\n // }\n // }\n }\n\n return divisions;\n}\n\nfunction extendDivision(\n unit: UnitLong,\n i: number,\n divisions: UnitLong[],\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): ExtUnit {\n // TODO: make this configurable\n let tolerance = 0.001; // 1 kyr tolerance for age columns\n if (axisType != ColumnAxisType.AGE) {\n tolerance = 0.01; // 1cm tolerance for height/depth columns\n }\n\n const overlappingUnits = divisions.filter(\n (d) =>\n d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType, tolerance),\n );\n const u_pos = getUnitHeightRange(unit, axisType);\n const bottomOverlap = overlappingUnits.some((d) => {\n const d_pos = getUnitHeightRange(d, axisType);\n // Check if the unit is below the current unit\n return d_pos[0] < u_pos[0] + dt;\n });\n let column = 0;\n if (overlappingUnits.length == 1) {\n column = 1;\n }\n\n return {\n ...unit,\n bottomOverlap,\n column,\n overlappingUnits: overlappingUnits.map((d) => d.unit_id),\n };\n}\n\nexport function groupUnitsIntoSectionsBySectionID<T extends UnitLong>(\n units: T[],\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): SectionInfo<T>[] {\n /** Group units into sections by section_id.\n * This works for large-scale Macrostrat columns, where units are grouped by section_id.\n * */\n let groups = Array.from(group(units, (d) => d.section_id));\n const unitComparator = createUnitSorter(axisType);\n\n const groups1 = groups.map(([section_id, sectionUnits]) => {\n const [b_age, t_age] = getSectionAgeRange(sectionUnits);\n const [b_pos, t_pos] = getSectionPosRange(sectionUnits, axisType);\n\n // sort units by position\n sectionUnits.sort(unitComparator);\n return { section_id, t_age, b_age, b_pos, t_pos, units: sectionUnits };\n });\n // Sort sections by increasing top age, then increasing bottom age.\n // Sections have no relative ordinal position other than age...\n const compareSections = createUnitSorter(axisType) as (\n a: StratigraphicPackage,\n b: StratigraphicPackage,\n ) => number;\n groups1.sort(compareSections);\n return groups1;\n}\n\ninterface WorkingSection {\n units: UnitLong[];\n // Position or age\n heightRange?: [number, number];\n}\n\nexport function groupUnitsIntoSectionsByOverlap<T extends UnitLong>(\n units: T[],\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): SectionInfo<T>[] {\n /** Group units into sections by overlap.\n * This creates \"synthetic\" sections that correspond to packages bound by scale gaps.\n * This is most useful in the height and depth domains, where gaps (e.g., missing core) are\n * common.\n * */\n // Start with each unit as its own \"section\", and progressively merge...\n const sectionList: WorkingSection[] = [];\n for (const unit of units) {\n // Check if the unit overlaps with any existing section\n const heightRange = getUnitHeightRange(unit, axisType);\n let section: WorkingSection | undefined = sectionList.find(\n (s) =>\n compareAgeRanges(heightRange, s.heightRange) !==\n AgeRangeRelationship.Disjoint,\n );\n if (section == null) {\n // No overlap, create a new section\n sectionList.push({\n heightRange,\n units: [unit],\n });\n } else {\n // Overlap, merge the unit into the section\n section.units.push(unit);\n // Update the height range\n if (axisType == ColumnAxisType.DEPTH || axisType == ColumnAxisType.AGE) {\n section.heightRange = [\n Math.max(section.heightRange[0], heightRange[0]),\n Math.min(section.heightRange[1], heightRange[1]),\n ];\n } else {\n section.heightRange = [\n Math.min(section.heightRange[0], heightRange[0]),\n Math.max(section.heightRange[1], heightRange[1]),\n ];\n }\n }\n }\n // We should have a section for each unit, now we can convert to SectionInfo\n // Ages have to be really actually ages, not heights\n\n return sectionList.map((section, i) => {\n const [b_age, t_age] = getSectionAgeRange(section.units);\n const [b_pos, t_pos] = getSectionPosRange(section.units, axisType);\n return {\n // Negative section IDs are used to indicate that these are synthetic sections\n section_id: -i,\n t_age,\n b_age,\n t_pos,\n b_pos,\n units: section.units as T[],\n };\n });\n}\n\nexport function getSectionPosRange(\n units: BaseUnit[],\n axisType: ColumnAxisType,\n): [number, number] {\n /** Get the overall position range of a set of units. */\n const t_positions = units.map((d) => {\n switch (axisType) {\n case ColumnAxisType.AGE:\n return d.t_age;\n case ColumnAxisType.DEPTH:\n case ColumnAxisType.HEIGHT:\n case ColumnAxisType.ORDINAL:\n return d.t_pos;\n default:\n throw new Error(`Unknown axis type: ${axisType}`);\n }\n });\n const b_positions = units.map((d) => {\n switch (axisType) {\n case ColumnAxisType.AGE:\n return d.b_age;\n case ColumnAxisType.DEPTH:\n case ColumnAxisType.HEIGHT:\n case ColumnAxisType.ORDINAL:\n return d.b_pos;\n default:\n throw new Error(`Unknown axis type: ${axisType}`);\n }\n });\n if (axisType == ColumnAxisType.AGE || axisType == ColumnAxisType.DEPTH) {\n return [Math.max(...b_positions), Math.min(...t_positions)];\n } else {\n return [Math.min(...b_positions), Math.max(...t_positions)];\n }\n}\n\nexport function getSectionAgeRange(units: BaseUnit[]): [number, number] {\n /** Get the overall age range of a set of units. */\n return getSectionPosRange(units, ColumnAxisType.AGE);\n}\n\nexport function mergeOverlappingSections<T extends UnitLong>(\n sections: SectionInfo<T>[],\n): SectionInfo<T>[] {\n /** Columns can have sections that overlap in time. Here, we merge overlapping\n * sections into a single section to correctly render gap-bound packages.\n */\n const [firstSection, ...rest] = sections;\n const newSections = [firstSection];\n for (const section of rest) {\n const lastSection = newSections[newSections.length - 1];\n if (\n lastSection.b_age < section.t_age ||\n lastSection.t_age > section.b_age\n ) {\n // No overlap, add the section as normal\n newSections.push(section);\n continue;\n }\n\n // Overlap, merge the sections\n lastSection.section_id = [\n ...ensureArray(lastSection.section_id),\n ...ensureArray(section.section_id),\n ];\n lastSection.units.push(...section.units);\n lastSection.b_age = Math.max(lastSection.b_age, section.b_age);\n lastSection.t_age = Math.min(lastSection.t_age, section.t_age);\n }\n return newSections;\n}\n\nexport function preprocessSectionUnit(unit: UnitLong): UnitLong {\n /** Preprocess a single unit for a \"section\" column type.\n * This mostly handles vagaries of eODP-style columns.\n * */\n\n let b_pos = unit.b_pos;\n let t_pos = unit.t_pos;\n\n let unit_name = unit.unit_name;\n\n // eODP columns sometimes have overlapping core sections, which are encoded in the name field\n // Match eODP section names\n const match = unit.unit_name.match(/^(\\d+(\\.\\d+)?)-(\\d+(\\.\\d+)?): (.+)/);\n\n if (match) {\n // These values should already be set if we've used the show_positions flag\n t_pos ??= ensureRealFloat(match[1]);\n b_pos ??= ensureRealFloat(match[3]);\n unit_name = match[5];\n }\n\n return {\n ...unit,\n b_pos: ensureRealFloat(b_pos),\n t_pos: ensureRealFloat(t_pos),\n unit_name,\n };\n}\n"],"names":[],"version":3,"file":"column-views.aecf25bc.js.map"}
1
+ {"mappings":"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","sources":["packages/column-views/src/prepare-units/helpers.ts"],"sourcesContent":["import type { BaseUnit, UnitLong } from \"@macrostrat/api-types\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport {\n createUnitSorter,\n ensureArray,\n ensureRealFloat,\n getUnitHeightRange,\n unitsOverlap,\n} from \"./utils\";\nimport {\n AgeRangeRelationship,\n compareAgeRanges,\n} from \"@macrostrat/stratigraphy-utils\";\nimport type { ExtUnit, SectionInfo, StratigraphicPackage } from \"./types\";\n\nconst dt = 0.001;\n\nexport function preprocessUnits<T extends UnitLong = UnitLong>(\n section: SectionInfo<T>,\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): ExtUnit[] {\n /** Preprocess units to add overlapping units and columns. */\n let units = section.units;\n\n let divisions = units.map((...args) => extendDivision(...args, axisType));\n for (let d of divisions) {\n const overlappingUnits = divisions.filter((u) =>\n d.overlappingUnits.includes(u.unit_id),\n );\n\n // Overlapping columns\n const columns = overlappingUnits.map((d) => d.column);\n\n if (columns.includes(d.column)) {\n let col = 0;\n // Go through columns to find a better index\n while (columns.includes(col)) {\n col++;\n }\n d.column = col;\n }\n\n // If unit overlaps the edges of a section, set the clip positions\n const [b_pos, t_pos] = getUnitHeightRange(d, axisType);\n if (axisType == ColumnAxisType.AGE) {\n if (b_pos > section.b_age) {\n d.b_clip_pos = section.b_age;\n }\n if (t_pos < section.t_age) {\n d.t_clip_pos = section.t_age;\n }\n }\n if (axisType == ColumnAxisType.DEPTH) {\n if (b_pos > section.b_pos) {\n d.b_clip_pos = section.b_pos;\n }\n if (t_pos < section.t_pos) {\n d.t_clip_pos = section.t_pos;\n }\n }\n // if (axisType == ColumnAxisType.HEIGHT) {\n // if (b_pos < section.b_pos) {\n // d.b_clip_pos = section.b_pos;\n // }\n // if (t_pos > section.t_pos) {\n // d.t_clip_pos = section.t_pos;\n // }\n // }\n }\n\n return divisions;\n}\n\nfunction extendDivision(\n unit: UnitLong,\n i: number,\n divisions: UnitLong[],\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): ExtUnit {\n // TODO: make this configurable\n let tolerance = 0.001; // 1 kyr tolerance for age columns\n if (axisType != ColumnAxisType.AGE) {\n tolerance = 0.01; // 1cm tolerance for height/depth columns\n }\n\n const overlappingUnits = divisions.filter(\n (d) =>\n d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType, tolerance),\n );\n const u_pos = getUnitHeightRange(unit, axisType);\n const bottomOverlap = overlappingUnits.some((d) => {\n const d_pos = getUnitHeightRange(d, axisType);\n // Check if the unit is below the current unit\n return d_pos[0] < u_pos[0] + dt;\n });\n let column = 0;\n if (overlappingUnits.length == 1) {\n column = 1;\n }\n\n return {\n ...unit,\n bottomOverlap,\n column,\n overlappingUnits: overlappingUnits.map((d) => d.unit_id),\n };\n}\n\nexport function groupUnitsIntoSectionsBySectionID<T extends UnitLong>(\n units: T[],\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): SectionInfo<T>[] {\n /** Group units into sections by section_id.\n * This works for large-scale Macrostrat columns, where units are grouped by section_id.\n * */\n let groups = Array.from(group(units, (d) => d.section_id));\n const unitComparator = createUnitSorter(axisType);\n\n const groups1 = groups.map(([section_id, sectionUnits]) => {\n const [b_age, t_age] = getSectionAgeRange(sectionUnits);\n const [b_pos, t_pos] = getSectionPosRange(sectionUnits, axisType);\n\n // sort units by position\n sectionUnits.sort(unitComparator);\n return { section_id, t_age, b_age, b_pos, t_pos, units: sectionUnits };\n });\n // Sort sections by increasing top age, then increasing bottom age.\n // Sections have no relative ordinal position other than age...\n const compareSections = createUnitSorter(axisType) as (\n a: StratigraphicPackage,\n b: StratigraphicPackage,\n ) => number;\n groups1.sort(compareSections);\n return groups1;\n}\n\ninterface WorkingSection {\n units: UnitLong[];\n // Position or age\n heightRange?: [number, number];\n}\n\nexport function groupUnitsIntoSectionsByOverlap<T extends UnitLong>(\n units: T[],\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): SectionInfo<T>[] {\n /** Group units into sections by overlap.\n * This creates \"synthetic\" sections that correspond to packages bound by scale gaps.\n * This is most useful in the height and depth domains, where gaps (e.g., missing core) are\n * common.\n * */\n // Start with each unit as its own \"section\", and progressively merge...\n const sectionList: WorkingSection[] = [];\n for (const unit of units) {\n // Check if the unit overlaps with any existing section\n const heightRange = getUnitHeightRange(unit, axisType);\n let section: WorkingSection | undefined = sectionList.find(\n (s) =>\n compareAgeRanges(heightRange, s.heightRange) !==\n AgeRangeRelationship.Disjoint,\n );\n if (section == null) {\n // No overlap, create a new section\n sectionList.push({\n heightRange,\n units: [unit],\n });\n } else {\n // Overlap, merge the unit into the section\n section.units.push(unit);\n // Update the height range\n if (axisType == ColumnAxisType.DEPTH || axisType == ColumnAxisType.AGE) {\n section.heightRange = [\n Math.max(section.heightRange[0], heightRange[0]),\n Math.min(section.heightRange[1], heightRange[1]),\n ];\n } else {\n section.heightRange = [\n Math.min(section.heightRange[0], heightRange[0]),\n Math.max(section.heightRange[1], heightRange[1]),\n ];\n }\n }\n }\n // We should have a section for each unit, now we can convert to SectionInfo\n // Ages have to be really actually ages, not heights\n\n return sectionList.map((section, i) => {\n const [b_age, t_age] = getSectionAgeRange(section.units);\n const [b_pos, t_pos] = getSectionPosRange(section.units, axisType);\n return {\n // Negative section IDs are used to indicate that these are synthetic sections\n section_id: -i,\n t_age,\n b_age,\n t_pos,\n b_pos,\n units: section.units as T[],\n };\n });\n}\n\nexport function getSectionPosRange(\n units: BaseUnit[],\n axisType: ColumnAxisType,\n): [number, number] {\n /** Get the overall position range of a set of units. */\n const t_positions = units.map((d) => {\n switch (axisType) {\n case ColumnAxisType.AGE:\n return d.t_age;\n case ColumnAxisType.DEPTH:\n case ColumnAxisType.HEIGHT:\n case ColumnAxisType.ORDINAL:\n return d.t_pos;\n default:\n throw new Error(`Unknown axis type: ${axisType}`);\n }\n });\n const b_positions = units.map((d) => {\n switch (axisType) {\n case ColumnAxisType.AGE:\n return d.b_age;\n case ColumnAxisType.DEPTH:\n case ColumnAxisType.HEIGHT:\n case ColumnAxisType.ORDINAL:\n return d.b_pos;\n default:\n throw new Error(`Unknown axis type: ${axisType}`);\n }\n });\n if (axisType == ColumnAxisType.AGE || axisType == ColumnAxisType.DEPTH) {\n return [Math.max(...b_positions), Math.min(...t_positions)];\n } else {\n return [Math.min(...b_positions), Math.max(...t_positions)];\n }\n}\n\nexport function getSectionAgeRange(units: BaseUnit[]): [number, number] {\n /** Get the overall age range of a set of units. */\n return getSectionPosRange(units, ColumnAxisType.AGE);\n}\n\nexport function mergeOverlappingSections<T extends UnitLong>(\n sections: SectionInfo<T>[],\n): SectionInfo<T>[] {\n /** Columns can have sections that overlap in time. Here, we merge overlapping\n * sections into a single section to correctly render gap-bound packages.\n */\n const [firstSection, ...rest] = sections;\n const newSections = [firstSection];\n for (const section of rest) {\n const lastSection = newSections[newSections.length - 1];\n if (\n lastSection.b_age < section.t_age ||\n lastSection.t_age > section.b_age\n ) {\n // No overlap, add the section as normal\n newSections.push(section);\n continue;\n }\n\n // Overlap, merge the sections\n lastSection.section_id = [\n ...ensureArray(lastSection.section_id),\n ...ensureArray(section.section_id),\n ];\n lastSection.units.push(...section.units);\n lastSection.b_age = Math.max(lastSection.b_age, section.b_age);\n lastSection.t_age = Math.min(lastSection.t_age, section.t_age);\n }\n return newSections;\n}\n\nexport function preprocessSectionUnit(unit: UnitLong): UnitLong {\n /** Preprocess a single unit for a \"section\" column type.\n * This mostly handles vagaries of eODP-style columns.\n * */\n\n let b_pos = unit.b_pos;\n let t_pos = unit.t_pos;\n\n let unit_name = unit.unit_name;\n\n // eODP columns sometimes have overlapping core sections, which are encoded in the name field\n // Match eODP section names\n const match = unit.unit_name.match(/^(\\d+(\\.\\d+)?)-(\\d+(\\.\\d+)?): (.+)/);\n\n if (match) {\n // These values should already be set if we've used the show_positions flag\n t_pos ??= ensureRealFloat(match[1]);\n b_pos ??= ensureRealFloat(match[3]);\n unit_name = match[5];\n }\n\n return {\n ...unit,\n b_pos: ensureRealFloat(b_pos),\n t_pos: ensureRealFloat(t_pos),\n unit_name,\n };\n}\n"],"names":[],"version":3,"file":"column-views.b4e1236d.js.map"}
@@ -1,9 +1,9 @@
1
- import {ColumnCorrelationMap as $dcd183b733f66144$export$8e7d97509e84cc49} from "./column-views.f0b0fc56.js";
2
- import {ColumnCorrelationProvider as $74e211dc185c20b4$export$72ffe141ebf87ef1, useCorrelationMapStore as $74e211dc185c20b4$export$21398703d3a9bb4d} from "./column-views.413217dc.js";
1
+ import {ColumnCorrelationMap as $dcd183b733f66144$export$8e7d97509e84cc49} from "./column-views.ce3a3ac8.js";
2
+ import {ColumnCorrelationProvider as $74e211dc185c20b4$export$72ffe141ebf87ef1, useCorrelationMapStore as $74e211dc185c20b4$export$21398703d3a9bb4d} from "./column-views.ad2fe46c.js";
3
3
 
4
4
 
5
5
 
6
6
 
7
7
 
8
8
  export {$dcd183b733f66144$export$8e7d97509e84cc49 as ColumnCorrelationMap, $74e211dc185c20b4$export$72ffe141ebf87ef1 as ColumnCorrelationProvider, $74e211dc185c20b4$export$21398703d3a9bb4d as useCorrelationMapStore};
9
- //# sourceMappingURL=column-views.469a4952.js.map
9
+ //# sourceMappingURL=column-views.c149f7a5.js.map
@@ -1 +1 @@
1
- {"mappings":"","sources":["packages/column-views/src/maps/column-correlation/index.ts"],"sourcesContent":["export * from \"./core\";\nexport * from \"./state\";\n"],"names":[],"version":3,"file":"column-views.469a4952.js.map"}
1
+ {"mappings":"","sources":["packages/column-views/src/maps/column-correlation/index.ts"],"sourcesContent":["export * from \"./core\";\nexport * from \"./state\";\n"],"names":[],"version":3,"file":"column-views.c149f7a5.js.map"}
@@ -0,0 +1,149 @@
1
+ import {useDetritalMeasurements as $9f310bd6e88a58bc$export$1b0cf9c36f060135} from "./column-views.60e97132.js";
2
+ import $d4hxx$columnviews2c45a7b5js from "./column-views.2c45a7b5.js";
3
+ import "./column-views.403a7b48.css";
4
+ import {BaseMeasurementsColumn as $50d219504625a431$export$ce5c4f2fdf4e644d, mergeHeightRanges as $50d219504625a431$export$8f2afa8ddee7317e} from "./column-views.de433f18.js";
5
+ import {useMacrostratColumnData as $d5074f164411387e$export$f8509b7cce386c7d} from "./column-views.4b259f9e.js";
6
+ import {getUnitHeightRange as $b6657fba8924a702$export$70e712e2ac0237a} from "./column-views.052498a6.js";
7
+ import {usePlotArea as $d4hxx$usePlotArea, DetritalSpectrumPlot as $d4hxx$DetritalSpectrumPlot, DetritalSeries as $d4hxx$DetritalSeries} from "@macrostrat/data-components";
8
+ import $d4hxx$macrostrathyper from "@macrostrat/hyper";
9
+ import {useMemo as $d4hxx$useMemo} from "react";
10
+ import $d4hxx$classnames from "classnames";
11
+ import {group as $d4hxx$group} from "d3-array";
12
+
13
+
14
+ function $parcel$interopDefault(a) {
15
+ return a && a.__esModule ? a.default : a;
16
+ }
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+ const $715dd5fedd79146a$var$h = (0, $d4hxx$macrostrathyper).styled((0, ($parcel$interopDefault($d4hxx$columnviews2c45a7b5js))));
28
+ function $715dd5fedd79146a$var$prepareDetritalData(data, units, axisType) {
29
+ /** Right now measurement data could be duplicated if there are multiple units linked to the same
30
+ * measuremeta_id. THis happens because matches to units might be at a lower rank (e.g, if the column
31
+ * contains Formations but the measurements are linked to a Group). To handle this, we group by measuremeta_id
32
+ * and then create unique keys based on the set of units linked to each measurement.
33
+ */ // Group data by measuremeta_id
34
+ const measurementsGrouped = (0, $d4hxx$group)(data, (d)=>d.measuremeta_id);
35
+ const resMap = new Map();
36
+ for (const measurements of measurementsGrouped.values()){
37
+ // Get a list of unique unit_ids for this measurement
38
+ const unitIDs = new Set(measurements.map((m)=>m.unit_id));
39
+ const ids = Array.from(unitIDs);
40
+ ids.sort();
41
+ // Key is unique to the set of units
42
+ const key = ids.join("-");
43
+ if (!resMap.has(key)) {
44
+ const unitData = ids.map((id)=>{
45
+ return units.find((u)=>u.unit_id === id);
46
+ }).filter(Boolean);
47
+ const positions = unitData.map((unit)=>{
48
+ const [height, top_height] = (0, $b6657fba8924a702$export$70e712e2ac0237a)(unit, axisType);
49
+ return {
50
+ height: height,
51
+ top_height: top_height
52
+ };
53
+ });
54
+ // merge positions (note: we could also have multiple separate notes per measurement)
55
+ const pos = (0, $50d219504625a431$export$8f2afa8ddee7317e)(positions, axisType);
56
+ resMap.set(key, {
57
+ id: key,
58
+ data: [],
59
+ units: unitData,
60
+ ...pos
61
+ });
62
+ }
63
+ resMap.get(key).data.push(measurements[0]);
64
+ }
65
+ return Array.from(resMap.values());
66
+ }
67
+ function $715dd5fedd79146a$export$f176396e104db8d5({ columnID: columnID, color: color = "magenta" }) {
68
+ const data = (0, $9f310bd6e88a58bc$export$1b0cf9c36f060135)({
69
+ col_id: columnID
70
+ });
71
+ const width = 400;
72
+ const paddingLeft = 40;
73
+ const spectrumWidth = width - paddingLeft;
74
+ const noteComponent = (0, $d4hxx$useMemo)(()=>{
75
+ return (props)=>{
76
+ return $715dd5fedd79146a$var$h($715dd5fedd79146a$export$1b3047373cd1c8c7, {
77
+ width: spectrumWidth,
78
+ height: 40,
79
+ color: color,
80
+ ...props
81
+ });
82
+ };
83
+ }, [
84
+ width,
85
+ color
86
+ ]);
87
+ const { axisType: axisType, units: units } = (0, $d5074f164411387e$export$f8509b7cce386c7d)();
88
+ const data1 = (0, $d4hxx$useMemo)(()=>{
89
+ if (data == null || units == null) return null;
90
+ return $715dd5fedd79146a$var$prepareDetritalData(data, units, axisType);
91
+ }, [
92
+ data,
93
+ units,
94
+ axisType
95
+ ]);
96
+ return $715dd5fedd79146a$var$h((0, $50d219504625a431$export$ce5c4f2fdf4e644d), {
97
+ data: data1,
98
+ noteComponent: noteComponent,
99
+ deltaConnectorAttachment: 20
100
+ });
101
+ }
102
+ function $715dd5fedd79146a$var$DepositionalAge({ unit: unit }) {
103
+ const { xScale: xScale, height: height } = (0, $d4hxx$usePlotArea)();
104
+ const { t_age: t_age, b_age: b_age } = unit;
105
+ const x = xScale(t_age);
106
+ const x1 = xScale(b_age);
107
+ return $715dd5fedd79146a$var$h("rect.depositional-age", {
108
+ x: x,
109
+ width: x1 - x,
110
+ y: 0,
111
+ height: height
112
+ });
113
+ }
114
+ function $715dd5fedd79146a$export$1b3047373cd1c8c7(props) {
115
+ const { note: note, width: width, height: height, color: color, spacing: spacing } = props;
116
+ const { data: data, units: units } = note;
117
+ const _color = color;
118
+ const spaceBelow = spacing?.below ?? 100;
119
+ const hideAxisLabels = spaceBelow < 60;
120
+ return $715dd5fedd79146a$var$h("div.detrital-group", {
121
+ className: (0, $d4hxx$classnames)({
122
+ "hide-axis": hideAxisLabels
123
+ })
124
+ }, [
125
+ $715dd5fedd79146a$var$h((0, $d4hxx$DetritalSpectrumPlot), {
126
+ width: width,
127
+ innerHeight: height,
128
+ showAxisLabels: true,
129
+ paddingBottom: 40
130
+ }, [
131
+ units.map((unit)=>{
132
+ return $715dd5fedd79146a$var$h($715dd5fedd79146a$var$DepositionalAge, {
133
+ unit: unit
134
+ });
135
+ }),
136
+ data.map((d)=>{
137
+ return $715dd5fedd79146a$var$h((0, $d4hxx$DetritalSeries), {
138
+ bandwidth: 20,
139
+ data: d.measure_value,
140
+ color: _color
141
+ });
142
+ })
143
+ ])
144
+ ]);
145
+ }
146
+
147
+
148
+ export {$715dd5fedd79146a$export$f176396e104db8d5 as DetritalColumn, $715dd5fedd79146a$export$1b3047373cd1c8c7 as DetritalGroup};
149
+ //# sourceMappingURL=column-views.c3c7901a.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/column-views/src/facets/detrital-zircon/index.ts"],"sourcesContent":["import {\n DetritalSpectrumPlot,\n DetritalSeries,\n usePlotArea,\n} from \"@macrostrat/data-components\";\nimport type { IUnit } from \"../../units/types\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDetritalMeasurements, MeasurementInfo } from \"./provider\";\nimport { useMemo } from \"react\";\nimport styles from \"./index.module.sass\";\nimport classNames from \"classnames\";\nimport {\n BaseMeasurementsColumn,\n mergeHeightRanges,\n ColumnMeasurementData,\n} from \"../measurements\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { useMacrostratColumnData } from \"../../data-provider\";\nimport { getUnitHeightRange } from \"../../prepare-units\";\n\nconst h = hyper.styled(styles);\n\ninterface DetritalItemProps {\n note: DZMeasurementInfo;\n spacing?: {\n below?: number;\n above?: number;\n };\n width?: number;\n height?: number;\n color?: string;\n}\n\ninterface DZMeasurementInfo extends ColumnMeasurementData<MeasurementInfo[]> {\n units: IUnit[];\n}\n\nfunction prepareDetritalData(\n data: MeasurementInfo[],\n units: IUnit[],\n axisType: ColumnAxisType,\n) {\n /** Right now measurement data could be duplicated if there are multiple units linked to the same\n * measuremeta_id. THis happens because matches to units might be at a lower rank (e.g, if the column\n * contains Formations but the measurements are linked to a Group). To handle this, we group by measuremeta_id\n * and then create unique keys based on the set of units linked to each measurement.\n */\n\n // Group data by measuremeta_id\n const measurementsGrouped = group(data, (d) => d.measuremeta_id);\n\n const resMap = new Map<string, DZMeasurementInfo>();\n\n for (const measurements of measurementsGrouped.values()) {\n // Get a list of unique unit_ids for this measurement\n const unitIDs = new Set(measurements.map((m) => m.unit_id));\n const ids = Array.from(unitIDs);\n ids.sort();\n // Key is unique to the set of units\n const key = ids.join(\"-\");\n\n if (!resMap.has(key)) {\n const unitData = ids\n .map((id) => {\n return units.find((u) => u.unit_id === id);\n })\n .filter(Boolean);\n\n const positions = unitData.map((unit) => {\n const [height, top_height] = getUnitHeightRange(unit, axisType);\n return { height, top_height };\n });\n\n // merge positions (note: we could also have multiple separate notes per measurement)\n const pos = mergeHeightRanges(positions, axisType);\n\n resMap.set(key, {\n id: key,\n data: [],\n units: unitData as IUnit[],\n ...pos,\n });\n }\n resMap.get(key)!.data.push(measurements[0]);\n }\n\n return Array.from(resMap.values());\n}\n\nfunction DetritalColumn({ columnID, color = \"magenta\" }) {\n const data = useDetritalMeasurements({ col_id: columnID });\n\n const width = 400;\n const paddingLeft = 40;\n\n const spectrumWidth = width - paddingLeft;\n\n const noteComponent = useMemo(() => {\n return (props) => {\n return h(DetritalGroup, {\n width: spectrumWidth,\n height: 40,\n color,\n ...props,\n });\n };\n }, [width, color]);\n\n const { axisType, units } = useMacrostratColumnData();\n\n const data1 = useMemo(() => {\n if (data == null || units == null) return null;\n return prepareDetritalData(data, units, axisType);\n }, [data, units, axisType]);\n\n return h(BaseMeasurementsColumn, {\n data: data1,\n noteComponent,\n deltaConnectorAttachment: 20,\n });\n}\n\nfunction DepositionalAge({ unit }) {\n const { xScale, height } = usePlotArea();\n\n const { t_age, b_age } = unit;\n const x = xScale(t_age);\n const x1 = xScale(b_age);\n\n return h(\"rect.depositional-age\", { x, width: x1 - x, y: 0, height });\n}\n\nfunction DetritalGroup(props: DetritalItemProps) {\n const { note, width, height, color, spacing } = props;\n const { data, units } = note;\n\n const _color = color;\n\n const spaceBelow = spacing?.below ?? 100;\n const hideAxisLabels = spaceBelow < 60;\n\n return h(\n \"div.detrital-group\",\n { className: classNames({ \"hide-axis\": hideAxisLabels }) },\n [\n h(\n DetritalSpectrumPlot,\n { width, innerHeight: height, showAxisLabels: true, paddingBottom: 40 },\n [\n units.map((unit) => {\n return h(DepositionalAge, { unit });\n }),\n data.map((d) => {\n return h(DetritalSeries, {\n bandwidth: 20,\n data: d.measure_value,\n color: _color,\n });\n }),\n ],\n ),\n ],\n );\n}\n\nexport { DetritalColumn, DetritalGroup };\n"],"names":[],"version":3,"file":"column-views.c3c7901a.js.map"}
@@ -44,11 +44,14 @@ function $61771df184788970$export$f19d75b1d4b676a4(props) {
44
44
  });
45
45
  },
46
46
  onUnitSelected: (input, target = null, event = null)=>{
47
- if (input == null) return set({
48
- selectedUnit: null,
49
- selectedUnitData: null,
50
- overlayPosition: null
51
- });
47
+ if (input == null) {
48
+ props.onUnitSelected?.(null, null);
49
+ return set({
50
+ selectedUnit: null,
51
+ selectedUnitData: null,
52
+ overlayPosition: null
53
+ });
54
+ }
52
55
  let unit = null;
53
56
  if (typeof input === "number") unit = props.units.find((u)=>u.unit_id === input) || null;
54
57
  else unit = input;
@@ -163,4 +166,4 @@ function $61771df184788970$export$70f5ee19650fc7d1({ units: units }) {
163
166
 
164
167
 
165
168
  export {$61771df184788970$export$77a278d5ca56e309 as useUnitSelectionDispatch, $61771df184788970$export$b220b1d3591dc9e5 as useUnitSelectionStore, $61771df184788970$export$f0dd93f90aa8e5da as useSelectedUnit, $61771df184788970$export$f19d75b1d4b676a4 as UnitSelectionProvider, $61771df184788970$export$cbbec12b1451fe7d as useUnitSelectionTarget, $61771df184788970$export$70f5ee19650fc7d1 as UnitKeyboardNavigation};
166
- //# sourceMappingURL=column-views.a3fabf0f.js.map
169
+ //# sourceMappingURL=column-views.c44febd0.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/column-views/src/data-provider/unit-selection.ts"],"sourcesContent":["import { BaseUnit } from \"@macrostrat/api-types\";\nimport h from \"@macrostrat/hyper\";\nimport { useKeyHandler } from \"@macrostrat/ui-components\";\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n ReactNode,\n RefObject,\n useRef,\n useCallback,\n} from \"react\";\nimport { createStore, StoreApi, useStore } from \"zustand\";\nimport type { RectBounds, IUnit } from \"../units/types\";\n\ntype UnitSelectDispatch = (\n unit: number | BaseUnit | null,\n target: HTMLElement | null,\n event: Event | null,\n) => void;\n\nconst UnitSelectionContext = createContext<StoreApi<UnitSelectionStore>>(null);\n\nexport function useUnitSelectionDispatch(): UnitSelectDispatch {\n const store = useContext(UnitSelectionContext);\n if (store == null) {\n return () => {};\n }\n return useStore(store, (state) => state.onUnitSelected);\n}\n\nexport function useUnitSelectionStore<T>(\n selector: (state: UnitSelectionStore) => T,\n): T {\n const store = useContext(UnitSelectionContext);\n if (store == null) {\n return null;\n }\n return useStore(store, selector);\n}\n\nexport function useSelectedUnit() {\n return useUnitSelectionStore((state) => state.selectedUnitData);\n}\n\ninterface UnitSelectionStore {\n selectedUnit: number | null;\n selectedUnitData: BaseUnit | null;\n overlayPosition: RectBounds | null;\n onUnitSelected: UnitSelectDispatch;\n setSelectedUnit: (unit: number | null) => void;\n}\n\nexport interface ColumnClickData {\n unitID: number | null;\n unit: BaseUnit | null;\n target: HTMLElement | null;\n height: number;\n // Room for boundary IDs eventually\n}\n\nexport function UnitSelectionProvider<T extends BaseUnit>(props: {\n children: ReactNode;\n columnRef?: RefObject<HTMLElement>;\n units: T[];\n selectedUnit: number | null;\n onClickedColumn?: (columnClickData: ColumnClickData, event: Event) => void;\n onUnitSelected?: (unitID: number | null, unit: T | null) => void;\n}) {\n const [store] = useState(() =>\n createStore<UnitSelectionStore>((set) => ({\n selectedUnit: null,\n selectedUnitData: null,\n overlayPosition: null,\n setSelectedUnit(selectedUnit: number | null | BaseUnit) {\n if (selectedUnit == null) {\n set({ selectedUnit: null, selectedUnitData: null });\n return;\n // If it's a number, set the selected unit\n } else if (typeof selectedUnit === \"number\") {\n set({ selectedUnit, selectedUnitData: null });\n } else if (\"unit_id\" in selectedUnit) {\n set({\n selectedUnit: selectedUnit.unit_id,\n selectedUnitData: selectedUnit,\n });\n }\n },\n onUnitSelected: (\n input: number | T | null,\n target: HTMLElement = null,\n event: PointerEvent = null,\n ) => {\n if (input == null) {\n props.onUnitSelected?.(null, null);\n return set({\n selectedUnit: null,\n selectedUnitData: null,\n overlayPosition: null,\n });\n }\n\n let unit: T | null = null;\n if (typeof input === \"number\") {\n unit = props.units.find((u) => u.unit_id === input) || null;\n } else {\n unit = input;\n }\n\n const el = props.columnRef?.current;\n let overlayPosition = null;\n\n /** This is not the natural place to get positions within the column,\n * but it will work for now.\n */\n if (props.onClickedColumn) {\n // Infer height from top and bottom height of unit (because that's passed back with the call)\n //const py = event.y;\n //const [bottom, top] = getUnitHeightRange(unit, axisType);\n //const height = Math.abs(bottom - top);\n\n /** Ideally this would be defined at the column level */\n const columnClickData: ColumnClickData = {\n unitID: unit?.unit_id,\n unit,\n target,\n height: el?.getBoundingClientRect().height || 0,\n };\n props.onClickedColumn(columnClickData, event);\n }\n\n if (unit != null && el != null && target != null) {\n const rect = el.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n overlayPosition = {\n x: targetRect.left - rect.left,\n y: targetRect.top - rect.top,\n width: targetRect.width,\n height: targetRect.height,\n };\n }\n props.onUnitSelected?.(unit?.unit_id, unit);\n\n return set({\n selectedUnit: unit?.unit_id,\n selectedUnitData: unit,\n overlayPosition,\n });\n },\n })),\n );\n\n const { units, selectedUnit } = props;\n\n useEffect(() => {\n // Synchronize store with provided props\n if (selectedUnit != null) {\n const unitData = units?.find((u) => u.unit_id === selectedUnit);\n store.setState({ selectedUnit, selectedUnitData: unitData });\n } else {\n store.setState({ selectedUnit: null, selectedUnitData: null });\n }\n }, [selectedUnit, units]);\n\n return h(UnitSelectionContext.Provider, { value: store }, props.children);\n}\n\nexport function useUnitSelectionTarget(\n unit: IUnit,\n): [React.RefObject<HTMLElement>, boolean, (evt: Event) => void] {\n const ref = useRef<HTMLElement>();\n const selectedUnit = useSelectedUnit();\n const onSelectUnit = useUnitSelectionStore((state) => state.onUnitSelected);\n const selected = selectedUnit?.unit_id == unit.unit_id;\n\n const onClick = useCallback(\n (evt: Event) => {\n if (onSelectUnit == null) return;\n onSelectUnit(unit, ref.current, evt);\n evt.stopPropagation();\n },\n [unit, onSelectUnit],\n );\n\n useEffect(() => {\n if (!selected || onSelectUnit == null) return;\n // In case we haven't set the position of the unit (if we don't have a target), set the selected unit\n onSelectUnit(unit, ref.current, null);\n\n // Scroll the unit into view\n ref.current?.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"nearest\",\n });\n }, [selected, onSelectUnit]);\n\n return [ref, selected, onClick];\n}\n\nexport function UnitKeyboardNavigation<T extends BaseUnit>({\n units,\n}: {\n units: T[];\n}) {\n const selectedUnit = useSelectedUnit();\n const selectUnit = useUnitSelectionDispatch();\n\n const ix = units.findIndex((unit) => unit.unit_id === selectedUnit?.unit_id);\n\n const keyMap = {\n 38: ix - 1,\n 40: ix + 1,\n };\n\n useKeyHandler(\n (event) => {\n const nextIx = keyMap[event.keyCode];\n if (nextIx == null || nextIx < 0 || nextIx >= units.length) return;\n selectUnit(units[nextIx], null, null);\n event.stopPropagation();\n },\n [units, ix],\n );\n return null;\n}\n"],"names":[],"version":3,"file":"column-views.c44febd0.js.map"}
@@ -1,13 +1,13 @@
1
- .VC2fja_taxa-occurrences-matrix {
1
+ .RZWNlW_taxa-occurrences-matrix {
2
2
  color: var(--column-text-color);
3
3
  }
4
4
 
5
- .VC2fja_taxa-occurrences-matrix line {
5
+ .RZWNlW_taxa-occurrences-matrix line {
6
6
  stroke: var(--column-stroke-color);
7
7
  stroke-width: 2px;
8
8
  }
9
9
 
10
- .VC2fja_taxa-occurrences-matrix text.VC2fja_taxon-name {
10
+ .RZWNlW_taxa-occurrences-matrix text.RZWNlW_taxon-name {
11
11
  fill: var(--column-text-color);
12
12
  text-anchor: end;
13
13
  position: sticky;
@@ -15,16 +15,16 @@
15
15
  transform: rotate(90deg)translate(0, 4px);
16
16
  }
17
17
 
18
- .VC2fja_taxon-ranges {
18
+ .RZWNlW_taxon-ranges {
19
19
  position: relative;
20
20
  }
21
21
 
22
- .VC2fja_taxon-ranges > svg {
22
+ .RZWNlW_taxon-ranges > svg {
23
23
  height: 100%;
24
24
  position: absolute;
25
25
  }
26
26
 
27
- .VC2fja_taxon-labels {
27
+ .RZWNlW_taxon-labels {
28
28
  z-index: 10;
29
29
  pointer-events: none;
30
30
  width: 100%;
@@ -32,12 +32,12 @@
32
32
  position: absolute;
33
33
  }
34
34
 
35
- .VC2fja_taxon-labels .VC2fja_taxon-label {
35
+ .RZWNlW_taxon-labels .RZWNlW_taxon-label {
36
36
  height: 100%;
37
37
  position: absolute;
38
38
  }
39
39
 
40
- .VC2fja_taxon-labels .VC2fja_taxon-label-inner {
40
+ .RZWNlW_taxon-labels .RZWNlW_taxon-label-inner {
41
41
  top: calc(var(--label-width, 200px) - 10px);
42
42
  transform-origin: 0 100%;
43
43
  background-color: var(--column-background-color);
@@ -45,10 +45,10 @@
45
45
  transform: rotate(-90deg)translate(10px, 8px);
46
46
  }
47
47
 
48
- .VC2fja_taxon-labels .VC2fja_taxon-label-text {
48
+ .RZWNlW_taxon-labels .RZWNlW_taxon-label-text {
49
49
  text-align: left;
50
50
  max-width: 300px;
51
51
  padding: 0 8px;
52
52
  font-style: italic;
53
53
  }
54
- /*# sourceMappingURL=column-views.b7016f82.css.map */
54
+ /*# sourceMappingURL=column-views.cb6fc808.css.map */