@macrostrat/column-views 2.1.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/esm/{column-views.4ab0ec82.js → column-views.073c42da.js} +142 -76
  3. package/dist/esm/column-views.073c42da.js.map +1 -0
  4. package/dist/esm/column-views.079119f4.js +17 -0
  5. package/dist/esm/column-views.079119f4.js.map +1 -0
  6. package/dist/esm/{column-views.77b49a43.js → column-views.0859feb3.js} +52 -23
  7. package/dist/esm/column-views.0859feb3.js.map +1 -0
  8. package/dist/esm/{column-views.1f7fb650.js → column-views.0a8a07f4.js} +3 -3
  9. package/dist/esm/{column-views.1f7fb650.js.map → column-views.0a8a07f4.js.map} +1 -1
  10. package/dist/esm/{column-views.0732894f.js → column-views.0f7f6ee6.js} +2 -2
  11. package/dist/esm/{column-views.0732894f.js.map → column-views.0f7f6ee6.js.map} +1 -1
  12. package/dist/esm/{column-views.448c0687.css → column-views.1151416d.css} +5 -5
  13. package/dist/esm/column-views.1151416d.css.map +1 -0
  14. package/dist/esm/{column-views.676cb1d3.js → column-views.1b644998.js} +3 -3
  15. package/dist/esm/{column-views.676cb1d3.js.map → column-views.1b644998.js.map} +1 -1
  16. package/dist/esm/{column-views.686d21ad.js → column-views.22ec902b.js} +4 -1
  17. package/dist/esm/column-views.22ec902b.js.map +1 -0
  18. package/dist/esm/{column-views.02f3732a.js → column-views.285cbb65.js} +40 -20
  19. package/dist/esm/column-views.285cbb65.js.map +1 -0
  20. package/dist/esm/{column-views.97d542eb.js → column-views.2d602a57.js} +4 -4
  21. package/dist/esm/column-views.2d602a57.js.map +1 -0
  22. package/dist/esm/{column-views.b17f793f.css → column-views.321af3ae.css} +7 -1
  23. package/dist/esm/{column-views.686d21ad.js.map → column-views.321af3ae.css.map} +1 -1
  24. package/dist/esm/column-views.3a7179c4.js +137 -0
  25. package/dist/esm/column-views.3a7179c4.js.map +1 -0
  26. package/dist/esm/{column-views.78bd3f09.js → column-views.3e1b8c7d.js} +2 -2
  27. package/dist/esm/{column-views.78bd3f09.js.map → column-views.3e1b8c7d.js.map} +1 -1
  28. package/dist/esm/{column-views.42b89c52.js → column-views.3f528c5c.js} +50 -22
  29. package/dist/esm/column-views.3f528c5c.js.map +1 -0
  30. package/dist/esm/{column-views.1e055ed5.js → column-views.4fd4ec92.js} +17 -3
  31. package/dist/esm/column-views.4fd4ec92.js.map +1 -0
  32. package/dist/esm/{column-views.769fa0ee.js → column-views.53186d53.js} +2 -2
  33. package/dist/esm/{column-views.769fa0ee.js.map → column-views.53186d53.js.map} +1 -1
  34. package/dist/esm/{column-views.39657bbf.js → column-views.54f8b909.js} +7 -2
  35. package/dist/esm/column-views.54f8b909.js.map +1 -0
  36. package/dist/esm/{column-views.b72918ce.css → column-views.562db43a.css} +10 -2
  37. package/dist/esm/column-views.562db43a.css.map +1 -0
  38. package/dist/esm/{column-views.9e1c82fe.js → column-views.58b891df.js} +2 -2
  39. package/dist/esm/{column-views.9e1c82fe.js.map → column-views.58b891df.js.map} +1 -1
  40. package/dist/esm/{column-views.775846c9.js → column-views.5a49cd68.js} +8 -38
  41. package/dist/esm/column-views.5a49cd68.js.map +1 -0
  42. package/dist/esm/{column-views.f20eb583.js → column-views.5d969bc5.js} +4 -5
  43. package/dist/esm/column-views.5d969bc5.js.map +1 -0
  44. package/dist/esm/{column-views.243da806.js → column-views.63b7e5aa.js} +3 -3
  45. package/dist/esm/{column-views.243da806.js.map → column-views.63b7e5aa.js.map} +1 -1
  46. package/dist/esm/column-views.6698b95a.js +108 -0
  47. package/dist/esm/column-views.6698b95a.js.map +1 -0
  48. package/dist/esm/column-views.6c644353.js +184 -0
  49. package/dist/esm/column-views.6c644353.js.map +1 -0
  50. package/dist/esm/column-views.6e7082db.js +16 -0
  51. package/dist/esm/column-views.6e7082db.js.map +1 -0
  52. package/dist/esm/column-views.70164236.js +206 -0
  53. package/dist/esm/column-views.70164236.js.map +1 -0
  54. package/dist/esm/{column-views.7ca9e1cd.js → column-views.73b8ff16.js} +19 -21
  55. package/dist/esm/column-views.73b8ff16.js.map +1 -0
  56. package/dist/esm/{column-views.cc5244c4.js → column-views.77561197.js} +91 -55
  57. package/dist/esm/column-views.77561197.js.map +1 -0
  58. package/dist/esm/{column-views.e7ab5af0.js → column-views.83395185.js} +3 -3
  59. package/dist/esm/{column-views.e7ab5af0.js.map → column-views.83395185.js.map} +1 -1
  60. package/dist/esm/{column-views.8e3dec90.js → column-views.86a51ce7.js} +2 -2
  61. package/dist/esm/{column-views.8e3dec90.js.map → column-views.86a51ce7.js.map} +1 -1
  62. package/dist/esm/{column-views.f08929e2.js → column-views.88d63dd0.js} +5 -3
  63. package/dist/esm/column-views.88d63dd0.js.map +1 -0
  64. package/dist/esm/{column-views.3f246167.js → column-views.8c296309.js} +5 -5
  65. package/dist/esm/column-views.8c296309.js.map +1 -0
  66. package/dist/esm/{column-views.ab0380ed.js → column-views.8d24b179.js} +3 -3
  67. package/dist/esm/{column-views.ab0380ed.js.map → column-views.8d24b179.js.map} +1 -1
  68. package/dist/esm/{column-views.a6301a41.js → column-views.986e7566.js} +7 -7
  69. package/dist/esm/{column-views.a6301a41.js.map → column-views.986e7566.js.map} +1 -1
  70. package/dist/esm/{column-views.86619334.js → column-views.9ddbe7df.js} +2 -2
  71. package/dist/esm/{column-views.86619334.js.map → column-views.9ddbe7df.js.map} +1 -1
  72. package/dist/esm/{column-views.2ff3dd8b.js → column-views.ae7c0a2b.js} +31 -60
  73. package/dist/esm/column-views.ae7c0a2b.js.map +1 -0
  74. package/dist/esm/{column-views.9892f825.js → column-views.aecf25bc.js} +75 -42
  75. package/dist/esm/column-views.aecf25bc.js.map +1 -0
  76. package/dist/esm/column-views.b7016f82.css +54 -0
  77. package/dist/esm/column-views.b7016f82.css.map +1 -0
  78. package/dist/esm/{column-views.a195109e.js → column-views.ba0381cc.js} +2 -2
  79. package/dist/esm/{column-views.a195109e.js.map → column-views.ba0381cc.js.map} +1 -1
  80. package/dist/esm/{column-views.75ea6dbe.js → column-views.c518ef14.js} +9 -4
  81. package/dist/esm/column-views.c518ef14.js.map +1 -0
  82. package/dist/esm/{column-views.f7523c1d.js → column-views.c92a359e.js} +2 -2
  83. package/dist/esm/{column-views.f7523c1d.js.map → column-views.c92a359e.js.map} +1 -1
  84. package/dist/esm/{column-views.cdadc5c2.js → column-views.cc733361.js} +7 -1
  85. package/dist/esm/column-views.cc733361.js.map +1 -0
  86. package/dist/esm/{column-views.4d22c21c.js → column-views.d15d8655.js} +22 -4
  87. package/dist/esm/column-views.d15d8655.js.map +1 -0
  88. package/dist/esm/{column-views.5e2dc19d.js → column-views.d261b02d.js} +3 -3
  89. package/dist/esm/{column-views.5e2dc19d.js.map → column-views.d261b02d.js.map} +1 -1
  90. package/dist/esm/{column-views.fbc7401f.js → column-views.d406665d.js} +5 -5
  91. package/dist/esm/{column-views.fbc7401f.js.map → column-views.d406665d.js.map} +1 -1
  92. package/dist/esm/{column-views.7715e35e.js → column-views.d69c4a9f.js} +3 -3
  93. package/dist/esm/{column-views.7715e35e.js.map → column-views.d69c4a9f.js.map} +1 -1
  94. package/dist/esm/{column-views.547b2730.js → column-views.d9c6b527.js} +15 -12
  95. package/dist/esm/column-views.d9c6b527.js.map +1 -0
  96. package/dist/esm/{column-views.8d4ce558.css → column-views.e33ac5c9.css} +26 -9
  97. package/dist/esm/column-views.e33ac5c9.css.map +1 -0
  98. package/dist/esm/column-views.e3bf5384.js +15 -0
  99. package/dist/esm/{column-views.38a305a0.js.map → column-views.e3bf5384.js.map} +1 -1
  100. package/dist/esm/{column-views.e3b9a317.js → column-views.e4c26185.js} +2 -2
  101. package/dist/esm/{column-views.e3b9a317.js.map → column-views.e4c26185.js.map} +1 -1
  102. package/dist/esm/column-views.e84bd756.js +92 -0
  103. package/dist/esm/column-views.e84bd756.js.map +1 -0
  104. package/dist/esm/column-views.ea4ebbb7.js +31 -0
  105. package/dist/esm/column-views.ea4ebbb7.js.map +1 -0
  106. package/dist/esm/column-views.ed05e233.js +13 -0
  107. package/dist/esm/{column-views.0a159282.js.map → column-views.ed05e233.js.map} +1 -1
  108. package/dist/esm/{column-views.64a84c43.js → column-views.f2fd0e4a.js} +10 -2
  109. package/dist/esm/column-views.f2fd0e4a.js.map +1 -0
  110. package/dist/esm/{column-views.935ef6f7.js → column-views.f46a0b36.js} +2 -2
  111. package/dist/esm/{column-views.935ef6f7.js.map → column-views.f46a0b36.js.map} +1 -1
  112. package/dist/esm/{column-views.d48cb0d8.js → column-views.fcf25ec6.js} +7 -1
  113. package/dist/esm/column-views.fcf25ec6.js.map +1 -0
  114. package/dist/esm/index.d.ts +217 -406
  115. package/dist/esm/index.d.ts.map +1 -1
  116. package/dist/esm/index.js +12 -12
  117. package/dist/node/{column-views.858b5cf4.js → column-views.01debc76.js} +2 -2
  118. package/dist/node/{column-views.858b5cf4.js.map → column-views.01debc76.js.map} +1 -1
  119. package/dist/node/{column-views.51bc87ca.js → column-views.040499c9.js} +2 -2
  120. package/dist/node/{column-views.51bc87ca.js.map → column-views.040499c9.js.map} +1 -1
  121. package/dist/node/{column-views.e3ba0594.js → column-views.07ff1fdf.js} +2 -2
  122. package/dist/node/{column-views.e3ba0594.js.map → column-views.07ff1fdf.js.map} +1 -1
  123. package/dist/node/{column-views.3a55ecd7.css → column-views.0840b115.css} +2 -2
  124. package/dist/node/column-views.0840b115.css.map +1 -0
  125. package/dist/node/column-views.0b3a384e.js +2 -0
  126. package/dist/node/column-views.0b3a384e.js.map +1 -0
  127. package/dist/node/column-views.0bd15ee4.js +2 -0
  128. package/dist/node/column-views.0bd15ee4.js.map +1 -0
  129. package/dist/node/column-views.105f6ad2.js +2 -0
  130. package/dist/node/column-views.105f6ad2.js.map +1 -0
  131. package/dist/node/column-views.1261be59.js +2 -0
  132. package/dist/node/column-views.1261be59.js.map +1 -0
  133. package/dist/node/{column-views.45fab61b.js → column-views.13e69859.js} +2 -2
  134. package/dist/node/{column-views.45fab61b.js.map → column-views.13e69859.js.map} +1 -1
  135. package/dist/node/column-views.16f336ee.js +2 -0
  136. package/dist/node/column-views.16f336ee.js.map +1 -0
  137. package/dist/node/{column-views.58d2f993.js → column-views.1a7f8afd.js} +2 -2
  138. package/dist/node/{column-views.58d2f993.js.map → column-views.1a7f8afd.js.map} +1 -1
  139. package/dist/node/column-views.29eb25bd.css +2 -0
  140. package/dist/node/column-views.29eb25bd.css.map +1 -0
  141. package/dist/node/column-views.2bd97c2e.js +2 -0
  142. package/dist/node/column-views.2bd97c2e.js.map +1 -0
  143. package/dist/node/column-views.3b37363f.js +2 -0
  144. package/dist/node/column-views.3b37363f.js.map +1 -0
  145. package/dist/node/column-views.45296250.js +2 -0
  146. package/dist/node/column-views.45296250.js.map +1 -0
  147. package/dist/node/{column-views.0cbd4a3f.js → column-views.48a3cfa3.js} +2 -2
  148. package/dist/node/{column-views.0cbd4a3f.js.map → column-views.48a3cfa3.js.map} +1 -1
  149. package/dist/node/{column-views.42db0bb8.js → column-views.492c2c72.js} +2 -2
  150. package/dist/node/{column-views.42db0bb8.js.map → column-views.492c2c72.js.map} +1 -1
  151. package/dist/node/column-views.50a992d3.css +2 -0
  152. package/dist/node/column-views.50a992d3.css.map +1 -0
  153. package/dist/node/column-views.573cb29d.js +2 -0
  154. package/dist/node/column-views.573cb29d.js.map +1 -0
  155. package/dist/node/column-views.576e3c5a.js +2 -0
  156. package/dist/node/column-views.576e3c5a.js.map +1 -0
  157. package/dist/node/column-views.5f3b0b04.js +2 -0
  158. package/dist/node/column-views.5f3b0b04.js.map +1 -0
  159. package/dist/node/column-views.6fd5a922.js +2 -0
  160. package/dist/node/column-views.6fd5a922.js.map +1 -0
  161. package/dist/node/column-views.7150ba18.js +2 -0
  162. package/dist/node/column-views.7150ba18.js.map +1 -0
  163. package/dist/node/column-views.728c8dfc.js +2 -0
  164. package/dist/node/column-views.728c8dfc.js.map +1 -0
  165. package/dist/node/column-views.7425d37b.js +2 -0
  166. package/dist/node/column-views.7425d37b.js.map +1 -0
  167. package/dist/node/{column-views.2e4e357d.js → column-views.75582658.js} +2 -2
  168. package/dist/node/{column-views.2e4e357d.js.map → column-views.75582658.js.map} +1 -1
  169. package/dist/node/column-views.77ace3a2.js +2 -0
  170. package/dist/node/column-views.77ace3a2.js.map +1 -0
  171. package/dist/node/column-views.7f9c7448.js +2 -0
  172. package/dist/node/column-views.7f9c7448.js.map +1 -0
  173. package/dist/node/{column-views.a2274834.js → column-views.81294fb7.js} +2 -2
  174. package/dist/node/{column-views.a2274834.js.map → column-views.81294fb7.js.map} +1 -1
  175. package/dist/node/column-views.827a9894.js +2 -0
  176. package/dist/node/column-views.827a9894.js.map +1 -0
  177. package/dist/node/column-views.87b1439e.js +2 -0
  178. package/dist/node/column-views.87b1439e.js.map +1 -0
  179. package/dist/node/{column-views.492b4917.js → column-views.9dda582d.js} +2 -2
  180. package/dist/node/{column-views.492b4917.js.map → column-views.9dda582d.js.map} +1 -1
  181. package/dist/node/{column-views.2a6b842d.js → column-views.9e155f20.js} +2 -2
  182. package/dist/node/column-views.9e155f20.js.map +1 -0
  183. package/dist/node/column-views.a16cd1f2.js +2 -0
  184. package/dist/node/column-views.a16cd1f2.js.map +1 -0
  185. package/dist/node/{column-views.eeca917f.js → column-views.a34732e7.js} +2 -2
  186. package/dist/node/{column-views.eeca917f.js.map → column-views.a34732e7.js.map} +1 -1
  187. package/dist/node/{column-views.65f091ea.js → column-views.a396d3ac.js} +2 -2
  188. package/dist/node/{column-views.65f091ea.js.map → column-views.a396d3ac.js.map} +1 -1
  189. package/dist/node/column-views.aae09aca.js +2 -0
  190. package/dist/node/column-views.aae09aca.js.map +1 -0
  191. package/dist/node/{column-views.a372c943.js → column-views.ac1b58b7.js} +2 -2
  192. package/dist/node/{column-views.a372c943.js.map → column-views.ac1b58b7.js.map} +1 -1
  193. package/dist/node/column-views.aef76eee.js +2 -0
  194. package/dist/node/column-views.aef76eee.js.map +1 -0
  195. package/dist/node/column-views.b64cd0ea.js +2 -0
  196. package/dist/node/column-views.b64cd0ea.js.map +1 -0
  197. package/dist/node/{column-views.2d957a97.js → column-views.b6cd4360.js} +2 -2
  198. package/dist/node/column-views.b6cd4360.js.map +1 -0
  199. package/dist/node/column-views.c0be1157.js +2 -0
  200. package/dist/node/column-views.c0be1157.js.map +1 -0
  201. package/dist/node/column-views.c29e9eb8.js +2 -0
  202. package/dist/node/column-views.c29e9eb8.js.map +1 -0
  203. package/dist/node/column-views.c8df6435.js +2 -0
  204. package/dist/node/column-views.c8df6435.js.map +1 -0
  205. package/dist/node/column-views.cd2a5c85.js +2 -0
  206. package/dist/node/column-views.cd2a5c85.js.map +1 -0
  207. package/dist/node/{column-views.df97f28e.js → column-views.cd77a1d8.js} +2 -2
  208. package/dist/node/{column-views.df97f28e.js.map → column-views.cd77a1d8.js.map} +1 -1
  209. package/dist/node/column-views.cd7b223b.css +2 -0
  210. package/dist/node/column-views.cd7b223b.css.map +1 -0
  211. package/dist/node/column-views.cf2a78c1.js +2 -0
  212. package/dist/node/column-views.cf2a78c1.js.map +1 -0
  213. package/dist/node/{column-views.c7f6fc0a.js → column-views.d529d3aa.js} +2 -2
  214. package/dist/node/{column-views.c7f6fc0a.js.map → column-views.d529d3aa.js.map} +1 -1
  215. package/dist/node/{column-views.7010a03b.js → column-views.dd972321.js} +2 -2
  216. package/dist/node/{column-views.7010a03b.js.map → column-views.dd972321.js.map} +1 -1
  217. package/dist/node/column-views.e065152e.js +2 -0
  218. package/dist/node/column-views.e065152e.js.map +1 -0
  219. package/dist/node/{column-views.2ca669bc.js → column-views.e08f8715.js} +2 -2
  220. package/dist/node/{column-views.2ca669bc.js.map → column-views.e08f8715.js.map} +1 -1
  221. package/dist/node/{column-views.91043465.js → column-views.e0d9865e.js} +2 -2
  222. package/dist/node/column-views.e0d9865e.js.map +1 -0
  223. package/dist/node/column-views.e2562224.js +2 -0
  224. package/dist/node/column-views.e2562224.js.map +1 -0
  225. package/dist/node/column-views.e803e4ae.css +2 -0
  226. package/dist/node/column-views.e803e4ae.css.map +1 -0
  227. package/dist/node/column-views.edb4ba54.js +2 -0
  228. package/dist/node/column-views.edb4ba54.js.map +1 -0
  229. package/dist/node/index.js +1 -1
  230. package/dist/node/index.js.map +1 -1
  231. package/package.json +13 -13
  232. package/src/age-axis.module.sass +4 -2
  233. package/src/age-axis.ts +49 -15
  234. package/src/age-model-overlay.ts +22 -1
  235. package/src/column.module.sass +29 -9
  236. package/src/column.ts +91 -19
  237. package/src/correlation-chart/main.ts +10 -2
  238. package/src/correlation-chart/prepare-data.ts +7 -4
  239. package/src/correlation-chart/stories/correlation-chart.stories.ts +26 -1
  240. package/src/data-provider/base.ts +32 -24
  241. package/src/data-provider/fetch.ts +10 -3
  242. package/src/data-provider/store.ts +16 -10
  243. package/src/facets/base-sample-column.module.sass +14 -0
  244. package/src/facets/base-sample-column.ts +114 -0
  245. package/src/facets/detrital-zircon/index.ts +31 -63
  246. package/src/facets/fossils/index.module.sass +43 -13
  247. package/src/facets/fossils/index.ts +232 -158
  248. package/src/facets/fossils/provider.ts +121 -25
  249. package/src/facets/index.ts +1 -0
  250. package/src/facets/measurements/index.ts +1 -2
  251. package/src/prepare-units/composite-scale.ts +183 -155
  252. package/src/prepare-units/dynamic-scales.ts +298 -0
  253. package/src/prepare-units/helpers.ts +99 -87
  254. package/src/prepare-units/index.ts +77 -51
  255. package/src/prepare-units/types.ts +138 -0
  256. package/src/prepare-units/utils.ts +29 -1
  257. package/src/section.ts +46 -9
  258. package/src/unit-details/panel.module.sass +8 -1
  259. package/src/unit-details/panel.ts +123 -53
  260. package/src/unit-details/popover.ts +5 -0
  261. package/src/units/boxes.ts +1 -5
  262. package/src/units/composite.ts +3 -49
  263. package/src/units/selection.ts +21 -7
  264. package/dist/esm/column-views.02f3732a.js.map +0 -1
  265. package/dist/esm/column-views.0a159282.js +0 -13
  266. package/dist/esm/column-views.1e055ed5.js.map +0 -1
  267. package/dist/esm/column-views.2ff3dd8b.js.map +0 -1
  268. package/dist/esm/column-views.3048acc1.js +0 -66
  269. package/dist/esm/column-views.3048acc1.js.map +0 -1
  270. package/dist/esm/column-views.38a305a0.js +0 -13
  271. package/dist/esm/column-views.39657bbf.js.map +0 -1
  272. package/dist/esm/column-views.3f246167.js.map +0 -1
  273. package/dist/esm/column-views.42b89c52.js.map +0 -1
  274. package/dist/esm/column-views.448c0687.css.map +0 -1
  275. package/dist/esm/column-views.4ab0ec82.js.map +0 -1
  276. package/dist/esm/column-views.4d22c21c.js.map +0 -1
  277. package/dist/esm/column-views.547b2730.js.map +0 -1
  278. package/dist/esm/column-views.64a84c43.js.map +0 -1
  279. package/dist/esm/column-views.75ea6dbe.js.map +0 -1
  280. package/dist/esm/column-views.775846c9.js.map +0 -1
  281. package/dist/esm/column-views.77b49a43.js.map +0 -1
  282. package/dist/esm/column-views.7ca9e1cd.js.map +0 -1
  283. package/dist/esm/column-views.8703a35b.js +0 -163
  284. package/dist/esm/column-views.8703a35b.js.map +0 -1
  285. package/dist/esm/column-views.8d4ce558.css.map +0 -1
  286. package/dist/esm/column-views.97d542eb.js.map +0 -1
  287. package/dist/esm/column-views.9892f825.js.map +0 -1
  288. package/dist/esm/column-views.b17f793f.css.map +0 -1
  289. package/dist/esm/column-views.b3c1eb9e.js +0 -16
  290. package/dist/esm/column-views.b3c1eb9e.js.map +0 -1
  291. package/dist/esm/column-views.b72918ce.css.map +0 -1
  292. package/dist/esm/column-views.c71c321c.js +0 -104
  293. package/dist/esm/column-views.c71c321c.js.map +0 -1
  294. package/dist/esm/column-views.cc5244c4.js.map +0 -1
  295. package/dist/esm/column-views.cdadc5c2.js.map +0 -1
  296. package/dist/esm/column-views.d48cb0d8.js.map +0 -1
  297. package/dist/esm/column-views.f08929e2.js.map +0 -1
  298. package/dist/esm/column-views.f20eb583.js.map +0 -1
  299. package/dist/node/column-views.085f4a51.js +0 -2
  300. package/dist/node/column-views.085f4a51.js.map +0 -1
  301. package/dist/node/column-views.0dfc7ef7.js +0 -2
  302. package/dist/node/column-views.0dfc7ef7.js.map +0 -1
  303. package/dist/node/column-views.1a0b56fc.js +0 -2
  304. package/dist/node/column-views.1a0b56fc.js.map +0 -1
  305. package/dist/node/column-views.2926f656.css +0 -2
  306. package/dist/node/column-views.2926f656.css.map +0 -1
  307. package/dist/node/column-views.2a6b842d.js.map +0 -1
  308. package/dist/node/column-views.2d957a97.js.map +0 -1
  309. package/dist/node/column-views.307661d1.css +0 -2
  310. package/dist/node/column-views.307661d1.css.map +0 -1
  311. package/dist/node/column-views.33752461.js +0 -2
  312. package/dist/node/column-views.33752461.js.map +0 -1
  313. package/dist/node/column-views.38357d4a.js +0 -2
  314. package/dist/node/column-views.38357d4a.js.map +0 -1
  315. package/dist/node/column-views.3a55ecd7.css.map +0 -1
  316. package/dist/node/column-views.3eeac38d.js +0 -2
  317. package/dist/node/column-views.3eeac38d.js.map +0 -1
  318. package/dist/node/column-views.45168c80.js +0 -2
  319. package/dist/node/column-views.45168c80.js.map +0 -1
  320. package/dist/node/column-views.4ca62e5d.js +0 -2
  321. package/dist/node/column-views.4ca62e5d.js.map +0 -1
  322. package/dist/node/column-views.6ae7bb69.js +0 -2
  323. package/dist/node/column-views.6ae7bb69.js.map +0 -1
  324. package/dist/node/column-views.6f7a432f.js +0 -2
  325. package/dist/node/column-views.6f7a432f.js.map +0 -1
  326. package/dist/node/column-views.755f726e.js +0 -2
  327. package/dist/node/column-views.755f726e.js.map +0 -1
  328. package/dist/node/column-views.758b9bc1.js +0 -2
  329. package/dist/node/column-views.758b9bc1.js.map +0 -1
  330. package/dist/node/column-views.78d3f3c5.js +0 -2
  331. package/dist/node/column-views.78d3f3c5.js.map +0 -1
  332. package/dist/node/column-views.80fcf105.js +0 -2
  333. package/dist/node/column-views.80fcf105.js.map +0 -1
  334. package/dist/node/column-views.8cfed88b.js +0 -2
  335. package/dist/node/column-views.8cfed88b.js.map +0 -1
  336. package/dist/node/column-views.91043465.js.map +0 -1
  337. package/dist/node/column-views.976a829b.js +0 -2
  338. package/dist/node/column-views.976a829b.js.map +0 -1
  339. package/dist/node/column-views.99fb74c0.js +0 -2
  340. package/dist/node/column-views.99fb74c0.js.map +0 -1
  341. package/dist/node/column-views.9b7a9ae1.js +0 -2
  342. package/dist/node/column-views.9b7a9ae1.js.map +0 -1
  343. package/dist/node/column-views.9de31cdb.js +0 -2
  344. package/dist/node/column-views.9de31cdb.js.map +0 -1
  345. package/dist/node/column-views.a4e6d4ad.js +0 -2
  346. package/dist/node/column-views.a4e6d4ad.js.map +0 -1
  347. package/dist/node/column-views.a501cea0.js +0 -2
  348. package/dist/node/column-views.a501cea0.js.map +0 -1
  349. package/dist/node/column-views.a7256aa7.js +0 -2
  350. package/dist/node/column-views.a7256aa7.js.map +0 -1
  351. package/dist/node/column-views.c4b409e1.css +0 -2
  352. package/dist/node/column-views.c4b409e1.css.map +0 -1
  353. package/dist/node/column-views.cef1b814.js +0 -2
  354. package/dist/node/column-views.cef1b814.js.map +0 -1
  355. package/dist/node/column-views.d6708353.js +0 -2
  356. package/dist/node/column-views.d6708353.js.map +0 -1
  357. package/dist/node/column-views.d9add589.js +0 -2
  358. package/dist/node/column-views.d9add589.js.map +0 -1
  359. package/dist/node/column-views.dfb2361a.js +0 -2
  360. package/dist/node/column-views.dfb2361a.js.map +0 -1
  361. package/dist/node/column-views.e9515ec1.js +0 -2
  362. package/dist/node/column-views.e9515ec1.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format
