@macrostrat/column-views 2.1.2 → 2.1.4

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 (230) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/esm/{column-views.813d5bba.js → column-views.02f3732a.js} +9 -5
  3. package/dist/esm/column-views.02f3732a.js.map +1 -0
  4. package/dist/esm/{column-views.c8e2983a.js → column-views.0a159282.js} +4 -4
  5. package/dist/esm/{column-views.c8e2983a.js.map → column-views.0a159282.js.map} +1 -1
  6. package/dist/esm/{column-views.c25e8b32.js → column-views.1f7fb650.js} +3 -3
  7. package/dist/esm/{column-views.c25e8b32.js.map → column-views.1f7fb650.js.map} +1 -1
  8. package/dist/esm/{column-views.bcffe6e5.js → column-views.243da806.js} +3 -3
  9. package/dist/esm/{column-views.bcffe6e5.js.map → column-views.243da806.js.map} +1 -1
  10. package/dist/esm/{column-views.e20f6a4b.js → column-views.2ff3dd8b.js} +2 -2
  11. package/dist/esm/{column-views.e20f6a4b.js.map → column-views.2ff3dd8b.js.map} +1 -1
  12. package/dist/esm/column-views.38a305a0.js +13 -0
  13. package/dist/esm/{column-views.10eba967.js.map → column-views.38a305a0.js.map} +1 -1
  14. package/dist/esm/{column-views.5cc09c1d.js → column-views.3f246167.js} +9 -2
  15. package/dist/esm/column-views.3f246167.js.map +1 -0
  16. package/dist/esm/{column-views.892ce22f.js → column-views.42b89c52.js} +35 -10
  17. package/dist/esm/column-views.42b89c52.js.map +1 -0
  18. package/dist/esm/{column-views.57636733.css → column-views.448c0687.css} +5 -5
  19. package/dist/esm/column-views.448c0687.css.map +1 -0
  20. package/dist/esm/{column-views.afb48e8c.js → column-views.547b2730.js} +8 -8
  21. package/dist/esm/{column-views.afb48e8c.js.map → column-views.547b2730.js.map} +1 -1
  22. package/dist/esm/{column-views.1af9761e.js → column-views.64a84c43.js} +1 -2
  23. package/dist/esm/column-views.64a84c43.js.map +1 -0
  24. package/dist/esm/{column-views.7e350ae2.js → column-views.676cb1d3.js} +3 -3
  25. package/dist/esm/{column-views.7e350ae2.js.map → column-views.676cb1d3.js.map} +1 -1
  26. package/dist/esm/{column-views.28b3eaa0.js → column-views.75ea6dbe.js} +3 -3
  27. package/dist/esm/{column-views.28b3eaa0.js.map → column-views.75ea6dbe.js.map} +1 -1
  28. package/dist/esm/{column-views.b40b2bf6.js → column-views.769fa0ee.js} +2 -2
  29. package/dist/esm/{column-views.b40b2bf6.js.map → column-views.769fa0ee.js.map} +1 -1
  30. package/dist/esm/{column-views.d2037465.js → column-views.775846c9.js} +3 -3
  31. package/dist/esm/{column-views.d2037465.js.map → column-views.775846c9.js.map} +1 -1
  32. package/dist/esm/{column-views.32a83292.js → column-views.77b49a43.js} +7 -7
  33. package/dist/esm/{column-views.32a83292.js.map → column-views.77b49a43.js.map} +1 -1
  34. package/dist/esm/{column-views.89b9e542.js → column-views.78bd3f09.js} +2 -2
  35. package/dist/esm/{column-views.89b9e542.js.map → column-views.78bd3f09.js.map} +1 -1
  36. package/dist/esm/{column-views.3ba9213d.js → column-views.7ca9e1cd.js} +34 -6
  37. package/dist/esm/column-views.7ca9e1cd.js.map +1 -0
  38. package/dist/esm/column-views.8703a35b.js +163 -0
  39. package/dist/esm/column-views.8703a35b.js.map +1 -0
  40. package/dist/esm/{column-views.217078ab.css → column-views.8d4ce558.css} +13 -1
  41. package/dist/esm/column-views.8d4ce558.css.map +1 -0
  42. package/dist/esm/{column-views.85c6a716.js → column-views.8e3dec90.js} +2 -2
  43. package/dist/esm/{column-views.85c6a716.js.map → column-views.8e3dec90.js.map} +1 -1
  44. package/dist/esm/{column-views.52a6eb47.js → column-views.935ef6f7.js} +2 -2
  45. package/dist/esm/{column-views.52a6eb47.js.map → column-views.935ef6f7.js.map} +1 -1
  46. package/dist/esm/column-views.97d542eb.js +37 -0
  47. package/dist/esm/column-views.97d542eb.js.map +1 -0
  48. package/dist/esm/{column-views.6549388a.js → column-views.9e1c82fe.js} +2 -2
  49. package/dist/esm/{column-views.6549388a.js.map → column-views.9e1c82fe.js.map} +1 -1
  50. package/dist/esm/column-views.a195109e.js +60 -0
  51. package/dist/esm/column-views.a195109e.js.map +1 -0
  52. package/dist/esm/{column-views.2ca34210.js → column-views.a6301a41.js} +5 -5
  53. package/dist/esm/{column-views.2ca34210.js.map → column-views.a6301a41.js.map} +1 -1
  54. package/dist/esm/{column-views.2d8e0e0f.js → column-views.ab0380ed.js} +3 -3
  55. package/dist/esm/{column-views.2d8e0e0f.js.map → column-views.ab0380ed.js.map} +1 -1
  56. package/dist/esm/{column-views.1c92b88f.js → column-views.b3c1eb9e.js} +4 -4
  57. package/dist/esm/column-views.b3c1eb9e.js.map +1 -0
  58. package/dist/esm/{column-views.439a26db.css → column-views.b72918ce.css} +45 -20
  59. package/dist/esm/column-views.b72918ce.css.map +1 -0
  60. package/dist/esm/{column-views.0f2121e4.js → column-views.cc5244c4.js} +75 -29
  61. package/dist/esm/column-views.cc5244c4.js.map +1 -0
  62. package/dist/esm/{column-views.4637f4ce.js → column-views.cdadc5c2.js} +4 -1
  63. package/dist/esm/column-views.cdadc5c2.js.map +1 -0
  64. package/dist/esm/{column-views.fef7389f.js → column-views.d48cb0d8.js} +10 -1
  65. package/dist/esm/column-views.d48cb0d8.js.map +1 -0
  66. package/dist/esm/{column-views.b9fe5176.js → column-views.e3b9a317.js} +2 -2
  67. package/dist/esm/{column-views.b9fe5176.js.map → column-views.e3b9a317.js.map} +1 -1
  68. package/dist/esm/{column-views.f13a1d6e.js → column-views.e7ab5af0.js} +2 -2
  69. package/dist/esm/{column-views.f13a1d6e.js.map → column-views.e7ab5af0.js.map} +1 -1
  70. package/dist/esm/{column-views.a91dde4a.js → column-views.f20eb583.js} +5 -56
  71. package/dist/esm/column-views.f20eb583.js.map +1 -0
  72. package/dist/esm/{column-views.59bb0cba.js → column-views.f7523c1d.js} +2 -2
  73. package/dist/esm/{column-views.59bb0cba.js.map → column-views.f7523c1d.js.map} +1 -1
  74. package/dist/esm/column-views.fbc7401f.js +11 -0
  75. package/dist/esm/{column-views.c322a5e7.js.map → column-views.fbc7401f.js.map} +1 -1
  76. package/dist/esm/index.d.ts +77 -13
  77. package/dist/esm/index.d.ts.map +1 -1
  78. package/dist/esm/index.js +10 -10
  79. package/dist/node/column-views.085f4a51.js +2 -0
  80. package/dist/node/column-views.085f4a51.js.map +1 -0
  81. package/dist/node/{column-views.2877f398.js → column-views.0cbd4a3f.js} +2 -2
  82. package/dist/node/{column-views.2877f398.js.map → column-views.0cbd4a3f.js.map} +1 -1
  83. package/dist/node/{column-views.45defa84.js → column-views.0dfc7ef7.js} +2 -2
  84. package/dist/node/{column-views.45defa84.js.map → column-views.0dfc7ef7.js.map} +1 -1
  85. package/dist/node/column-views.2926f656.css +2 -0
  86. package/dist/node/column-views.2926f656.css.map +1 -0
  87. package/dist/node/column-views.2a6b842d.js +2 -0
  88. package/dist/node/column-views.2a6b842d.js.map +1 -0
  89. package/dist/node/{column-views.2a70b9a2.js → column-views.2ca669bc.js} +2 -2
  90. package/dist/node/{column-views.2a70b9a2.js.map → column-views.2ca669bc.js.map} +1 -1
  91. package/dist/node/column-views.2d957a97.js +2 -0
  92. package/dist/node/column-views.2d957a97.js.map +1 -0
  93. package/dist/node/column-views.307661d1.css +2 -0
  94. package/dist/node/column-views.307661d1.css.map +1 -0
  95. package/dist/node/column-views.38357d4a.js +2 -0
  96. package/dist/node/column-views.38357d4a.js.map +1 -0
  97. package/dist/node/column-views.3eeac38d.js +2 -0
  98. package/dist/node/column-views.3eeac38d.js.map +1 -0
  99. package/dist/node/{column-views.7350ac73.js → column-views.42db0bb8.js} +2 -2
  100. package/dist/node/{column-views.7350ac73.js.map → column-views.42db0bb8.js.map} +1 -1
  101. package/dist/node/{column-views.6b6b756b.js → column-views.45fab61b.js} +2 -2
  102. package/dist/node/{column-views.6b6b756b.js.map → column-views.45fab61b.js.map} +1 -1
  103. package/dist/node/{column-views.0220026c.js → column-views.492b4917.js} +2 -2
  104. package/dist/node/{column-views.0220026c.js.map → column-views.492b4917.js.map} +1 -1
  105. package/dist/node/column-views.4ca62e5d.js +2 -0
  106. package/dist/node/column-views.4ca62e5d.js.map +1 -0
  107. package/dist/node/{column-views.3bd09ad6.js → column-views.51bc87ca.js} +2 -2
  108. package/dist/node/{column-views.3bd09ad6.js.map → column-views.51bc87ca.js.map} +1 -1
  109. package/dist/node/{column-views.cf90f63d.js → column-views.58d2f993.js} +2 -2
  110. package/dist/node/{column-views.cf90f63d.js.map → column-views.58d2f993.js.map} +1 -1
  111. package/dist/node/{column-views.5b6833f0.js → column-views.65f091ea.js} +2 -2
  112. package/dist/node/{column-views.5b6833f0.js.map → column-views.65f091ea.js.map} +1 -1
  113. package/dist/node/column-views.6ae7bb69.js +2 -0
  114. package/dist/node/column-views.6ae7bb69.js.map +1 -0
  115. package/dist/node/column-views.6f7a432f.js +2 -0
  116. package/dist/node/column-views.6f7a432f.js.map +1 -0
  117. package/dist/node/{column-views.664dc6c9.js → column-views.7010a03b.js} +2 -2
  118. package/dist/node/{column-views.664dc6c9.js.map → column-views.7010a03b.js.map} +1 -1
  119. package/dist/node/column-views.758b9bc1.js +2 -0
  120. package/dist/node/column-views.758b9bc1.js.map +1 -0
  121. package/dist/node/column-views.80fcf105.js +2 -0
  122. package/dist/node/column-views.80fcf105.js.map +1 -0
  123. package/dist/node/{column-views.ce6808fe.js → column-views.858b5cf4.js} +2 -2
  124. package/dist/node/{column-views.ce6808fe.js.map → column-views.858b5cf4.js.map} +1 -1
  125. package/dist/node/{column-views.f76ba19f.js → column-views.91043465.js} +2 -2
  126. package/dist/node/{column-views.f76ba19f.js.map → column-views.91043465.js.map} +1 -1
  127. package/dist/node/{column-views.770d2c95.js → column-views.976a829b.js} +2 -2
  128. package/dist/node/{column-views.770d2c95.js.map → column-views.976a829b.js.map} +1 -1
  129. package/dist/node/column-views.99fb74c0.js +2 -0
  130. package/dist/node/column-views.99fb74c0.js.map +1 -0
  131. package/dist/node/column-views.9b7a9ae1.js +2 -0
  132. package/dist/node/column-views.9b7a9ae1.js.map +1 -0
  133. package/dist/node/column-views.9de31cdb.js +2 -0
  134. package/dist/node/column-views.9de31cdb.js.map +1 -0
  135. package/dist/node/column-views.a2274834.js +2 -0
  136. package/dist/node/column-views.a2274834.js.map +1 -0
  137. package/dist/node/{column-views.4e2bdf9b.js → column-views.a372c943.js} +2 -2
  138. package/dist/node/{column-views.4e2bdf9b.js.map → column-views.a372c943.js.map} +1 -1
  139. package/dist/node/column-views.a4e6d4ad.js +2 -0
  140. package/dist/node/column-views.a4e6d4ad.js.map +1 -0
  141. package/dist/node/{column-views.39c07f5f.js → column-views.a7256aa7.js} +2 -2
  142. package/dist/node/{column-views.39c07f5f.js.map → column-views.a7256aa7.js.map} +1 -1
  143. package/dist/node/column-views.c4b409e1.css +2 -0
  144. package/dist/node/column-views.c4b409e1.css.map +1 -0
  145. package/dist/node/{column-views.0859f5d2.js → column-views.c7f6fc0a.js} +2 -2
  146. package/dist/node/{column-views.0859f5d2.js.map → column-views.c7f6fc0a.js.map} +1 -1
  147. package/dist/node/column-views.cef1b814.js +2 -0
  148. package/dist/node/column-views.cef1b814.js.map +1 -0
  149. package/dist/node/{column-views.12a70e9d.js → column-views.d9add589.js} +2 -2
  150. package/dist/node/{column-views.12a70e9d.js.map → column-views.d9add589.js.map} +1 -1
  151. package/dist/node/{column-views.39d3a0be.js → column-views.df97f28e.js} +2 -2
  152. package/dist/node/{column-views.39d3a0be.js.map → column-views.df97f28e.js.map} +1 -1
  153. package/dist/node/{column-views.6f0c1134.js → column-views.dfb2361a.js} +2 -2
  154. package/dist/node/{column-views.6f0c1134.js.map → column-views.dfb2361a.js.map} +1 -1
  155. package/dist/node/{column-views.6b441349.js → column-views.e3ba0594.js} +2 -2
  156. package/dist/node/{column-views.6b441349.js.map → column-views.e3ba0594.js.map} +1 -1
  157. package/dist/node/column-views.eeca917f.js +2 -0
  158. package/dist/node/column-views.eeca917f.js.map +1 -0
  159. package/dist/node/index.js +1 -1
  160. package/dist/node/index.js.map +1 -1
  161. package/package.json +10 -10
  162. package/src/age-axis.ts +11 -6
  163. package/src/column.module.sass +9 -0
  164. package/src/column.ts +23 -1
  165. package/src/data-provider/base.ts +50 -3
  166. package/src/data-provider/fetch.ts +15 -0
  167. package/src/facets/fossils/index.module.sass +1 -1
  168. package/src/facets/fossils/index.ts +104 -12
  169. package/src/facets/index.ts +1 -0
  170. package/src/facets/measurements/index.ts +39 -0
  171. package/src/facets/measurements/provider.ts +80 -0
  172. package/src/unit-details/index.ts +1 -0
  173. package/src/unit-details/modal-panel.ts +61 -0
  174. package/src/unit-details/panel.module.sass +41 -17
  175. package/src/unit-details/panel.ts +114 -36
  176. package/src/units/boxes.ts +1 -64
  177. package/src/units/selection.ts +0 -1
  178. package/dist/esm/column-views.0f2121e4.js.map +0 -1
  179. package/dist/esm/column-views.10eba967.js +0 -11
  180. package/dist/esm/column-views.1af9761e.js.map +0 -1
  181. package/dist/esm/column-views.1c92b88f.js.map +0 -1
  182. package/dist/esm/column-views.217078ab.css.map +0 -1
  183. package/dist/esm/column-views.3ba9213d.js.map +0 -1
  184. package/dist/esm/column-views.439a26db.css.map +0 -1
  185. package/dist/esm/column-views.4637f4ce.js.map +0 -1
  186. package/dist/esm/column-views.57636733.css.map +0 -1
  187. package/dist/esm/column-views.5cc09c1d.js.map +0 -1
  188. package/dist/esm/column-views.813d5bba.js.map +0 -1
  189. package/dist/esm/column-views.892ce22f.js.map +0 -1
  190. package/dist/esm/column-views.a91dde4a.js.map +0 -1
  191. package/dist/esm/column-views.c322a5e7.js +0 -9
  192. package/dist/esm/column-views.fa19cea0.js +0 -108
  193. package/dist/esm/column-views.fa19cea0.js.map +0 -1
  194. package/dist/esm/column-views.fef7389f.js.map +0 -1
  195. package/dist/node/column-views.04407342.js +0 -2
  196. package/dist/node/column-views.04407342.js.map +0 -1
  197. package/dist/node/column-views.059a41c1.js +0 -2
  198. package/dist/node/column-views.059a41c1.js.map +0 -1
  199. package/dist/node/column-views.10a2bad6.js +0 -2
  200. package/dist/node/column-views.10a2bad6.js.map +0 -1
  201. package/dist/node/column-views.12414005.js +0 -2
  202. package/dist/node/column-views.12414005.js.map +0 -1
  203. package/dist/node/column-views.1de87649.js +0 -2
  204. package/dist/node/column-views.1de87649.js.map +0 -1
  205. package/dist/node/column-views.3345cd7a.js +0 -2
  206. package/dist/node/column-views.3345cd7a.js.map +0 -1
  207. package/dist/node/column-views.3cb3345e.js +0 -2
  208. package/dist/node/column-views.3cb3345e.js.map +0 -1
  209. package/dist/node/column-views.6da49480.js +0 -2
  210. package/dist/node/column-views.6da49480.js.map +0 -1
  211. package/dist/node/column-views.7f951eeb.js +0 -2
  212. package/dist/node/column-views.7f951eeb.js.map +0 -1
  213. package/dist/node/column-views.9771eb09.css +0 -2
  214. package/dist/node/column-views.9771eb09.css.map +0 -1
  215. package/dist/node/column-views.9f796135.js +0 -2
  216. package/dist/node/column-views.9f796135.js.map +0 -1
  217. package/dist/node/column-views.a0aac838.js +0 -2
  218. package/dist/node/column-views.a0aac838.js.map +0 -1
  219. package/dist/node/column-views.a8ffe072.js +0 -2
  220. package/dist/node/column-views.a8ffe072.js.map +0 -1
  221. package/dist/node/column-views.aa50c532.js +0 -2
  222. package/dist/node/column-views.aa50c532.js.map +0 -1
  223. package/dist/node/column-views.b773edb8.js +0 -2
  224. package/dist/node/column-views.b773edb8.js.map +0 -1
  225. package/dist/node/column-views.cd3c430b.js +0 -2
  226. package/dist/node/column-views.cd3c430b.js.map +0 -1
  227. package/dist/node/column-views.cd468adb.css +0 -2
  228. package/dist/node/column-views.cd468adb.css.map +0 -1
  229. package/dist/node/column-views.d9bbd6fb.css +0 -2
  230. package/dist/node/column-views.d9bbd6fb.css.map +0 -1