4
4
  is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
5
5
  project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.2.0] - 2025-11-28
8
+
9
+ - Update SGP and PBDB facets
10
+ - Improve `UnitDetailsPanel` styling and information content
11
+ - Improve use of discontinous scales
12
+ - Create `hybridScale` options block to allow more dynamic scale generation
13
+
7
14
  ## [2.1.4] - 2025-10-29
8
15
 
9
16
  - Improve stories
@@ -1,10 +1,14 @@
1
- import {ensureArray as $b6657fba8924a702$export$d0c8ecbd4ed8940c, getUnitHeightRange as $b6657fba8924a702$export$70e712e2ac0237a} from "./column-views.39657bbf.js";
1
+ import {ensureArray as $b6657fba8924a702$export$d0c8ecbd4ed8940c, getUnitHeightRange as $b6657fba8924a702$export$70e712e2ac0237a} from "./column-views.54f8b909.js";
2
+ import {buildHybridScale as $90d6b105908858a7$export$6b39f1b6356d94b6} from "./column-views.70164236.js";
3
+ import {HybridScaleType as $1254c5929638d7f9$export$45e8e2d7a1794c23} from "./column-views.079119f4.js";
2
4
  import {ColumnAxisType as $egi9E$ColumnAxisType} from "@macrostrat/column-components";
3
5
  import {scaleLinear as $egi9E$scaleLinear} from "d3-scale";
4
6
 
5
7
 
6
8
 
7
9
 
10
+
11
+
8
12
  function $728f6cf6c12cd490$export$e7184dd8bb3302ed(inputScales, unconformityHeight) {
9
13
  /** Finalize the heights of sections, including the heights of unconformities
10
14
  * between them.
@@ -12,7 +16,7 @@ function $728f6cf6c12cd490$export$e7184dd8bb3302ed(inputScales, unconformityHeig
12
16
  let lastSectionTopHeight = 0;
13
17
  const packages2 = [];
14
18
  for (const group of inputScales){
15
- const { domain: domain, pixelScale: pixelScale } = group;
19
+ const { domain: domain, scale: scale } = group;
16
20
  const [b_age, t_age] = domain;
17
21
  const key = `package-${b_age}-${t_age}`;
18
22
  packages2.push({
@@ -22,7 +26,7 @@ function $728f6cf6c12cd490$export$e7184dd8bb3302ed(inputScales, unconformityHeig
22
26
  // Unconformity height above this particular section
23
27
  paddingTop: totalHeight - lastSectionTopHeight
24
28
  });
25
- const pixelHeight = pixelScale * Math.abs(b_age - t_age);
29
+ const pixelHeight = Math.abs(scale(b_age) - scale(t_age));
26
30
  lastSectionTopHeight = totalHeight + pixelHeight;
27
31
  totalHeight = lastSectionTopHeight + unconformityHeight;
28
32
  }
@@ -59,13 +63,17 @@ function $728f6cf6c12cd490$export$7d3f3129a1a4b84e(sections, opts) {
59
63
  });
60
64
  }
61
65
  function $728f6cf6c12cd490$var$addScaleToSection(group, opts) {
62
- const { t_age: t_age, b_age: b_age, units: units } = group;
66
+ const { t_age: t_age, b_age: b_age, t_pos: t_pos, b_pos: b_pos, units: units } = group;
63
67
  let _range = null;
64
68
  // if t_age and b_age are set for a group, use them to define the range...
65
- if (t_age != null && b_age != null && opts.axisType == (0, $egi9E$ColumnAxisType).AGE) _range = [
69
+ if (opts.axisType == (0, $egi9E$ColumnAxisType).AGE) _range = [
66
70
  b_age,
67
71
  t_age
68
72
  ];
73
+ else _range = [
74
+ b_pos,
75
+ t_pos
76
+ ];
69
77
  const scaleInfo = $728f6cf6c12cd490$var$buildSectionScale(units, {
70
78
  ...opts,
71
79
  domain: _range
@@ -76,45 +84,78 @@ function $728f6cf6c12cd490$var$addScaleToSection(group, opts) {
76
84
  };
77
85
  }
78
86
  function $728f6cf6c12cd490$var$buildSectionScale(data, opts) {
79
- const { targetUnitHeight: targetUnitHeight = 20, minPixelScale: minPixelScale = 0.2, axisType: axisType, minSectionHeight: minSectionHeight } = opts;
87
+ const { targetUnitHeight: targetUnitHeight = 20, minPixelScale: minPixelScale = 0.2, axisType: axisType, minSectionHeight: minSectionHeight, scale: scale, hybridScale: hybridScale } = opts;
80
88
  const domain = opts.domain ?? $728f6cf6c12cd490$var$findSectionHeightRange(data, axisType);
81
89
  const dAge = Math.abs(domain[0] - domain[1]);
82
90
  let _pixelScale = opts.pixelScale;
83
- if (_pixelScale == null) {
84
- const avgAgeRange = $728f6cf6c12cd490$var$findAverageUnitHeight(data, axisType);
85
- // Get pixel height necessary to render average unit at target height
86
- _pixelScale = Math.max(targetUnitHeight / avgAgeRange, minPixelScale);
87
- // OLD METHOD that cares about overall section height vs. individual unit height
88
- // 0.2 pixel per myr is the floor scale
89
- //const targetHeight = targetUnitHeight * data.length;
90
- // 1 pixel per myr is the floor scale
91
- //_pixelScale = Math.max(targetHeight / dAge, minPixelScale);
91
+ let pixelHeight;
92
+ if (hybridScale != null) {
93
+ /** In an equidistant surfaces scale, we want to determine the heights of surfaces
94
+ * and then distribute units evenly between them.
95
+ * This is somewhat like an ordinal scale
96
+ */ if (hybridScale.type === (0, $1254c5929638d7f9$export$45e8e2d7a1794c23).EquidistantSurfaces) _pixelScale ??= targetUnitHeight;
97
+ return (0, $90d6b105908858a7$export$6b39f1b6356d94b6)(hybridScale, data, domain, {
98
+ pixelOffset: 0,
99
+ pixelScale: _pixelScale
100
+ });
92
101
  }