@@ -0,0 +1,80 @@
1
+ import { group } from "d3-array";
2
+ import { createAPIContext, useAPIResult } from "@macrostrat/ui-components";
3
+
4
+ const responseUnwrapper = (d) => d.records;
5
+
6
+ const pbdbAPIContext = createAPIContext({
7
+ baseURL: "https://training.paleobiodb.org/data1.2",
8
+ unwrapResponse: responseUnwrapper,
9
+ });
10
+
11
+ export enum FossilDataType {
12
+ Occurrences = "occs",
13
+ Collections = "colls",
14
+ }
15
+
16
+ export function usePBDBFossilData(
17
+ type: FossilDataType,
18
+ { col_id },
19
+ ): any[] | null {
20
+ const params = {
21
+ ms_column: col_id,
22
+ show: "full,mslink",
23
+ };
24
+ return useAPIResult(`/${type}/list.json`, params, {
25
+ context: pbdbAPIContext,
26
+ });
27
+ }
28
+
29
+ export interface PBDBCollection {
30
+ unit_id: number;
31
+ col_id: number;
32
+ cltn_id: number;
33
+ cltn_name: string;
34
+ pbdb_occs: number;
35
+ t_age: number;
36
+ b_age: number;
37
+ [key: string]: any; // Allow for additional properties
38
+ }
39
+
40
+ function useMacrostratFossilData({ col_id }): PBDBCollection[] | null {
41
+ return useAPIResult("/fossils", { col_id });
42
+ }
43
+
44
+ function createMacrostratCollection(d): PBDBCollection {
45
+ let unit_id = null;
46
+ let col_id = null;
47
+ // Standardize names of Macrostrat units and columns
48
+ if (d.msu !== null) {
49
+ unit_id = parseInt(d.msu.replace(/^\w+:/, ""));
50
+ }
51
+ if (d.msc !== null) {
52
+ col_id = parseInt(d.msc.replace(/^\w+:/, ""));
53
+ }
54
+
55
+ return {
56
+ ...d,
57
+ unit_id,
58
+ col_id,
59
+ cltn_id: parseInt(d.oid.replace(/^col:/, "")),
60
+ cltn_name: d.nam,
61
+ t_age: d.t_age,
62
+ b_age: d.b_age,
63
+ };
64
+ }
65
+
66
+ export function useFossilData({ col_id }) {
67
+ // Fossil links are stored in both Macrostrat and PBDB, depending on how the link was assembled. Here
68
+ // we create a unified view of data over both sources.
69
+
70
+ const r1 = usePBDBFossilData(FossilDataType.Collections, { col_id });
71
+
72
+ const r2 = useMacrostratFossilData({ col_id });
73
+
74
+ if (r1 == null || r2 == null) return null;
75
+ const r1a = r1.map(createMacrostratCollection);
76
+
77
+ const data = [...r1a, ...r2];
78
+
79
+ return group(data, (d) => d.unit_id);
80
+ }
@@ -1,2 +1,3 @@
1
1
  export * from "./panel";
2
2
  export * from "./popover";
3
+ export * from "./modal-panel";
@@ -0,0 +1,61 @@
1
+ import { Button } from "@blueprintjs/core";
2
+ import { UnitDetailsPanel } from "./panel";
3
+ import { useKeyHandler } from "@macrostrat/ui-components";
4
+ import h from "@macrostrat/hyper";
5
+
6
+ export function UnitDetailsPanelWithNavigation(props) {
7
+ const { unitData, className, selectedUnit, onSelectUnit, features, ...rest } =
8
+ props;
9
+
10
+ const ix = unitData?.findIndex(
11
+ (unit) => unit.unit_id === selectedUnit?.unit_id,
12
+ );
13
+
14
+ const keyMap = {
15
+ 38: ix - 1,
16
+ 40: ix + 1,
17
+ };
18
+
19
+ useKeyHandler(
20
+ (event) => {
21
+ const nextIx = keyMap[event.keyCode];
22
+ if (nextIx == null || nextIx < 0 || nextIx >= unitData.length) return;
23
+ onSelectUnit(unitData[nextIx].unit_id);
24
+ event.stopPropagation();
25
+ },
26
+ [unitData, ix],
27
+ );
28
+
29
+ if (selectedUnit == null) return null;
30
+
31
+ const actions = h([
32
+ h(Button, {
33
+ icon: "arrow-up",
34
+ disabled: ix === 0,
35
+ onClick() {
36
+ onSelectUnit(unitData[ix - 1]?.unit_id);
37
+ },
38
+ }),
39
+ h(Button, {
40
+ icon: "arrow-down",
41
+ disabled: ix === unitData.length - 1,
42
+ onClick() {
43
+ onSelectUnit(unitData[ix + 1]?.unit_id);
44
+ },
45
+ }),
46
+ ]);
47
+
48
+ return h(UnitDetailsPanel, {
49
+ unit: selectedUnit,
50
+ onClose(event) {
51
+ onSelectUnit(null);
52
+ },
53
+ className,
54
+ actions,
55
+ showLithologyProportions: true,
56
+ selectUnit: onSelectUnit,
57
+ columnUnits: unitData,
58
+ features,
59
+ ...rest,
60
+ });
61
+ }
@@ -1,39 +1,43 @@
1
1
  .legend-panel-header