93
- let height = dAge * _pixelScale;
94
- // If height is less than minSectionHeight, set it to minSectionHeight
95
- const _minSectionHeight = minSectionHeight ?? targetUnitHeight ?? 0;
96
- height = Math.max(height, _minSectionHeight);
97
- _pixelScale = height / dAge;
102
+ if (scale == null) {
103
+ if (_pixelScale == null) {
104
+ const avgAgeRange = $728f6cf6c12cd490$var$findAverageUnitHeight(data, axisType);
105
+ // Get pixel height necessary to render average unit at target height
106
+ _pixelScale = Math.max(targetUnitHeight / avgAgeRange, minPixelScale);
107
+ // OLD METHOD that cares about overall section height vs. individual unit height
108
+ // 0.2 pixel per myr is the floor scale
109
+ //const targetHeight = targetUnitHeight * data.length;
110
+ // 1 pixel per myr is the floor scale
111
+ //_pixelScale = Math.max(targetHeight / dAge, minPixelScale);
112
+ }
113
+ let height = dAge * _pixelScale;
114
+ // If height is less than minSectionHeight, set it to minSectionHeight
115
+ const _minSectionHeight = minSectionHeight ?? targetUnitHeight ?? 0;
116
+ pixelHeight = Math.max(height, _minSectionHeight);
117
+ _pixelScale = pixelHeight / dAge;
118
+ } else // If a scale is provided, use it to compute pixel height
119
+ pixelHeight = Math.abs(scale(domain[0]) - scale(domain[1]));
98
120
  return $728f6cf6c12cd490$export$d6235b492bceb8c5({
121
+ scale: scale,
99
122
  domain: domain,
123
+ pixelHeight: pixelHeight,
100
124
  pixelScale: _pixelScale
101
125
  }, 0);
102
126
  }
103
127
  function $728f6cf6c12cd490$export$d6235b492bceb8c5(def, offset = 0) {
104
128
  /** Build a section scale */ // Domain should be oriented from bottom to top, but scale is oriented from top to bottom
105
- const { domain: domain, pixelScale: pixelScale } = def;
106
- const pixelHeight = pixelScale * Math.abs(domain[0] - domain[1]);
129
+ const { domain: domain, pixelScale: pixelScale, pixelHeight: pixelHeight, scale: scale, heightScale: heightScale } = def;
130
+ if (scale == null && pixelScale == null) throw new Error("Either scale or pixelScale must be provided");
131
+ let _scale;
132
+ if (scale == null) _scale = (0, $egi9E$scaleLinear)().domain([
133
+ domain[1],
134
+ domain[0]
135
+ ]).range([
136
+ offset,
137
+ pixelHeight + offset
138
+ ]);
139
+ else {
140
+ const domain0 = scale.domain();
141
+ const range0 = scale.range();
142
+ _scale = scale.copy().domain(domain0).range(range0.map((d)=>d + offset));
143
+ }
144
+ _scale.clamp();
145
+ let _heightScale = null;
146
+ if (heightScale != null) {
147
+ // Adjust height scale as well
148
+ const range0 = scale.range();
149
+ _heightScale = heightScale.copy().range(range0.map((d)=>d + offset));
150
+ _heightScale.clamp();
151
+ }
107
152
  return {
108
153
  domain: domain,
109
154
  pixelScale: pixelScale,
110
155
  pixelHeight: pixelHeight,
111
- scale: (0, $egi9E$scaleLinear)().domain([
112
- domain[1],
113
- domain[0]
114
- ]).range([
115
- offset,
116
- pixelHeight + offset
117
- ])
156
+ scale: _scale,
157
+ // Internal details for hybrid scales. TODO: improve this
158
+ heightScale: _heightScale
118
159
  };
119
160
  }