2
2
  display: flex
3
3
  justify-content: space-between
4
- align-items: baseline
5
- gap: 1em
4
+ align-items: center
5
+ gap: 0.5em
6
6
  border-bottom: 1px solid var(--panel-rule-color)
7
7
  position: sticky
8
8
  top: 0
9
9
  background-color: var(--panel-secondary-background-color)
10
10
  padding: 0.5em 1em
11
11
  z-index: 50
12
+ min-height: 45px
13
+ overflow: hidden
12
14
  .title-container
13
- display: flex
14
- flex-direction: row
15
15
  gap: 0.5em
16
16
  align-items: center
17
- margin: -0.5em 0
17
+ margin: 0
18
+ flex-grow: 1
19
+ z-index: 5
18
20
  &:hover
19
- .hidden-actions
20
- display: flex
21
- opacity: 0.5
21
+ .hidden-actions-container
22
+ visibility: visible
22
23
  h1, h2, h3
23
- margin: 0.5em 0
24
- .hidden-actions
25
- display: none
24
+ display: inline
25
+ margin: 0
26
+ .hidden-actions-container
27
+ visibility: hidden
26
28
  button
27
29
  transform: translateY(0px)
28
30
 
29
31
  code
30
32
  font-size: 0.9em
31
33
  color: var(--secondary-color)
34
+ .unit-id:before
35
+ content: '#'
36
+ // Tertiary color is too light...
37
+ color: var(--secondary-color)
38
+
32
39
  .spacer
33
40
  flex: 1
34
- button
35
- line-height: 1.5
36
- transform: translateY(2px)
37
41
 
38
42
  .unit-details-panel
39
43
  display: flex
@@ -46,11 +50,11 @@
46
50
  position: relative
47
51
  margin: 1em
48
52
 
49
- .proportion, .sep, .no-units
53
+ .proportion, .sep, .no-units, .strat-name-text
50
54
  color: var(--secondary-color)
51
55
  font-style: italic
52
56
 
53
- .strat-name-id, .unit-id
57
+ .strat-name-id, .identifier
54
58
  font-family: var(--monospace-font)
55
59
  color: var(--secondary-color)
56
60
 
@@ -81,4 +85,24 @@
81
85
  margin: 0 0.3em
82
86
 
83
87
  .clickable
84
- cursor: pointer
88
+ cursor: pointer
89
+
90
+ .hidden-actions-container
91
+ min-width: 0
92
+ display: inline-block
93
+ //margin-right: -5em
94
+ width: 0
95
+ position: relative
96
+
97
+ .hidden-actions
98
+ padding-left: 1em
99
+ width: fit-content
100
+ display: flex
101
+ align-items: center
102
+ gap: 0.25em
103
+ background-color: var(--panel-secondary-background-color)
104
+ z-index: 50
105
+ position: relative
106
+ bottom: 0
107
+ button
108
+ color: var(--secondary-color) !important
@@ -21,6 +21,7 @@ import {
21
21
  UnitLongFull,
22
22
  Lithology,
23
23
  Interval,
24
+ StratUnit,
24
25
  } from "@macrostrat/api-types";
25
26
  import { defaultNameFunction } from "../units/names";
26
27
  import classNames from "classnames";
@@ -113,10 +114,15 @@ export function LegendPanelHeader({
113
114
  return h("header.legend-panel-header", [
114
115
  h("div.title-container", [
115
116
  h.if(title != null)("h3", title),
116
- h.if(hiddenActions != null)("div.hidden-actions", hiddenActions),
117
+ h.if(hiddenActions != null || id != null)(
118
+ "span.hidden-actions-container",
119
+ h("div.hidden-actions", [
120
+ h.if(id != null)("code.unit-id", id),
121
+ h.if(hiddenActions != null)([hiddenActions]),
122
+ ]),
123
+ ),
117
124
  ]),
118
125
  h("div.spacer"),
119
- h.if(id != null)("code", id),
120
126
  h.if(actions != null)(ButtonGroup, { minimal: true }, actions),
121
127
  h.if(onClose != null)(Button, {
122
128
  icon: "cross",
@@ -159,7 +165,12 @@ function UnitDetailsContent({
159
165
  features?: Set<UnitDetailsFeature>;
160
166
  onClickItem?: (
161
167
  event: MouseEvent,
162
- item: Lithology | Environment | UnitLong | Interval,
168
+ item:
169
+ | Lithology
170
+ | Environment
171
+ | UnitLong
172
+ | Interval
173
+ | { strat_name_id: number },
163
174
  ) => void;
164
175
  getItemHref?: (item: Lithology | Environment | UnitLong) => string | null;
165
176
  }) {
@@ -222,7 +233,7 @@ function UnitDetailsContent({
222
233
 
223
234
  /** We are trying to move away from passing the "color" parameter in the API */
224
235
  let colorSwatch: ReactNode = null;
225
- if ("color" in unit) {
236
+ if ("color" in unit && features.has(UnitDetailsFeature.Color)) {
226
237
  const unit1 = unit as UnitLongFull;
227
238
  colorSwatch = h("div.color-swatch", {
228
239
  style: { backgroundColor: unit1.color },
@@ -250,20 +261,9 @@ function UnitDetailsContent({
250
261
  onClickItem,
251
262
  getItemHref,
252
263
  }),
253
- h.if(unit.strat_name_id != null)(
254
- DataField,
255
- {
256
- label: "Stratigraphic name",
257
- },
258
- h(
259
- "span",
260
- {
261
- className: "strat-name-id" + (onClickItem ? " clickable" : ""),
262
- onClick: (e) => onClickItem(e, { strat_name_id: unit.strat_name_id }),
263
- },
264
- unit.strat_name_id,
265
- ),
266
- ),
264
+ h.if(unit.strat_name_id != null)(StratNameField, {
265
+ strat_name_id: unit.strat_name_id,
266
+ }),
267
267
  outcropField,
268
268
  h.if(features.has(UnitDetailsFeature.AdjacentUnits))([
269
269
  h(
@@ -278,12 +278,61 @@ function UnitDetailsContent({
278
278
  ),
279
279
  ]),
280
280
  colorSwatch,
281
+ h(ReferencesField, { refs: unit.refs, inline: true }),
282
+ ]);
283
+ }
284
+
285
+ export function ReferencesField({ refs, className = null, ...rest }) {
286
+ if (refs == null || refs.length === 0) {
287
+ return null;
288
+ }
289
+ return h(
290
+ DataField,
291
+ {
292
+ label: "Source",
293
+ className: classNames("refs-field", className),
294
+ ...rest,
295
+ },
296
+ h(BibInfo, { refs }),
297
+ );
298
+ }
299
+
300
+ function StratNameField({
301
+ strat_name_id,
302
+ onClickItem,
303
+ }: {
304
+ strat_name_id: number;
305
+ onClickItem?: (event: MouseEvent, item: { strat_name_id: number }) => void;
306
+ }) {
307
+ const stratNames = useMemo(() => [strat_name_id], [strat_name_id]);
308
+ const data = useMacrostratData("strat_names", stratNames);
309
+ const stratNameData = data?.[0];
310
+ let inner: any = h(Identifier, { id: strat_name_id });
311
+ const name = stratNameData?.strat_name_long;
312
+ if (name != null) {
313
+ inner = h("span.strat-name", name);
314
+ }
315
+
316
+ const clickable = onClickItem != null;
317
+
318
+ const className = classNames({
319
+ clickable,
320
+ });
321
+
322
+ return h(
323
+ DataField,
324
+ {
325
+ label: "Stratigraphic name",
326
+ },
281
327
  h(
282
- DataField,
283
- { label: "Source", inline: true },
284
- h(BibInfo, { refs: unit.refs }),
328
+ clickable ? "a" : "span",
329
+ {
330
+ className,
331
+ onClick: (e) => onClickItem(e, { strat_name_id }),
332
+ },
333
+ inner,
285
334
  ),
286
- ]);
335
+ );
287
336
  }
288
337
 
289
338
  function getThickness(unit): [string, string] {
@@ -331,12 +380,18 @@ function BibInfo({ refs }) {
331
380
  }
332
381
 
333
382
  if (refData.length == 1) {
334
- return h(Citation, { data: refData[0], tag: "span" });
383
+ return h(Citation, {
384
+ data: refData[0],
385
+ tag: "span",
386
+ key: refData[0].ref_id,
387
+ });
335
388
  }
336
389
 
337
390
  return h(
338
391
  "ul.refs",
339
- refData.map((data, i) => h(Citation, { data, tag: "li", key: i })),
392
+ refData.map((data, i) =>
393
+ h(Citation, { data, tag: "li", key: data.ref_id }),
394
+ ),
340
395
  );
341
396
  }
342
397
 
@@ -474,6 +529,33 @@ function enhanceLithologies(
474
529
  });
475
530
  }
476
531
 
532
+ export function Identifier({
533
+ id,
534
+ onClick,
535
+ className,
536
+ }: {
537
+ id: number | string;
538
+ onClick?: (id: number | string) => void;
539
+ className?: string;
540
+ }) {
541
+ /** An item that displays a numeric identifier, optionally clickable */
542
+ const tag = onClick != null ? "a" : "span";
543
+ return h(
544
+ tag,
545
+ {
546
+ onClick() {
547
+ onClick?.(id);
548
+ },
549
+ className: classNames(
550
+ "identifier",
551
+ { clickable: onClick != null },
552
+ className,
553
+ ),
554
+ },
555
+ id,
556
+ );
557
+ }
558
+
477
559
  function UnitIDList({ units, selectUnit }) {
478
560
  const u1 = units.filter((d) => d != 0);
479
561
 
@@ -489,19 +571,15 @@ function UnitIDList({ units, selectUnit }) {
489
571
  return h(
490
572
  ItemList,
491
573
  { className: "unit-id-list" },
492
- u1.map((unit) => {
493
- return h(
494
- tag,
495
-
496
- {
497
- className: "unit-id",
498
- onClick() {
499
- selectUnit?.(unit.id);
500
- },
501
- key: unit.id,
574
+ u1.map((unitID) => {
575
+ return h(Identifier, {
576
+ className: "unit-id",
577
+ onClick() {
578
+ selectUnit?.(unitID);
502
579
  },
503
- unit,
504
- );
580
+ key: unitID,
581
+ id: unitID,
582
+ });
505
583
  }),
506
584
  );
507
585
  }
@@ -6,6 +6,7 @@ import {
6
6
  PatternDefsProvider,
7
7
  useColumn,
8
8
  useGeologicPattern,
9
+ zigZagBoxPath,
9
10
  } from "@macrostrat/column-components";
10
11
  import { SizeAwareLabel, Clickable } from "@macrostrat/ui-components";
11
12
  import hyper from "@macrostrat/hyper";
@@ -18,7 +19,6 @@ import classNames from "classnames";
18
19
  import { getUnitHeightRange } from "../prepare-units/utils";
19
20
  import { useLithologies } from "../data-provider";
20
21
  import { getMixedUnitColor } from "./colors";
21
- import { path } from "d3-path";
22
22
  import type { RectBounds } from "./types";
23
23
 
24
24
  const h = hyper.styled(styles);
@@ -236,69 +236,6 @@ const UnitRect = forwardRef((props: UnitRectProps, ref) => {
236
236
  }
237
237
  });
238
238
 
239
- function zigZagBoxPath(x, y, width, height, top: boolean, bottom: boolean) {
240
- const zigZagWidth = 10;
241
- const zigZagHeight = 4;
242
-
243
- const d = path();
244
-
245
- const nZigZags = Math.floor(width / zigZagWidth - 0.5);
246
- const _zigZagWidth = width / (nZigZags + 0.5);
247
-
248
- d.moveTo(x, y);
249
- let dy = zigZagHeight / 2;
250
- // Each zig-zag consists of a short outward motion
251
- let dx = _zigZagWidth / 4;
252
-
253
- let cx = x;
254
- let cy = y;
255
-
256
- const doZigZag = (last = false) => {
257
- cx += dx;
258
- cy -= dy;
259
- d.lineTo(cx, cy);
260
- let scalar = last ? 1 : 2;
261
- cx += dx * scalar;
262
- cy += dy * scalar;
263
- d.lineTo(cx, cy);
264
- cx += dx;
265
- cy -= dy;
266
- };
267
-
268
- if (top) {
269
- // Move to the offset
270
- //d.lineTo(cx, y);
271
- // Draw the zig-zags
272
- for (let i = 0; i < nZigZags; i++) {
273
- doZigZag();
274
- }
275
- // Draw the last half zig-zag
276
- doZigZag(true);
277
- }
278
- // Draw the right edge
279
- d.lineTo(x + width, y);
280
- d.lineTo(x + width, y + height);
281
-
282
- if (bottom) {
283
- dx = -dx;
284
- dy = -dy;
285
- cx = x + width;
286
- cy = y + height;
287
-
288
- for (let i = 0; i < nZigZags; i++) {
289
- doZigZag();
290
- }
291
- doZigZag(true);
292
- }
293
- // Draw the last line to the left edge
294
- d.lineTo(x, y + height);
295
- // Draw the left edge
296
- d.closePath();
297
-
298
- // Now render the path;
299
- return d.toString();
300
- }
301
-
302
239
  function LabeledUnit(props: LabeledUnitProps) {
303
240
  const {
304
241
  division,
@@ -93,7 +93,6 @@ export function UnitSelectionProvider<T extends BaseUnit>(props: {
93
93
  }
94
94
  },
95
95
  onUnitSelected: (unit: T, target: HTMLElement, event: PointerEvent) => {
96
- console.log("onUnitSelected", unit, target, event);
97
96
  const el = props.columnRef?.current;
98
97
  let overlayPosition = null;
99
98
 
@@ -1 +0,0 @@
1
- {"mappings":"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","sources":["packages/column-views/src/unit-details/panel.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport styles from \"./panel.module.sass\";\nimport { JSONView } from \"@macrostrat/ui-components\";\nimport { Button, ButtonGroup } from \"@blueprintjs/core\";\nimport { ReactNode, useMemo, useState } from \"react\";\nimport {\n DataField,\n EnvironmentsList,\n IntervalShort,\n IntervalTag,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n Parenthetical,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useMacrostratData, useMacrostratDefs } from \"../data-provider\";\nimport {\n Environment,\n UnitLong,\n UnitLongFull,\n Lithology,\n Interval,\n} from \"@macrostrat/api-types\";\nimport { defaultNameFunction } from \"../units/names\";\nimport classNames from \"classnames\";\n\nconst h = hyper.styled(styles);\n\nexport function UnitDetailsPanel({\n unit,\n onClose,\n className,\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.JSONToggle,\n UnitDetailsFeature.DepthRange,\n ]),\n lithologyFeatures,\n actions,\n selectUnit,\n columnUnits,\n onClickItem,\n}: {\n unit: any;\n onClose?: any;\n showLithologyProportions?: boolean;\n className?: string;\n actions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n columnUnits?: UnitLong[];\n selectUnit?: (unitID: number) => void;\n onClickItem?: (item: any) => void;\n}) {\n const [showJSON, setShowJSON] = useState(false);\n\n let content = null;\n if (showJSON) {\n content = h(JSONView, { data: unit, showRoot: false });\n } else {\n content = h(UnitDetailsContent, {\n unit,\n features,\n lithologyFeatures,\n onClickItem,\n });\n }\n\n let title = defaultNameFunction(unit);\n\n let hiddenActions = null;\n if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h(Button, {\n icon: \"code\",\n small: true,\n minimal: true,\n key: \"json-view-toggle\",\n className: classNames(\"json-view-toggle\", { enabled: setShowJSON }),\n onClick(evt) {\n setShowJSON(!showJSON);\n evt.stopPropagation();\n },\n });\n }\n\n return h(\"div.unit-details-panel\", { className }, [\n h(LegendPanelHeader, {\n onClose,\n title,\n id: unit.unit_id,\n actions,\n hiddenActions,\n }),\n h(\"div.unit-details-content-holder\", content),\n ]);\n}\n\nexport function LegendPanelHeader({\n title,\n id,\n onClose,\n actions = null,\n hiddenActions,\n}: {\n title?: string | null;\n id?: number | null;\n onClose?: () => void;\n actions?: ReactNode | null;\n hiddenActions?: ReactNode | null;\n}) {\n return h(\"header.legend-panel-header\", [\n h(\"div.title-container\", [\n h.if(title != null)(\"h3\", title),\n h.if(hiddenActions != null)(\"div.hidden-actions\", hiddenActions),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code\", id),\n h.if(actions != null)(ButtonGroup, { minimal: true }, actions),\n h.if(onClose != null)(Button, {\n icon: \"cross\",\n minimal: true,\n small: true,\n onClick() {\n onClose();\n },\n }),\n ]);\n}\n\nexport enum UnitDetailsFeature {\n AdjacentUnits = \"adjacent-units\",\n Color = \"color\",\n OutcropType = \"outcrop-type\",\n JSONToggle = \"json-toggle\",\n DepthRange = \"depth-range\",\n}\n\nfunction UnitDetailsContent({\n unit,\n selectUnit,\n columnUnits,\n lithologyFeatures = new Set([\n LithologyTagFeature.Proportion,\n LithologyTagFeature.Attributes,\n ]),\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n ]),\n onClickItem,\n getItemHref,\n}: {\n unit: UnitLong;\n selectUnit?: (unitID: number) => void;\n columnUnits?: UnitLong[];\n lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: (\n event: MouseEvent,\n item: Lithology | Environment | UnitLong | Interval,\n ) => void;\n getItemHref?: (item: Lithology | Environment | UnitLong) => string | null;\n}) {\n const lithMap = useMacrostratDefs(\"lithologies\");\n const envMap = useMacrostratDefs(\"environments\");\n\n const environments = enhanceEnvironments(unit.environ, envMap);\n const lithologies = enhanceLithologies(unit.lith ?? [], lithMap);\n\n // Create a lookup table of units if provided\n const columnUnitsMap = useMemo(() => {\n const map = new Map<number, UnitLong>();\n for (const colUnit of columnUnits ?? []) {\n map.set(colUnit.unit_id, colUnit);\n }\n return map;\n }, [columnUnits]);\n\n let outcropField = null;\n if (features.has(UnitDetailsFeature.OutcropType)) {\n // Determine outcrop type\n let outcrop = unit.outcrop;\n if (outcrop == \"both\") {\n outcrop = \"surface and subsurface\";\n }\n outcropField = h(DataField, {\n label: \"Outcrop\",\n value: outcrop,\n });\n }\n\n let thicknessOrHeightRange = null;\n const [thickness, thicknessUnit] = getThickness(unit);\n // Proxy for actual heights in t_pos and b_pos\n if (\n features.has(UnitDetailsFeature.DepthRange) &&\n unit.t_pos != null &&\n unit.b_pos != null &&\n unit.min_thick == unit.max_thick && // We have an actual fixed height\n unit.min_thick != 0 // Not a zero thickness\n ) {\n const label = unit.t_pos < unit.b_pos ? \"Depth\" : \"Height\";\n const u1 = \"m\";\n\n thicknessOrHeightRange = h(DataField, {\n unit: u1,\n label,\n value: formatRange(unit.b_pos, unit.t_pos),\n children: h(\n Parenthetical,\n h(Value, { value: thickness, unit: thicknessUnit }),\n ),\n });\n }\n thicknessOrHeightRange ??= h(DataField, {\n label: \"Thickness\",\n value: thickness,\n unit: thicknessUnit,\n });\n\n /** We are trying to move away from passing the \"color\" parameter in the API */\n let colorSwatch: ReactNode = null;\n if (\"color\" in unit) {\n const unit1 = unit as UnitLongFull;\n colorSwatch = h(\"div.color-swatch\", {\n style: { backgroundColor: unit1.color },\n });\n }\n\n return h(\"div.unit-details-content\", [\n thicknessOrHeightRange,\n h(LithologyList, {\n label: \"Lithology\",\n lithologies,\n features: lithologyFeatures,\n getItemHref,\n onClickItem,\n }),\n h(AgeField, { unit }, [\n h(Parenthetical, h(Duration, { value: unit.b_age - unit.t_age })),\n h(IntervalProportions, {\n unit,\n onClickItem,\n }),\n ]),\n h(EnvironmentsList, {\n environments,\n onClickItem,\n getItemHref,\n }),\n h.if(unit.strat_name_id != null)(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n \"span\",\n {\n className: \"strat-name-id\" + (onClickItem ? \" clickable\" : \"\"),\n onClick: (e) => onClickItem(e, { strat_name_id: unit.strat_name_id }),\n },\n unit.strat_name_id,\n ),\n ),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, { units: unit.units_above, selectUnit }),\n ),\n h(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, { units: unit.units_below, selectUnit }),\n ),\n ]),\n colorSwatch,\n h(\n DataField,\n { label: \"Source\", inline: true },\n h(BibInfo, { refs: unit.refs }),\n ),\n ]);\n}\n\nfunction getThickness(unit): [string, string] {\n let minThickness = unit.min_thick ?? 0;\n let maxThickness = unit.max_thick ?? unit.min_thick ?? 0;\n let _unit = \"m\";\n\n if (minThickness == 0 && maxThickness == 0) {\n return [\"Unknown\", null];\n }\n\n if (minThickness < 0.8 && maxThickness < 1.2) {\n // Convert to cm\n minThickness = minThickness * 100;\n maxThickness = maxThickness * 100;\n _unit = \"cm\";\n } else if (minThickness > 800 && maxThickness > 1200) {\n // Convert to km\n minThickness = minThickness / 1000;\n maxThickness = maxThickness / 1000;\n _unit = \"km\";\n }\n\n if (minThickness == maxThickness) {\n return [formatSignificance(minThickness), _unit];\n }\n\n return [formatRange(minThickness, maxThickness), _unit];\n}\n\nfunction ThicknessField({ unit, label = \"Thickness\" }) {\n const [value, thicknessUnit] = getThickness(unit);\n return h(DataField, {\n label,\n value,\n unit: thicknessUnit,\n });\n}\n\nfunction BibInfo({ refs }) {\n const refData = useMacrostratData(\"refs\", refs);\n\n if (refData == null || refData.length === 0) {\n return null;\n }\n\n if (refData.length == 1) {\n return h(Citation, { data: refData[0], tag: \"span\" });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) => h(Citation, { data, tag: \"li\", key: i })),\n );\n}\n\nfunction Citation({ data, tag = \"p\" }) {\n return h(tag, { className: \"citation\" }, [\n h(\"span.authors\", data.author),\n \", \",\n h(\"span.year\", data.pub_year),\n \", \",\n h(\"span.title\", data.ref),\n ]);\n}\n\nfunction AgeField({ unit, children }) {\n const [b_age, t_age, _unit] = getAgeRange(unit);\n\n return h(\n DataField,\n {\n label: \"Age\",\n value: formatRange(b_age, t_age),\n unit: _unit,\n },\n children,\n );\n}\n\nfunction getAgeRange(_unit) {\n let b_age = _unit.b_age;\n let t_age = _unit.t_age;\n let unit = \"Ma\";\n\n if (b_age < 0.8 && t_age < 1.2) {\n b_age *= 1000;\n t_age *= 1000;\n unit = \"ka\";\n } else if (b_age > 800 && t_age > 1200) {\n b_age /= 1000;\n t_age /= 1000;\n unit = \"Ga\";\n }\n\n return [b_age, t_age, unit];\n}\n\nfunction getAge(value) {\n /** Get the age value in Ma, ka, or Ga as appropriate */\n let unit = \"Ma\";\n if (value < 0.8) {\n unit = \"ka\";\n value *= 1000;\n if (value < 5) {\n unit = \"yr\";\n value *= 1000;\n }\n } else if (value > 1000) {\n unit = \"Ga\";\n value /= 1000;\n }\n\n return [value, unit];\n}\n\nexport function AgeLabel({\n age,\n maximumFractionDigits = 2,\n minimumFractionDigits = 0,\n className,\n}: {\n age: number;\n className?: string;\n maximumFractionDigits?: number;\n minimumFractionDigits?: number;\n}) {\n /** Component to display a single age value with unit conversion from\n * Ma to ka or Ga as appropriate.\n */\n const [value, unit] = getAge(age);\n\n const _value = value.toLocaleString(\"en-US\", {\n maximumFractionDigits,\n minimumFractionDigits,\n });\n\n return h(Value, { value: _value, unit, className });\n}\n\nexport function Duration({\n value,\n maximumFractionDigits = 2,\n minimumFractionDigits = 0,\n}) {\n let unit = \"Myr\";\n if (value < 0.8) {\n unit = \"kyr\";\n value *= 1000;\n if (value < 5) {\n unit = \"yr\";\n value *= 1000;\n }\n } else if (value > 1000) {\n unit = \"Gyr\";\n value /= 1000;\n }\n\n let _value = value.toLocaleString(\"en-US\", {\n maximumFractionDigits,\n minimumFractionDigits,\n });\n\n return h(Value, { value: _value, unit });\n}\n\nfunction enhanceEnvironments(\n environments: Partial<Environment>[],\n envMap: Map<number, Environment>,\n) {\n return environments.map((env) => {\n return {\n ...(envMap?.get(env.environ_id) ?? {}),\n ...env,\n };\n });\n}\n\nfunction enhanceLithologies(\n lithologies: Partial<UnitLong[\"lith\"]>,\n lithMap: Map<number, any>,\n) {\n return lithologies.map((lith) => {\n return {\n ...(lithMap?.get(lith.lith_id) ?? {}), // get lithology details\n ...lith, // override with the unit's specific lithology data\n };\n });\n}\n\nfunction UnitIDList({ units, selectUnit }) {\n const u1 = units.filter((d) => d != 0);\n\n if (u1.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n let tag = \"span\";\n if (selectUnit != null) {\n tag = \"a\";\n }\n\n return h(\n ItemList,\n { className: \"unit-id-list\" },\n u1.map((unit) => {\n return h(\n tag,\n\n {\n className: \"unit-id\",\n onClick() {\n selectUnit?.(unit.id);\n },\n key: unit.id,\n },\n unit,\n );\n }),\n );\n}\n\nfunction IntervalProportions({ unit, onClickItem }) {\n const i0 = unit.b_int_id;\n const i1 = unit.t_int_id;\n let b_prop = unit.b_prop ?? 0;\n let t_prop = unit.t_prop ?? 1;\n\n const intervalMap = useMacrostratDefs(\"intervals\");\n const int0 = intervalMap?.get(i0) ?? {};\n\n const interval0: IntervalShort = {\n ...int0,\n id: i0,\n name: unit.b_int_name,\n };\n\n let p0: ReactNode = null;\n const int1 = intervalMap?.get(i1) ?? {};\n const p1: ReactNode = h(Proportion, { value: t_prop });\n\n if (i0 !== i1 || b_prop !== 0 || t_prop !== 1) {\n // We have a single interval with undefined proportions\n p0 = h(Proportion, { value: b_prop });\n }\n\n if (i0 === i1 && (b_prop !== 0 || t_prop !== 1)) {\n p0 = h(\"span.joint-proportion\", [p0, h(\"span.sep\", \"to\"), p1]);\n }\n\n const clickable = onClickItem != null;\n\n const handleClick = (event: MouseEvent) => {\n if (onClickItem) {\n onClickItem(event, interval0);\n }\n };\n\n return h(\"div.interval-proportions\", [\n h(IntervalTag, {\n className: clickable ? \"clickable\" : \"\",\n onClick: clickable ? handleClick : undefined,\n interval: interval0,\n prefix: p0,\n }),\n h.if(i0 != i1)(\"span.discourage-break\", [\n h(\"span.sep\", \"to\"),\n h(IntervalTag, {\n className: clickable ? \"clickable\" : \"\",\n onClick: clickable ? handleClick : undefined,\n interval: {\n ...int1,\n id: i1,\n name: unit.t_int_name,\n },\n prefix: p1,\n }),\n ]),\n ]);\n}\n\nconst formatProportion = (d) => {\n if (d == null) return null;\n return d.toFixed(1);\n};\n\nfunction Proportion({ value }) {\n let content = null;\n if (value == 0) {\n content = \"base\";\n } else if (value == 1) {\n content = \"top\";\n } else {\n content = formatProportion(value * 100) + \"%\";\n }\n\n return h(\"span.proportion\", content);\n}\n\nfunction formatRange(min, max, precision = null) {\n if (min == null || max == null) return null;\n if (min === max) {\n return min.toFixed(precision);\n }\n\n return `${formatSignificance(min, precision)}–${formatSignificance(\n max,\n precision,\n )}`;\n}\n\nfunction formatSignificance(value, precision = null) {\n // Format to preserve a reasonable number of significant figures\n // this could be done with an easier algorithm, probably:\n\n if (precision == null) {\n return value.toLocaleString();\n }\n if (precision >= 0) {\n return value.toFixed(precision);\n }\n if (precision < 0) {\n return (\n (value / Math.pow(10, -precision)).toFixed(0) + \"0\".repeat(-precision)\n );\n }\n}\n"],"names":[],"version":3,"file":"column-views.0f2121e4.js.map"}
@@ -1,11 +0,0 @@
1
- import {PBDBFossilsColumn as $b9286605a04210d4$export$554267114407ef68} from "./column-views.fa19cea0.js";
2
- import {DetritalGroup as $715dd5fedd79146a$export$1b3047373cd1c8c7, DetritalColumn as $715dd5fedd79146a$export$f176396e104db8d5} from "./column-views.e20f6a4b.js";
3
- import {IsotopesDataset as $d71d096cfe00860f$export$c69bd0285aa5d775, IsotopesColumn as $d71d096cfe00860f$export$5d8aa8022c284748, MeasurementDataContext as $5dbb619f2c7bef60$export$c644ef985ce7a4c4, MeasurementDataProvider as $5dbb619f2c7bef60$export$5f01d5b342a89841, useMeasurementData as $5dbb619f2c7bef60$export$8a0335fd9ff72150} from "./column-views.86619334.js";
4
-
5
-
6
-
7
-
8
-
9
-
10
- export {$b9286605a04210d4$export$554267114407ef68 as PBDBFossilsColumn, $715dd5fedd79146a$export$1b3047373cd1c8c7 as DetritalGroup, $715dd5fedd79146a$export$f176396e104db8d5 as DetritalColumn, $d71d096cfe00860f$export$c69bd0285aa5d775 as IsotopesDataset, $d71d096cfe00860f$export$5d8aa8022c284748 as IsotopesColumn, $5dbb619f2c7bef60$export$c644ef985ce7a4c4 as MeasurementDataContext, $5dbb619f2c7bef60$export$5f01d5b342a89841 as MeasurementDataProvider, $5dbb619f2c7bef60$export$8a0335fd9ff72150 as useMeasurementData};
11
- //# sourceMappingURL=column-views.10eba967.js.map
@@ -1 +0,0 @@
1
- {"mappings":"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","sources":["packages/column-views/src/units/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 MouseEvent,\n} from \"react\";\nimport { createStore, StoreApi, useStore } from \"zustand\";\nimport type { RectBounds, IUnit } from \"./types\";\nimport {\n getUnitHeightRange,\n useMacrostratColumnData,\n} from \"@macrostrat/column-views\";\n\ntype UnitSelectDispatch = (\n unit: 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: (unit: T, target: HTMLElement, event: PointerEvent) => {\n console.log(\"onUnitSelected\", unit, target, event);\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.1af9761e.js.map"}
@@ -1 +0,0 @@
1
- {"mappings":";;;;;;;;AAAA,IAAA;AACA,IAAA;AADA,4CAAuC,CAAC,yBAAyB,CAAC;AAClE,4CAA6B,CAAC,eAAe,CAAC","sources":["packages/column-views/src/facets/fossils/index.module.sass"],"sourcesContent":[".fossil-collections\n padding-left: 0.2em\n font-size: 0.9em\n list-style: none\n border-left: 1px solid var(--column-stroke-color)\n margin: 1px 0\n li\n display: inline\n &:not(:last-child):after\n content: \", \"\n color: var(--secondary-color)\n li.too-many\n color: var(--secondary-color)\n font-style: italic\n"],"names":[],"version":3,"file":"column-views.1c92b88f.js.map"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA;;;;;;AAWE;EACE;;;;;;;;EAOI;;;;EAEA;;;;;AAIN;;;;;;;;AAOE;;;;AAIF;;;;AAIE;;;;;;;AAOA;;;;;AAKA;;;;;AAIF;;;;;;AAKA;;;;AAGF;;;;;;;;;;;;;;;;;;;;AAgBE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BF;;;;;;;AAOE;;;;;;;;;;;;;;;AAWE;;;;;AAMF","sources":["packages/column-views/src/column.module.sass"],"sourcesContent":[".column-container, body:global(.light-mode) .column-container\n --column-background-color: var(--background-color, #fff)\n --column-stroke-color: var(--text-emphasized-color, #000)\n --column-text-color: var(--text-emphasized-color, #000)\n\n/* We have to duplicate the dark mode styles here\n because we want to set them either if the preferred\n color scheme is dark OR if dark mode is explicitly enabled.\n If dark mode is explicitly enabled, we want to override\n the media query. */\n@media (prefers-color-scheme: dark)\n body:not(:global(.light-mode)) .column-container\n --column-background-color: var(--background-color, #000)\n --column-stroke-color: var(--text-emphasized-color, #fff)\n --column-text-color: var(--text-emphasized-color, #fff)\n color-scheme: dark\n color: var(--column-text-color)\n :global\n .timescale\n color: #000\n svg pattern image\n filter: invert(100%)\n\nbody:global(.dark-mode) .column-container\n --column-background-color: var(--background-color, #000)\n --column-stroke-color: var(--text-emphasized-color, #fff)\n --column-text-color: var(--text-emphasized-color, #fff)\n color-scheme: dark\n color: var(--column-text-color)\n :global\n .timescale\n color: #000\n svg pattern image\n filter: invert(100%)\n\n.column-container :global\n .column\n display: flex\n flex-direction: row\n position: relative\n height: fit-content\n\n .unit\n stroke: var(--column-stroke-color)\n stroke-width: 1px\n\n .selection-overlay\n fill: var(--selection-overlay-color, red)\n fill-opacity: var(--selection-overlay-opacity, 0.5)\n\n g.lithology-column use.frame\n stroke: var(--column-stroke-color)\n stroke-width: 1.5px !important\n pointer-events: none\n\n.column-container :global .unit-label\n text-align: center\n\n.column-container :global .col-note-label\n font-size: 10px\n line-height: 9px\n border-left: none !important\n margin: 1px 0\n\n.column-container :global g.height-range\n display: none\n\n.column-container :global .note-inner\n border: none\n padding: 1px\n\n.column-container :global .frame rect\n fill: transparent\n\n.column-container :global .default-buttons\n width: 100%\n margin: 0 -10px\n\n.column-container :global div.section\n display: flex\n flex-direction: row\n\n.column-container :global .section .divisions .unit\n cursor: pointer\n\n.column-container :global(.timescale)\n width: calc(calc(1.5em + 1.5px) * var(--timescale-level-count, 4))\n --timescale-level-size: 1.5em\n\n.timescale-column\n position: relative\n\n.section-main\n position: relative\n margin-bottom: -4px\n\n.section-units-container\n position: relative\n\n.main-column\n position: relative\n\n.unconformity-labels\n position: absolute\n top: 0\n left: 0\n pointer-events: none\n\n\n.unconformity\n text-align: center\n position: absolute\n top: 0px\n display: flex\n justify-content: center\n align-items: center\n font-size: 0.8em\n &.giga\n font-weight: 800\n font-size: 1em\n &.mega\n font-weight: 600\n font-weight: 700\n font-size: 0.9em\n &.large\n font-weight: 600\n &.small\n font-weight: 300\n\n\n.unconformity-text\n width: var(--column-width)\n color: var(--column-stroke-color)\n --unit-font-style: normal\n\n\n"],"names":[],"version":3,"file":"column-views.217078ab.css.map"}