120
161
  function $728f6cf6c12cd490$var$findSectionHeightRange(data, axisType) {
@@ -150,66 +191,65 @@ function $728f6cf6c12cd490$var$findAverageUnitHeight(data, axisType) {
150
191
  return unitHeights.reduce((a, b)=>a + b, 0) / unitHeights.length;
151
192
  }
152
193
  function $728f6cf6c12cd490$export$3ada7641926a616d(sections, interpolateUnconformities = false) {
153
- /** Create a scale that works across multiple packages */ // Get surfaces at which scale breaks
154
- let scaleBreaks = [];
194
+ /** Create a scale that works across multiple packages */ const scales = [];
195
+ let lastScale = null;
155
196
  for (const section of sections){
156
- const { pixelHeight: pixelHeight, offset: offset, domain: domain } = section.scaleInfo;
157
- scaleBreaks.push([
158
- domain[1],
159
- offset
160
- ]);
161
- scaleBreaks.push([
162
- domain[0],
163
- offset + pixelHeight
164
- ]);
197
+ const _scale = section.scaleInfo.scale.copy().clamp(true);
198
+ scales.push(_scale);
199
+ if (lastScale != null && interpolateUnconformities) {
200
+ // Add a new scale that interpolates between lastScale and _scale
201
+ const lastDomain = lastScale.domain();
202
+ const lastRange = lastScale.range();
203
+ const currentDomain = _scale.domain();
204
+ const currentRange = _scale.range();
205
+ const interpScale = (0, $egi9E$scaleLinear)().domain([
206
+ lastDomain[lastDomain.length - 1],
207
+ currentDomain[0]
208
+ ]).range([
209
+ lastRange[lastRange.length - 1],
210
+ currentRange[0]
211
+ ]).clamp(true);
212
+ scales.push(interpScale);
213
+ }
214
+ lastScale = _scale;
165
215
  }
166
- // Sort the scale breaks by age
167
- scaleBreaks.sort((a, b)=>a[0] - b[0]);
168
216
  const scale = (age)=>{
169
- // Accumulate scale breaks and pixel height
170
- let lastHeight = 0;
171
- let lastAge = null;
172
- for (const [age1, height] of scaleBreaks){
173
- if (age <= age1) {
174
- let deltaAge = age1 - lastAge;
175
- if (deltaAge === 0) // If the age is exactly at a scale break, return the height at that break
176
- return height;
177
- let pixelScale = (height - lastHeight) / deltaAge;
178
- return lastHeight + (age - lastAge) * pixelScale;
179
- }
180
- lastAge = age1;
181
- lastHeight = height;
217
+ for (const s of scales){
218
+ const domain = s.domain();
219
+ if (age >= domain[0] && age <= domain[domain.length - 1]) return s(age);
182
220
  }
221
+ return null;
183
222
  };
184
223
  scale.copy = ()=>{
185
224
  return $728f6cf6c12cd490$export$3ada7641926a616d(sections, interpolateUnconformities);
186
225
  };
187
226
  scale.domain = ()=>{
188
- /** Return the domain of the scale */ const firstSection = sections[0].scaleInfo.domain;
189
- const lastSection = sections[sections.length - 1].scaleInfo.domain;
190
- if (firstSection[0] < lastSection[0]) return [
191
- Math.min(...firstSection),
192
- Math.max(...lastSection)
227
+ /** Return the domain of the scale */ const vals = sections.flatMap((d)=>d.scaleInfo.domain);
228
+ if (vals[0] < vals[vals.length - 1]) // age axes
229
+ return [
230
+ Math.min(...vals),
231
+ Math.max(...vals)
193
232
  ];
194
- else // Catches "normal" axes like height
233
+ // Normal axes like height
195
234
  return [
196
- Math.max(...firstSection),
197
- Math.min(...lastSection)
235
+ Math.max(...vals),
236
+ Math.min(...vals)
198
237
  ];
199
238
  };
200
239
  scale.invert = (pixelHeight)=>{
201
240
  /** Invert the scale to get the age at a given pixel height */ // Iterate through the sections to find the correct one
202
- let lastAge = null;
203
- for (const section of sections){
204
- const { pixelHeight: sectionHeight, pixelScale: pixelScale, offset: offset, domain: domain } = section.scaleInfo;
205
- if (pixelHeight >= offset && pixelHeight <= offset + sectionHeight && pixelScale > 0) {
206
- const age = domain[1] + (pixelHeight - offset) / pixelScale;
207
- return age;
241
+ for (const scale of scales){
242
+ const range = scale.range();
243
+ if (pixelHeight > Math.min(...range) && pixelHeight <= Math.max(...range)) {
244
+ console.log("Inverting scale at pixel height", pixelHeight);
245
+ return scale.invert(pixelHeight);
208
246
  }
209
- lastAge = domain[1];
210
247
  }
211
248
  return null;
212
249
  };
250
+ scale.clamp = (clamp)=>{
251
+ /** Clamp all constituent scales */ for (const s of scales)s.clamp(clamp);
252
+ };
213
253
  return scale;
214
254
  }
215
255
  function $728f6cf6c12cd490$export$edbf01b435c75274(sections, threshold, opts) {
@@ -220,9 +260,34 @@ function $728f6cf6c12cd490$export$edbf01b435c75274(sections, threshold, opts) {
220
260
  currentSection = nextSection;
221
261
  continue;
222
262
  }
223
- const dAge = Math.abs(nextSection.t_age - currentSection.b_age);
224
- const pxHeight = dAge * Math.max(currentSection.scaleInfo.pixelScale, nextSection.scaleInfo.pixelScale);
263
+ let heights;
264
+ let pxHeights;
265
+ if (opts.axisType !== (0, $egi9E$ColumnAxisType).AGE) heights = [
266
+ nextSection.t_pos,
267
+ currentSection.b_pos
268
+ ];
269
+ else heights = [
270
+ nextSection.t_age,
271
+ currentSection.b_age
272
+ ];
273
+ const _diff = (vals)=>{
274
+ return Math.abs(vals[0] - vals[1]);
275
+ };
276
+ pxHeights = [
277
+ _diff(heights.map(nextSection.scaleInfo.scale)),
278
+ _diff(heights.map(currentSection.scaleInfo.scale))
279
+ ];
280
+ const pxHeight = Math.min(...pxHeights);
225
281
  if (pxHeight < threshold) {
282
+ let t_pos;
283
+ let b_pos;
284
+ if (opts.axisType == (0, $egi9E$ColumnAxisType).AGE || opts.axisType == (0, $egi9E$ColumnAxisType).DEPTH) {
285
+ t_pos = Math.min(currentSection.t_pos, nextSection.t_pos);
286
+ b_pos = Math.max(currentSection.b_pos, nextSection.b_pos);
287
+ } else {
288
+ t_pos = Math.max(currentSection.t_pos, nextSection.t_pos);
289
+ b_pos = Math.min(currentSection.b_pos, nextSection.b_pos);
290
+ }
226
291
  // We need to merge the sections
227
292
  const compositeSection0 = {
228
293
  units: [
@@ -234,10 +299,11 @@ function $728f6cf6c12cd490$export$edbf01b435c75274(sections, threshold, opts) {
234
299
  ...(0, $b6657fba8924a702$export$d0c8ecbd4ed8940c)(nextSection.section_id)
235
300
  ],
236
301
  t_age: Math.min(currentSection.t_age, nextSection.t_age),
237
- b_age: Math.max(currentSection.b_age, nextSection.b_age)
302
+ b_age: Math.max(currentSection.b_age, nextSection.b_age),
303
+ t_pos: t_pos,
304
+ b_pos: b_pos
238
305
  };
239
- const compositeSection = $728f6cf6c12cd490$var$addScaleToSection(compositeSection0, opts);
240
- currentSection = compositeSection;
306
+ currentSection = $728f6cf6c12cd490$var$addScaleToSection(compositeSection0, opts);
241
307
  } else {
242
308
  // We need to keep the section
243
309
  newSections.push(currentSection);
@@ -250,4 +316,4 @@ function $728f6cf6c12cd490$export$edbf01b435c75274(sections, threshold, opts) {
250
316
 
251
317
 
252
318
  export {$728f6cf6c12cd490$export$e7184dd8bb3302ed as buildCompositeScaleInfo, $728f6cf6c12cd490$export$d6235b492bceb8c5 as createPackageScale, $728f6cf6c12cd490$export$67442a0f5bef147b as finalizeSectionHeights, $728f6cf6c12cd490$export$7d3f3129a1a4b84e as computeSectionHeights, $728f6cf6c12cd490$export$3ada7641926a616d as createCompositeScale, $728f6cf6c12cd490$export$edbf01b435c75274 as collapseUnconformitiesByPixelHeight};
253
- //# sourceMappingURL=column-views.4ab0ec82.js.map
319
+ //# sourceMappingURL=column-views.073c42da.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/column-views/src/prepare-units/composite-scale.ts"],"sourcesContent":["import { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { ensureArray, getUnitHeightRange } from \"./utils\";\nimport { ScaleContinuousNumeric, scaleLinear } from \"d3-scale\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport { buildHybridScale } from \"./dynamic-scales\";\nimport { ExtUnit, HybridScaleType, SectionInfo } from \"./types\";\nimport type {\n ColumnScaleOptions,\n CompositeColumnData,\n CompositeScaleData,\n PackageLayoutData,\n PackageScaleInfo,\n PackageScaleLayoutData,\n SectionScaleOptions,\n} from \"./types\";\n\n// Composite scale information augmented with units in each package\n\nexport function buildCompositeScaleInfo(\n inputScales: PackageScaleInfo[],\n unconformityHeight: number,\n): CompositeScaleData {\n /** Finalize the heights of sections, including the heights of unconformities\n * between them.\n */\n\n let totalHeight = unconformityHeight / 2;\n let lastSectionTopHeight = 0;\n\n const packages2: PackageScaleLayoutData[] = [];\n for (const group of inputScales) {\n const { domain, scale } = group;\n const [b_age, t_age] = domain;\n const key = `package-${b_age}-${t_age}`;\n\n packages2.push({\n ...createPackageScale(group, totalHeight),\n key,\n offset: totalHeight,\n // Unconformity height above this particular section\n paddingTop: totalHeight - lastSectionTopHeight,\n });\n\n const pixelHeight = Math.abs(scale(b_age) - scale(t_age));\n lastSectionTopHeight = totalHeight + pixelHeight;\n totalHeight = lastSectionTopHeight + unconformityHeight;\n }\n totalHeight += unconformityHeight / 2;\n return {\n totalHeight,\n sections: packages2,\n };\n}\n\nexport function finalizeSectionHeights<T extends UnitLong>(\n sections: SectionInfoWithScale<T>[],\n unconformityHeight: number,\n): CompositeColumnData<T> {\n /** Finalize the heights of sections, including the heights of unconformities\n * between them.\n */\n\n const sectionScales = sections.map((d) => d.scaleInfo);\n\n const { totalHeight, sections: packages } = buildCompositeScaleInfo(\n sectionScales,\n unconformityHeight,\n );\n\n // This could perhaps be simplified.\n const sections1: PackageLayoutData<T>[] = [];\n for (const i in sections) {\n const group = sections[i];\n const scaleInfo = packages[i];\n sections1.push({\n ...group,\n key: scaleInfo.key,\n scaleInfo,\n });\n }\n return {\n totalHeight,\n sections: sections1,\n };\n}\n\nexport interface SectionInfoWithScale<\n T extends UnitLong = ExtUnit,\n> extends SectionInfo<T> {\n scaleInfo: PackageScaleInfo;\n}\n\nexport function computeSectionHeights<T extends UnitLong>(\n sections: SectionInfo<T>[],\n opts: ColumnScaleOptions,\n): SectionInfoWithScale<T>[] {\n return sections.map((group) => {\n return addScaleToSection<T>(group, opts);\n });\n}\n\nfunction addScaleToSection<T extends UnitLong = ExtUnit>(\n group: SectionInfo<T>,\n opts: ColumnScaleOptions,\n): SectionInfoWithScale<T> {\n const { t_age, b_age, t_pos, b_pos, units } = group;\n let _range = null;\n // if t_age and b_age are set for a group, use them to define the range...\n if (opts.axisType == ColumnAxisType.AGE) {\n _range = [b_age, t_age];\n } else {\n _range = [b_pos, t_pos];\n }\n\n const scaleInfo = buildSectionScale<T>(units, {\n ...opts,\n domain: _range,\n });\n\n return {\n ...group,\n scaleInfo,\n };\n}\n\nfunction buildSectionScale<T extends UnitLong>(\n data: T[],\n opts: SectionScaleOptions,\n): PackageScaleInfo {\n const {\n targetUnitHeight = 20,\n minPixelScale = 0.2,\n axisType,\n minSectionHeight,\n scale,\n hybridScale,\n } = opts;\n const domain = opts.domain ?? findSectionHeightRange(data, axisType);\n\n const dAge = Math.abs(domain[0] - domain[1]);\n\n let _pixelScale = opts.pixelScale;\n let pixelHeight: number;\n\n if (hybridScale != null) {\n /** In an equidistant surfaces scale, we want to determine the heights of surfaces\n * and then distribute units evenly between them.\n * This is somewhat like an ordinal scale\n */\n if (hybridScale.type === HybridScaleType.EquidistantSurfaces) {\n _pixelScale ??= targetUnitHeight;\n }\n\n return buildHybridScale(hybridScale, data, domain, {\n pixelOffset: 0,\n pixelScale: _pixelScale,\n });\n }\n\n if (scale == null) {\n if (_pixelScale == null) {\n const avgAgeRange = findAverageUnitHeight(data, axisType);\n // Get pixel height necessary to render average unit at target height\n _pixelScale = Math.max(targetUnitHeight / avgAgeRange, minPixelScale);\n\n // OLD METHOD that cares about overall section height vs. individual unit height\n // 0.2 pixel per myr is the floor scale\n //const targetHeight = targetUnitHeight * data.length;\n // 1 pixel per myr is the floor scale\n //_pixelScale = Math.max(targetHeight / dAge, minPixelScale);\n }\n\n let height = dAge * _pixelScale;\n // If height is less than minSectionHeight, set it to minSectionHeight\n const _minSectionHeight = minSectionHeight ?? targetUnitHeight ?? 0;\n pixelHeight = Math.max(height, _minSectionHeight);\n _pixelScale = pixelHeight / dAge;\n } else {\n // If a scale is provided, use it to compute pixel height\n pixelHeight = Math.abs(scale(domain[0]) - scale(domain[1]));\n }\n\n return createPackageScale(\n { scale, domain, pixelHeight, pixelScale: _pixelScale },\n 0,\n );\n}\n\nexport function createPackageScale(\n def: PackageScaleInfo,\n offset: number = 0,\n): PackageScaleInfo {\n /** Build a section scale */\n // Domain should be oriented from bottom to top, but scale is oriented from top to bottom\n const { domain, pixelScale, pixelHeight, scale, heightScale } = def;\n\n if (scale == null && pixelScale == null) {\n throw new Error(\"Either scale or pixelScale must be provided\");\n }\n\n let _scale: ScaleContinuousNumeric<number, number>;\n if (scale == null) {\n _scale = scaleLinear()\n .domain([domain[1], domain[0]])\n .range([offset, pixelHeight + offset]);\n } else {\n const domain0 = scale.domain();\n const range0 = scale.range();\n _scale = scale\n .copy()\n .domain(domain0)\n .range(range0.map((d) => d + offset));\n }\n\n _scale.clamp();\n\n let _heightScale = null;\n if (heightScale != null) {\n // Adjust height scale as well\n const range0 = scale.range();\n _heightScale = heightScale.copy().range(range0.map((d) => d + offset));\n _heightScale.clamp();\n }\n\n return {\n domain,\n pixelScale,\n pixelHeight,\n scale: _scale,\n // Internal details for hybrid scales. TODO: improve this\n heightScale: _heightScale,\n };\n}\n\nfunction findSectionHeightRange(\n data: UnitLong[],\n axisType: ColumnAxisType,\n): [number, number] {\n if (axisType == null) {\n throw new Error(\"Axis type is not set\");\n }\n if (axisType === ColumnAxisType.AGE) {\n const t_age = Math.min(...data.map((d) => d.t_age));\n const b_age = Math.max(...data.map((d) => d.b_age));\n return [b_age, t_age];\n } else if (\n axisType == ColumnAxisType.DEPTH ||\n axisType == ColumnAxisType.ORDINAL\n ) {\n const t_pos = Math.min(...data.map((d) => d.t_pos));\n const b_pos = Math.max(...data.map((d) => d.b_pos));\n return [b_pos, t_pos];\n } else if (axisType == ColumnAxisType.HEIGHT) {\n const t_pos = Math.max(...data.map((d) => d.t_pos));\n const b_pos = Math.min(...data.map((d) => d.b_pos));\n return [b_pos, t_pos];\n }\n}\n\nfunction findAverageUnitHeight(\n data: UnitLong[],\n axisType: ColumnAxisType,\n): number {\n const unitHeights = data.map((d) => {\n const [b_pos, t_pos] = getUnitHeightRange(d, axisType);\n return Math.abs(b_pos - t_pos);\n });\n return unitHeights.reduce((a, b) => a + b, 0) / unitHeights.length;\n}\n\nexport interface CompositeColumnScale {\n (age: number): number | null;\n copy(): CompositeColumnScale;\n domain(): [number, number];\n invert(pixelHeight: number): number | null;\n clamp(clamp: boolean): void;\n}\n\nexport function createCompositeScale(\n sections: PackageLayoutData[],\n interpolateUnconformities: boolean = false,\n): CompositeColumnScale {\n /** Create a scale that works across multiple packages */\n\n const scales: ScaleContinuousNumeric<number, number>[] = [];\n\n let lastScale: ScaleContinuousNumeric<number, number> | null = null;\n for (const section of sections) {\n const _scale = section.scaleInfo.scale.copy().clamp(true);\n scales.push(_scale);\n if (lastScale != null && interpolateUnconformities) {\n // Add a new scale that interpolates between lastScale and _scale\n const lastDomain = lastScale.domain();\n const lastRange = lastScale.range();\n const currentDomain = _scale.domain();\n const currentRange = _scale.range();\n\n const interpScale = scaleLinear()\n .domain([lastDomain[lastDomain.length - 1], currentDomain[0]])\n .range([lastRange[lastRange.length - 1], currentRange[0]])\n .clamp(true);\n scales.push(interpScale);\n }\n lastScale = _scale;\n }\n\n const scale: CompositeColumnScale = (age) => {\n for (const s of scales) {\n const domain = s.domain();\n if (age >= domain[0] && age <= domain[domain.length - 1]) {\n return s(age);\n }\n }\n return null;\n };\n\n scale.copy = () => {\n return createCompositeScale(sections, interpolateUnconformities);\n };\n\n scale.domain = () => {\n /** Return the domain of the scale */\n const vals = sections.flatMap((d) => d.scaleInfo.domain);\n if (vals[0] < vals[vals.length - 1]) {\n // age axes\n return [Math.min(...vals), Math.max(...vals)];\n }\n // Normal axes like height\n return [Math.max(...vals), Math.min(...vals)];\n };\n\n scale.invert = (pixelHeight) => {\n /** Invert the scale to get the age at a given pixel height */\n // Iterate through the sections to find the correct one\n for (const scale of scales) {\n const range = scale.range();\n if (\n pixelHeight > Math.min(...range) &&\n pixelHeight <= Math.max(...range)\n ) {\n console.log(\"Inverting scale at pixel height\", pixelHeight);\n return scale.invert(pixelHeight);\n }\n }\n return null;\n };\n\n scale.clamp = (clamp: boolean) => {\n /** Clamp all constituent scales */\n for (const s of scales) {\n s.clamp(clamp);\n }\n };\n\n return scale;\n}\n\n/** Collapse sections separated by unconformities that are smaller than a given pixel height. */\nexport function collapseUnconformitiesByPixelHeight<T extends UnitLong>(\n sections: SectionInfoWithScale<T>[],\n threshold: number,\n opts: ColumnScaleOptions,\n): SectionInfoWithScale<T>[] {\n const newSections = [];\n let currentSection: SectionInfoWithScale<T> | null = null;\n for (const nextSection of sections) {\n if (currentSection == null) {\n currentSection = nextSection;\n continue;\n }\n let heights: [number, number];\n let pxHeights: [number, number];\n if (opts.axisType !== ColumnAxisType.AGE) {\n heights = [nextSection.t_pos, currentSection.b_pos];\n } else {\n heights = [nextSection.t_age, currentSection.b_age];\n }\n\n const _diff = (vals: number[]) => {\n return Math.abs(vals[0] - vals[1]);\n };\n\n pxHeights = [\n _diff(heights.map(nextSection.scaleInfo.scale)),\n _diff(heights.map(currentSection.scaleInfo.scale)),\n ];\n\n const pxHeight = Math.min(...pxHeights);\n\n if (pxHeight < threshold) {\n let t_pos: number;\n let b_pos: number;\n if (\n opts.axisType == ColumnAxisType.AGE ||\n opts.axisType == ColumnAxisType.DEPTH\n ) {\n t_pos = Math.min(currentSection.t_pos, nextSection.t_pos);\n b_pos = Math.max(currentSection.b_pos, nextSection.b_pos);\n } else {\n t_pos = Math.max(currentSection.t_pos, nextSection.t_pos);\n b_pos = Math.min(currentSection.b_pos, nextSection.b_pos);\n }\n\n // We need to merge the sections\n const compositeSection0: SectionInfo<T> = {\n units: [...currentSection.units, ...nextSection.units],\n section_id: [\n ...ensureArray(currentSection.section_id),\n ...ensureArray(nextSection.section_id),\n ],\n t_age: Math.min(currentSection.t_age, nextSection.t_age),\n b_age: Math.max(currentSection.b_age, nextSection.b_age),\n t_pos,\n b_pos,\n };\n\n currentSection = addScaleToSection(compositeSection0, opts);\n } else {\n // We need to keep the section\n newSections.push(currentSection);\n currentSection = nextSection;\n }\n }\n if (currentSection != null) {\n newSections.push(currentSection);\n }\n\n return newSections;\n}\n"],"names":[],"version":3,"file":"column-views.073c42da.js.map"}
@@ -0,0 +1,17 @@
1
+ var $1254c5929638d7f9$export$45e8e2d7a1794c23 = /*#__PURE__*/ function(HybridScaleType) {
2
+ // An age-domain scale that puts equal vertical space between surfaces
3
+ HybridScaleType["EquidistantSurfaces"] = "equidistant-surfaces";
4
+ // A height-domain scale that is based on the average height of units between surfaces
5
+ HybridScaleType["ApproximateHeight"] = "approximate-height";
6
+ return HybridScaleType;
7
+ }({});
8
+ var $1254c5929638d7f9$export$e40aae6f0de9bb95 = /*#__PURE__*/ function(HeightMethod) {
9
+ HeightMethod["Minimum"] = "minimum";
10
+ HeightMethod["Average"] = "average";
11
+ HeightMethod["Maximum"] = "maximum";
12
+ return HeightMethod;
13
+ }({});
14
+
15
+
16
+ export {$1254c5929638d7f9$export$45e8e2d7a1794c23 as HybridScaleType, $1254c5929638d7f9$export$e40aae6f0de9bb95 as HeightMethod};
17
+ //# sourceMappingURL=column-views.079119f4.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"AA8BO,IAAA,AAAK,mEAAA;IACV,sEAAsE;;IAEtE,sFAAsF;;WAH5E;;AAOL,IAAA,AAAK,mEAAA;;;;WAAA","sources":["packages/column-views/src/prepare-units/types.ts"],"sourcesContent":["import type { UnitLong } from \"@macrostrat/api-types\";\nimport type { ColumnAxisType } from \"@macrostrat/column-components\";\nimport type { ScaleContinuousNumeric } from \"d3-scale\";\n\nexport interface ColumnHeightScaleOptions {\n /** A fixed pixel scale to use for the section (pixels per Myr) */\n pixelScale?: number;\n /** The target height of a constituent unit in pixels, for dynamic\n * scale generation */\n targetUnitHeight?: number;\n /** Min height of a section in pixels. Will override minPixelScale in some cases. */\n minSectionHeight?: number;\n /** The minimum pixel scale to use for the section (pixels per Myr). This is mostly\n * needed because small sections (<1-2 units) don't necessarily have space to comfortably\n * render two axis labels */\n minPixelScale?: number;\n // Axis scale type\n axisType?: ColumnAxisType;\n // Unconformity height in pixels\n unconformityHeight?: number;\n // Whether to collapse unconformities that are less than a height threshold\n collapseSmallUnconformities?: boolean | number;\n // A continuous scale to use instead of generating one\n // TODO: discontinuous scales are not yet supported\n scale?: ScaleContinuousNumeric<number, number>;\n // Hybrid scale type.\n // This overrides parameters such as the axis type\n hybridScale?: HybridScaleDefinition;\n}\n\nexport enum HybridScaleType {\n // An age-domain scale that puts equal vertical space between surfaces\n EquidistantSurfaces = \"equidistant-surfaces\",\n // A height-domain scale that is based on the average height of units between surfaces\n ApproximateHeight = \"approximate-height\",\n}\n\nexport enum HeightMethod {\n Minimum = \"minimum\",\n Average = \"average\",\n Maximum = \"maximum\",\n}\n\nexport interface HybridScaleOptions {\n pixelOffset?: number;\n pixelScale?: number;\n}\n\nexport type ApproxHeightScaleOptions = {\n minHeight?: number;\n defaultHeight?: number;\n heightMethod?: HeightMethod;\n};\n\nexport type HybridScaleDefinition =\n | ({\n type: HybridScaleType.ApproximateHeight;\n } & ApproxHeightScaleOptions)\n | {\n type: HybridScaleType.EquidistantSurfaces;\n };\n\nexport interface SectionScaleOptions extends ColumnHeightScaleOptions {\n axisType: ColumnAxisType;\n domain: [number, number];\n}\n\n/** Output of a section scale. For now, this assumes that the\n * mapping is linear, but it could be extended to support arbitrary\n * scale functions.\n */\nexport interface PackageScaleInfo {\n domain: [number, number];\n pixelHeight: number;\n // TODO: add a function\n scale: ScaleContinuousNumeric<number, number>;\n pixelScale?: number; // if it's a linear scale, this could be defined\n // Subsidiary scale for height mapping (for hybrid scales)\n heightScale?: ScaleContinuousNumeric<number, number>;\n}\n\nexport type PackageScaleLayoutData = PackageScaleInfo & {\n // A unique key for the section to use in React\n key: string;\n offset: number;\n // How much to\n paddingTop: number;\n};\nexport interface StratigraphicPackage {\n /** A collection of stratigraphic information organized in time, corresponding\n * to single or multiple columns. */\n t_age: number;\n b_age: number;\n}\n\nexport interface SectionInfo<\n T extends UnitLong = ExtUnit,\n> extends StratigraphicPackage {\n /** A time-bounded part of a single stratigraphic column. */\n section_id: number | number[];\n units: T[];\n b_pos?: number;\n t_pos?: number;\n}\n\nexport interface ExtUnit extends UnitLong {\n bottomOverlap: boolean;\n overlappingUnits: number[];\n column?: number;\n /* Positions (ages or heights) where the unit is clipped to its containing section.\n * This is relevant if we are filtering by age/height/depth range.\n */\n t_clip_pos?: number;\n b_clip_pos?: number;\n}\n\nexport type PackageLayoutData<T extends UnitLong = ExtUnit> = SectionInfo<T> & {\n scaleInfo: PackageScaleLayoutData;\n // A unique key for the section to use in React\n key: string;\n};\n\nexport interface CompositeScaleData {\n totalHeight: number;\n sections: PackageScaleLayoutData[];\n}\n\nexport interface ColumnScaleOptions extends ColumnHeightScaleOptions {\n axisType: ColumnAxisType;\n unconformityHeight: number;\n}\n\nexport interface CompositeColumnData<T extends UnitLong = ExtUnit> extends Omit<\n CompositeScaleData,\n \"sections\"\n> {\n sections: PackageLayoutData<T>[];\n}\n"],"names":[],"version":3,"file":"column-views.079119f4.js.map"}
@@ -1,13 +1,14 @@
1
- import {CompositeUnitsColumn as $8c8238faa5cde49c$export$a6684360fef0406e, LabelTrackerProvider as $8c8238faa5cde49c$export$e4e89ab6c86ac513, SectionLabelsColumn as $8c8238faa5cde49c$export$13984e34afdbb040} from "./column-views.775846c9.js";
2
- import $7zu8d$columnviewscdadc5c2js from "./column-views.cdadc5c2.js";
3
- import "./column-views.8d4ce558.css";
4
- import {MacrostratColumnProvider as $774a5efa27d1c77b$export$9e42f9b6e0d67c7d} from "./column-views.7ca9e1cd.js";
5
- import {useMacrostratColumnData as $d5074f164411387e$export$f8509b7cce386c7d, useMacrostratUnits as $d5074f164411387e$export$6fb40844db555b2} from "./column-views.1e055ed5.js";
6
- import {Duration as $448b24baeef3b229$export$3b11bc38611c5941} from "./column-views.cc5244c4.js";
1
+ import {CompositeUnitsColumn as $8c8238faa5cde49c$export$a6684360fef0406e, LabelTrackerProvider as $8c8238faa5cde49c$export$e4e89ab6c86ac513, SectionLabelsColumn as $8c8238faa5cde49c$export$13984e34afdbb040} from "./column-views.5a49cd68.js";
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.73b8ff16.js";
5
+ import {useMacrostratColumnData as $d5074f164411387e$export$f8509b7cce386c7d, useMacrostratUnits as $d5074f164411387e$export$6fb40844db555b2} from "./column-views.4fd4ec92.js";
6
+ import {Duration as $448b24baeef3b229$export$3b11bc38611c5941} from "./column-views.77561197.js";
7
7
  import {useMemo as $7zu8d$useMemo} from "react";
8
- import {Timescale as $7zu8d$Timescale, TimescaleOrientation as $7zu8d$TimescaleOrientation} from "@macrostrat/timescale";
9
- import {SVG as $7zu8d$SVG} from "@macrostrat/column-components";
8
+ import {useMacrostratIntervals as $7zu8d$useMacrostratIntervals, Timescale as $7zu8d$Timescale, TimescaleOrientation as $7zu8d$TimescaleOrientation} from "@macrostrat/timescale";
9
+ import {SVG as $7zu8d$SVG, ColumnAxisType as $7zu8d$ColumnAxisType} from "@macrostrat/column-components";
10
10
  import $7zu8d$macrostrathyper from "@macrostrat/hyper";
11
+ import {Value as $7zu8d$Value} from "@macrostrat/data-components";
11
12
 
12
13
 
13
14
  function $parcel$interopDefault(a) {
@@ -21,7 +22,8 @@ function $parcel$interopDefault(a) {
21
22
 
22
23
 
23
24
 
24
- const $7d0f52717c0de7e1$var$h = (0, $7zu8d$macrostrathyper).styled((0, ($parcel$interopDefault($7zu8d$columnviewscdadc5c2js))));
25
+
26
+ const $7d0f52717c0de7e1$var$h = (0, $7zu8d$macrostrathyper).styled((0, ($parcel$interopDefault($7zu8d$columnviewscc733361js))));
25
27
  function $7d0f52717c0de7e1$export$38cb0ab5af8f50d7(props) {
26
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;
27
29
  const units = (0, $d5074f164411387e$export$6fb40844db555b2)();
@@ -46,7 +48,7 @@ function $7d0f52717c0de7e1$export$38cb0ab5af8f50d7(props) {
46
48
  ]);
47
49
  }
48
50
  function $7d0f52717c0de7e1$var$SectionUnitsColumn(props) {
49
- const { width: width, showLabels: showLabels, unitComponent: unitComponent, unitComponentProps: unitComponentProps, clipUnits: clipUnits, maxInternalColumns: maxInternalColumns, unconformityLabels: unconformityLabels = true } = props;
51
+ const { width: width, showLabels: showLabels, unitComponent: unitComponent, unitComponentProps: unitComponentProps, clipUnits: clipUnits, maxInternalColumns: maxInternalColumns, axisType: axisType, unconformityLabels: unconformityLabels = true } = props;
50
52
  const { sections: sections, totalHeight: totalHeight } = (0, $d5074f164411387e$export$f8509b7cce386c7d)();
51
53
  const scaleData = sections.map((section)=>{
52
54
  return section.scaleInfo;
@@ -79,14 +81,15 @@ function $7d0f52717c0de7e1$var$SectionUnitsColumn(props) {
79
81
  })),
80
82
  $7d0f52717c0de7e1$var$h.if(unconformityLabels)($7d0f52717c0de7e1$export$e12e53eeee198b99, {
81
83
  width: width,
82
- sections: scaleData
84
+ sections: scaleData,
85
+ verbose: false
83
86
  })
84
87
  ]);
85
88
  }
86
89
  function $7d0f52717c0de7e1$var$SectionUnits(props) {
87
90
  // Section with "squishy" timescale
88
91
  const { units: units, scaleInfo: scaleInfo, unitComponent: unitComponent, showLabels: showLabels = true, width: width = 300, unitComponentProps: unitComponentProps, className: className, clipUnits: clipUnits = true, maxInternalColumns: maxInternalColumns } = props;
89
- const { domain: domain, pixelScale: pixelScale, pixelHeight: pixelHeight } = scaleInfo;
92
+ const { domain: domain, pixelScale: pixelScale, pixelHeight: pixelHeight, scale: scale } = scaleInfo;
90
93
  /** Ensure that we can arrange units into the maximum number
91
94
  * of columns defined by unitComponentProps, but that we don't
92
95
  * use more than necessary.
@@ -112,7 +115,8 @@ function $7d0f52717c0de7e1$var$SectionUnits(props) {
112
115
  }, $7d0f52717c0de7e1$var$h((0, $774a5efa27d1c77b$export$9e42f9b6e0d67c7d), {
113
116
  units: units,
114
117
  domain: domain,
115
- pixelScale: pixelScale
118
+ pixelScale: pixelScale,
119
+ scale: scale
116
120
  }, $7d0f52717c0de7e1$var$h((0, $8c8238faa5cde49c$export$a6684360fef0406e), {
117
121
  width: width,
118
122
  showLabels: showLabels,
@@ -133,6 +137,9 @@ function $7d0f52717c0de7e1$export$db2df5a73a6fbe10(props) {
133
137
  }
134
138
  function $7d0f52717c0de7e1$export$463f46772c64d403(props) {
135
139
  const { levels: levels = 3, packages: packages, unconformityLabels: unconformityLabels = false } = props;
140
+ // Use intervals from Macrostrat API
141
+ const baseURL = (0, $774a5efa27d1c77b$export$33b1392d23dde04)();
142
+ const intervals = (0, $7zu8d$useMacrostratIntervals)(baseURL);
136
143
  let _levels;
137
144
  if (typeof levels === "number") // If levels is a number, use the most common starting level
138
145
  _levels = [
@@ -143,7 +150,7 @@ function $7d0f52717c0de7e1$export$463f46772c64d403(props) {
143
150
  const nCols = _levels[1] - _levels[0] + 1;
144
151
  return $7d0f52717c0de7e1$var$h("div.timescale-column", [
145
152
  $7d0f52717c0de7e1$var$h("div.timescales", packages.map((group)=>{
146
- const { domain: domain, pixelHeight: pixelHeight, paddingTop: paddingTop, key: key } = group;
153
+ const { pixelHeight: pixelHeight, paddingTop: paddingTop, key: key, scale: scale } = group;
147
154
  return $7d0f52717c0de7e1$var$h("div.timescale-container", {
148
155
  style: {
149
156
  paddingTop: paddingTop,
@@ -157,19 +164,21 @@ function $7d0f52717c0de7e1$export$463f46772c64d403(props) {
157
164
  levels: _levels,
158
165
  absoluteAgeScale: true,
159
166
  showAgeAxis: false,
160
- ageRange: domain
167
+ scale: scale,
168
+ intervals: intervals
161
169
  })
162
170
  ]);
163
171
  })),
164
172
  $7d0f52717c0de7e1$var$h.if(unconformityLabels)($7d0f52717c0de7e1$export$e12e53eeee198b99, {
165
173
  width: "100%",
166
174
  sections: packages,
167
- className: "unconformity-labels"
175
+ className: "unconformity-labels",
176
+ axisType: (0, $7zu8d$ColumnAxisType).AGE
168
177
  })
169
178
  ]);
170
179
  }
171
180
  function $7d0f52717c0de7e1$export$e12e53eeee198b99(props) {
172
- const { width: width, sections: sections, className: className } = props;
181
+ const { width: width, sections: sections, className: className, axisType: axisType, verbose: verbose } = props;
173
182
  return $7d0f52717c0de7e1$var$h("div.unconformity-labels", {
174
183
  style: {
175
184
  width: width
@@ -181,17 +190,19 @@ function $7d0f52717c0de7e1$export$e12e53eeee198b99(props) {
181
190
  const upperAge = lastGroup?.domain[0];
182
191
  const lowerAge = scaleInfo.domain[1];
183
192
  return $7d0f52717c0de7e1$var$h($7d0f52717c0de7e1$var$Unconformity, {
193
+ axisType: axisType,
184
194
  upperAge: upperAge,
185
195
  lowerAge: lowerAge,
186
196
  style: {
187
197
  width: width,
188
198
  height: scaleInfo.paddingTop,
189
199
  top: top
190
- }
200
+ },
201
+ verbose: verbose
191
202
  });
192
203
  }));
193
204
  }
194
- function $7d0f52717c0de7e1$var$Unconformity({ upperAge: upperAge, lowerAge: lowerAge, style: style }) {
205
+ function $7d0f52717c0de7e1$var$Unconformity({ upperAge: upperAge, lowerAge: lowerAge, style: style, axisType: axisType, verbose: verbose = false }) {
195
206
  if (upperAge == null || lowerAge == null) return null;
196
207
  const ageGap = Math.abs(upperAge - lowerAge);
197
208
  let className = null;
@@ -199,16 +210,34 @@ function $7d0f52717c0de7e1$var$Unconformity({ upperAge: upperAge, lowerAge: lowe
199
210
  else if (ageGap > 100) className = "mega";
200
211
  else if (ageGap > 10) className = "large";
201
212
  else if (ageGap < 1) className = "small";
213
+ let val;
214
+ if (axisType === (0, $7zu8d$ColumnAxisType).DEPTH || axisType === (0, $7zu8d$ColumnAxisType).HEIGHT) {
215
+ const _txt = ageGap.toLocaleString("en-US", {
216
+ maximumFractionDigits: 2
217
+ });
218
+ val = $7d0f52717c0de7e1$var$h((0, $7zu8d$Value), {
219
+ value: _txt,
220
+ unit: "m"
221
+ });
222
+ } else val = $7d0f52717c0de7e1$var$h((0, $448b24baeef3b229$export$3b11bc38611c5941), {
223
+ value: ageGap
224
+ });
225
+ let prefix = null;
226
+ if (verbose) prefix = $7d0f52717c0de7e1$var$h([
227
+ " ",
228
+ $7d0f52717c0de7e1$var$h("span.prefix", " gap")
229
+ ]);
202
230
  return $7d0f52717c0de7e1$var$h("div.unconformity", {
203
231
  style: style,
204
232
  className: className
205
233
  }, [
206
- $7d0f52717c0de7e1$var$h("div.unconformity-text", $7d0f52717c0de7e1$var$h((0, $448b24baeef3b229$export$3b11bc38611c5941), {
207
- value: ageGap
208
- }))
234
+ $7d0f52717c0de7e1$var$h("div.unconformity-inner", $7d0f52717c0de7e1$var$h("div.unconformity-text", [
235
+ val,
236
+ prefix
237
+ ]))
209
238
  ]);
210
239
  }
211
240
 
212
241
 
213
242
  export {$7d0f52717c0de7e1$export$38cb0ab5af8f50d7 as SectionsColumn, $7d0f52717c0de7e1$export$e12e53eeee198b99 as UnconformityLabels, $7d0f52717c0de7e1$export$db2df5a73a6fbe10 as CompositeTimescale, $7d0f52717c0de7e1$export$463f46772c64d403 as CompositeTimescaleCore};
214
- //# sourceMappingURL=column-views.77b49a43.js.map
243
+ //# sourceMappingURL=column-views.0859feb3.js.map
@@ -0,0 +1 @@
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,uEAAK;AAyBrB,SAAS,0CAAe,KAAyB;IACtD,MAAM,sBACJ,qBAAqB,qBACrB,aAAa,sBACb,kBAAkB,cAClB,aAAa,aACb,QAAQ,kBACR,cAAc,sBACd,kBAAkB,iBAClB,YAAY,0BACZ,kBAAkB,EACnB,GAAG;IAEJ,MAAM,QAAQ,CAAA,GAAA,wCAAiB;IAE/B,kCAAkC;IAClC,MAAM,MAAM,KAAK,CAAC,EAAE,EAAE;IAEtB,OAAO,wBAAE,CAAA,GAAA,yCAAmB,GAAG;eAAE;aAAO;IAAI,GAAG;QAC7C,wBAAE,0CAAoB;YACpB,OAAO;2BACP;gCACA;wBACA;uBACA;gCACA;gCACA;QACF;QACA,wBAAE,EAAE,CAAC,iBAAiB,CAAA,GAAA,yCAAkB,GAAG;YACzC,OAAO,QAAQ;QACjB;KACD;AACH;AAEA,SAAS,yCAAmB,KAAyB;IACnD,MAAM,SACJ,KAAK,cACL,UAAU,iBACV,aAAa,sBACb,kBAAkB,aAClB,SAAS,sBACT,kBAAkB,YAClB,QAAQ,sBACR,qBAAqB,MACtB,GAAG;IAEJ,MAAM,YAAE,QAAQ,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAsB;IAExD,MAAM,YAAsC,SAAS,GAAG,CAAC,CAAC;QACxD,OAAO,QAAQ,SAAS;IAC1B;IAEA,MAAM,aAAa,QAAQ;IAE3B,OAAO,wBAAE,+BAA+B;QAAE,OAAO;mBAAE;QAAM;IAAE,GAAG;QAC5D,wBACE,CAAA,GAAA,UAAE,GACF;YACE,WAAW;YACX,QAAQ;wBACR;YACA,UAAU;QACZ,GACA,SAAS,GAAG,CAAC,CAAC;YACZ,MAAM,SAAE,KAAK,aAAE,SAAS,cAAE,UAAU,EAAE,GAAG;YAEzC,MAAM,MAAM,CAAC,QAAQ,EAAE,YAAY;YACnC,OAAO,wBACL,oCACA;uBACE;2BACA;qBACA;+BACA;oCACA;4BACA;gBACA,OAAO;2BACP;oCACA;YACF;QAEJ;QAEF,wBAAE,EAAE,CAAC,oBAAoB,2CAAoB;mBAC3C;YACA,UAAU;YACV,SAAS;QACX;KACD;AACH;AAEA,SAAS,mCAAa,KAAmB;IACvC,mCAAmC;IACnC,MAAM,SACJ,KAAK,aACL,SAAS,iBACT,aAAa,cACb,aAAa,aACb,QAAQ,yBACR,kBAAkB,aAClB,SAAS,aACT,YAAY,0BACZ,kBAAkB,EACnB,GAAG;IAEJ,MAAM,UAAE,MAAM,cAAE,UAAU,eAAE,WAAW,SAAE,KAAK,EAAE,GAAG;IAEnD;;;GAGC,GACD,MAAM,sBAAsB,CAAA,GAAA,cAAM,EAAE;QAClC,OAAO;YACL,GAAG,kBAAkB;YACrB,UAAU,KAAK,GAAG,CAChB,sBAAsB,KAAK,KAAK,CAAC,QAAQ,KACzC,oBAAoB,YAAY,UAChC,KAAK,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,IAAM,EAAE,MAAM,KAAK;QAG9C;IACF,GAAG;QAAC;QAAO;QAAoB;QAAoB;KAAM;IAEzD,MAAM,QAAQ;QACZ,oBAAoB,GAAG,YAAY,EAAE,CAAC;QACtC,mBAAmB,GAAG,MAAM,EAAE,CAAC;IACjC;IAEA,OAAO,wBACL,aACA;mBAAE;eAAW;QAAO,WAAW,CAAC,YAAY,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC;IAAC,GAClE,wBACE,CAAA,GAAA,yCAAuB,GACvB;eACE;gBACA;oBACA;eACA;IACF,GACA,wBAAE,CAAA,GAAA,yCAAmB,GAAG;eACtB;oBACA;uBACA;QACA,oBAAoB;QACpB,aAAa;IACf;AAGN;AAMO,SAAS,0CAAmB,KAA8B;IAC/D,MAAM,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAsB;IAC3C,MAAM,gBAAgB,SAAS,GAAG,CAAC,CAAC;QAClC,OAAO,QAAQ,SAAS;IAC1B;IAEA,OAAO,wBAAE,2CAAwB;QAC/B,UAAU;QACV,GAAG,KAAK;IACV;AACF;AAOO,SAAS,0CAAuB,KAAkC;IACvE,MAAM,UAAE,SAAS,aAAG,QAAQ,sBAAE,qBAAqB,OAAO,GAAG;IAE7D,oCAAoC;IACpC,MAAM,UAAU,CAAA,GAAA,wCAAmB;IACnC,MAAM,YAAY,CAAA,GAAA,6BAAqB,EAAE;IAEzC,IAAI;IACJ,IAAI,OAAO,WAAW,UACpB,4DAA4D;IAC5D,UAAU;QAAC;QAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,QAAQ,KAAK,GAAG;KAAG;SAEvD,UAAU;IAGZ,MAAM,QAAQ,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG;IAExC,OAAO,wBAAE,wBAAwB;QAC/B,wBACE,kBACA,SAAS,GAAG,CAAC,CAAC;YACZ,MAAM,eAAE,WAAW,cAAE,UAAU,OAAE,GAAG,SAAE,KAAK,EAAE,GAAG;YAChD,OAAO,wBACL,2BACA;gBAAE,OAAO;gCAAE;oBAAY,2BAA2B;gBAAM;qBAAG;YAAI,GAC/D;gBACE,wBAAE,CAAA,GAAA,gBAAQ,GAAG;oBACX,aAAa,CAAA,GAAA,2BAAmB,EAAE,QAAQ;oBAC1C,QAAQ;oBACR,QAAQ;oBACR,kBAAkB;oBAClB,aAAa;2BACb;+BACA;gBACF;aACD;QAEL;QAEF,wBAAE,EAAE,CAAC,oBAAoB,2CAAoB;YAC3C,OAAO;YACP,UAAU;YACV,WAAW;YACX,UAAU,CAAA,GAAA,qBAAa,EAAE,GAAG;QAC9B;KACD;AACH;AAEO,SAAS,0CAAmB,KAMlC;IACC,MAAM,SAAE,KAAK,YAAE,QAAQ,aAAE,SAAS,YAAE,QAAQ,WAAE,OAAO,EAAE,GAAG;IAE1D,OAAO,wBACL,2BACA;QACE,OAAO;mBACL;QACF;mBACA;IACF,GACA,SAAS,GAAG,CAAC,CAAC,WAAW;QACvB,MAAM,YAAY,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,MAAM,UAAU,MAAM,GAAG,UAAU,UAAU;QACnD,MAAM,WAAW,WAAW,MAAM,CAAC,EAAE;QACrC,MAAM,WAAW,UAAU,MAAM,CAAC,EAAE;QACpC,OAAO,wBAAE,oCAAc;sBACrB;sBACA;sBACA;YACA,OAAO;uBACL;gBACA,QAAQ,UAAU,UAAU;qBAC5B;YACF;qBACA;QACF;IACF;AAEJ;AAEA,SAAS,mCAAa,YACpB,QAAQ,YACR,QAAQ,SACR,KAAK,YACL,QAAQ,WACR,UAAU,OACX;IACC,IAAI,YAAY,QAAQ,YAAY,MAClC,OAAO;IAGT,MAAM,SAAS,KAAK,GAAG,CAAC,WAAW;IAEnC,IAAI,YAAoB;IACxB,IAAI,SAAS,MACX,YAAY;SACP,IAAI,SAAS,KAClB,YAAY;SACP,IAAI,SAAS,IAClB,YAAY;SACP,IAAI,SAAS,GAClB,YAAY;IAGd,IAAI;IACJ,IAAI,aAAa,CAAA,GAAA,qBAAa,EAAE,KAAK,IAAI,aAAa,CAAA,GAAA,qBAAa,EAAE,MAAM,EAAE;QAC3E,MAAM,OAAO,OAAO,cAAc,CAAC,SAAS;YAAE,uBAAuB;QAAE;QACvE,MAAM,wBAAE,CAAA,GAAA,YAAI,GAAG;YAAE,OAAO;YAAM,MAAM;QAAI;IAC1C,OACE,MAAM,wBAAE,CAAA,GAAA,yCAAO,GAAG;QAAE,OAAO;IAAO;IAGpC,IAAI,SAAoB;IACxB,IAAI,SACF,SAAS,wBAAE;QAAC;QAAK,wBAAE,eAAe;KAAQ;IAG5C,OAAO,wBAAE,oBAAoB;eAAE;mBAAO;IAAU,GAAG;QACjD,wBAAE,0BAA0B,wBAAE,yBAAyB;YAAC;YAAK;SAAO;KACrE;AACH","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]?.unit_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}\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 unconformityLabels?: boolean;\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 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 }\n\n let val: ReactNode;\n if (axisType === ColumnAxisType.DEPTH || axisType === ColumnAxisType.HEIGHT) {\n const _txt = ageGap.toLocaleString(\"en-US\", { maximumFractionDigits: 2 });\n val = h(Value, { value: _txt, unit: \"m\" });\n } else {\n val = h(Duration, { value: ageGap });\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.0859feb3.js.map"}