@macrostrat/column-views 3.2.1 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/age-axis.cjs +2 -2
  3. package/dist/age-axis.cjs.map +1 -1
  4. package/dist/age-axis.js +1 -1
  5. package/dist/column-views.css +130 -125
  6. package/dist/index.cjs +30 -19
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +16 -5
  9. package/dist/index.js.map +1 -1
  10. package/dist/maps/column-correlation/core.cjs +10 -30
  11. package/dist/maps/column-correlation/core.cjs.map +1 -1
  12. package/dist/maps/column-correlation/core.d.ts +1 -1
  13. package/dist/maps/column-correlation/core.js +10 -30
  14. package/dist/maps/column-correlation/core.js.map +1 -1
  15. package/dist/maps/column-navigation/mapbox/index.cjs +156 -118
  16. package/dist/maps/column-navigation/mapbox/index.cjs.map +1 -1
  17. package/dist/maps/column-navigation/mapbox/index.d.ts +23 -2
  18. package/dist/maps/column-navigation/mapbox/index.js +158 -120
  19. package/dist/maps/column-navigation/mapbox/index.js.map +1 -1
  20. package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs +7 -1
  21. package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs.map +1 -1
  22. package/dist/maps/column-navigation/mapbox/keyboard-navigation.d.ts +3 -26
  23. package/dist/maps/column-navigation/mapbox/keyboard-navigation.js +9 -3
  24. package/dist/maps/column-navigation/mapbox/keyboard-navigation.js.map +1 -1
  25. package/dist/maps/index.d.ts +2 -2
  26. package/dist/maps/{_shared/inset-map.cjs → inset-map/index.cjs} +1 -1
  27. package/dist/maps/inset-map/index.cjs.map +1 -0
  28. package/dist/maps/{_shared/inset-map.js → inset-map/index.js} +1 -1
  29. package/dist/maps/inset-map/index.js.map +1 -0
  30. package/dist/maps/layers/columns.cjs +161 -0
  31. package/dist/maps/layers/columns.cjs.map +1 -0
  32. package/dist/maps/layers/columns.d.ts +28 -0
  33. package/dist/maps/layers/columns.js +161 -0
  34. package/dist/maps/layers/columns.js.map +1 -0
  35. package/dist/maps/layers/index.d.ts +2 -0
  36. package/dist/maps/{units-overlay/index.cjs → layers/units.cjs} +41 -88
  37. package/dist/maps/layers/units.cjs.map +1 -0
  38. package/dist/maps/{units-overlay/index.d.ts → layers/units.d.ts} +1 -1
  39. package/dist/maps/{units-overlay/index.js → layers/units.js} +34 -82
  40. package/dist/maps/layers/units.js.map +1 -0
  41. package/dist/section.cjs +2 -2
  42. package/dist/section.cjs.map +1 -1
  43. package/dist/section.js +1 -1
  44. package/dist/unit-details/age-range.cjs +196 -0
  45. package/dist/unit-details/age-range.cjs.map +1 -0
  46. package/dist/unit-details/age-range.d.ts +70 -0
  47. package/dist/unit-details/age-range.js +194 -0
  48. package/dist/unit-details/age-range.js.map +1 -0
  49. package/dist/unit-details/age-range.module.sass.cjs +16 -0
  50. package/dist/unit-details/age-range.module.sass.cjs.map +1 -0
  51. package/dist/unit-details/age-range.module.sass.js +14 -0
  52. package/dist/unit-details/age-range.module.sass.js.map +1 -0
  53. package/dist/unit-details/index.d.ts +1 -0
  54. package/dist/unit-details/panel.cjs +8 -173
  55. package/dist/unit-details/panel.cjs.map +1 -1
  56. package/dist/unit-details/panel.js +3 -168
  57. package/dist/unit-details/panel.js.map +1 -1
  58. package/dist/unit-details/panel.module.sass.cjs +20 -22
  59. package/dist/unit-details/panel.module.sass.cjs.map +1 -1
  60. package/dist/unit-details/panel.module.sass.js +20 -22
  61. package/dist/unit-details/panel.module.sass.js.map +1 -1
  62. package/dist/unit-details/utils.cjs +31 -0
  63. package/dist/unit-details/utils.cjs.map +1 -0
  64. package/dist/unit-details/utils.d.ts +3 -0
  65. package/dist/unit-details/utils.js +31 -0
  66. package/dist/unit-details/utils.js.map +1 -0
  67. package/package.json +4 -4
  68. package/src/maps/column-correlation/core.ts +9 -29
  69. package/src/maps/column-navigation/mapbox/index.ts +191 -138
  70. package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +17 -3
  71. package/src/maps/index.ts +2 -2
  72. package/src/maps/layers/columns.ts +210 -0
  73. package/src/maps/layers/index.ts +2 -0
  74. package/src/maps/{units-overlay/index.ts → layers/units.ts} +34 -84
  75. package/src/maps/unit-map.stories.ts +27 -12
  76. package/src/unit-details/age-range.module.sass +15 -0
  77. package/src/unit-details/age-range.ts +269 -0
  78. package/src/unit-details/index.ts +1 -0
  79. package/src/unit-details/panel.module.sass +0 -9
  80. package/src/unit-details/panel.ts +12 -226
  81. package/src/unit-details/utils.ts +33 -0
  82. package/dist/maps/_shared/index.d.ts +0 -2
  83. package/dist/maps/_shared/inset-map.cjs.map +0 -1
  84. package/dist/maps/_shared/inset-map.js.map +0 -1
  85. package/dist/maps/_shared/styles.cjs +0 -73
  86. package/dist/maps/_shared/styles.cjs.map +0 -1
  87. package/dist/maps/_shared/styles.d.ts +0 -2
  88. package/dist/maps/_shared/styles.js +0 -73
  89. package/dist/maps/_shared/styles.js.map +0 -1
  90. package/dist/maps/units-overlay/index.cjs.map +0 -1
  91. package/dist/maps/units-overlay/index.js.map +0 -1
  92. package/src/maps/_shared/index.ts +0 -2
  93. package/src/maps/_shared/styles.ts +0 -76
  94. /package/dist/maps/{_shared/inset-map.d.ts → inset-map/index.d.ts} +0 -0
  95. /package/src/maps/{_shared/inset-map.ts → inset-map/index.ts} +0 -0
  96. /package/src/maps/{_shared → inset-map}/inset-map.stories.ts +0 -0
@@ -0,0 +1,194 @@
1
+ import { DataField, Value, ItemList, IntervalTag } from "@macrostrat/data-components";
2
+ import { useMacrostratDefs } from "@macrostrat/data-provider";
3
+ import h from "./age-range.module.sass.js";
4
+ import { formatRange, formatProportion } from "./utils.js";
5
+ import classNames from "classnames";
6
+ import { useMemo } from "react";
7
+ function AgeField({ unit, children, ...rest }) {
8
+ const [_b_age, _t_age, _unit] = getAgeRange(unit);
9
+ return h(
10
+ DataField,
11
+ {
12
+ label: "Age",
13
+ value: formatRange(_b_age, _t_age),
14
+ unit: _unit,
15
+ ...rest
16
+ },
17
+ children
18
+ );
19
+ }
20
+ function AgeRange({
21
+ data,
22
+ className
23
+ }) {
24
+ const [_b_age, _t_age, _unit] = getAgeRange(data);
25
+ return h(Value, {
26
+ value: formatRange(_b_age, _t_age),
27
+ unit: _unit,
28
+ className
29
+ });
30
+ }
31
+ function AgeLabel({
32
+ age,
33
+ maximumFractionDigits = 2,
34
+ minimumFractionDigits = 0,
35
+ className
36
+ }) {
37
+ const [value, unit] = getAge(age);
38
+ const _value = value.toLocaleString("en-US", {
39
+ maximumFractionDigits,
40
+ minimumFractionDigits
41
+ });
42
+ return h(Value, { value: _value, unit, className });
43
+ }
44
+ function Duration({
45
+ value,
46
+ maximumFractionDigits = 2,
47
+ minimumFractionDigits = 0
48
+ }) {
49
+ let unit = "Myr";
50
+ if (value < 0.8) {
51
+ unit = "kyr";
52
+ value *= 1e3;
53
+ if (value < 5) {
54
+ unit = "yr";
55
+ value *= 1e3;
56
+ }
57
+ } else if (value > 1e3) {
58
+ unit = "Gyr";
59
+ value /= 1e3;
60
+ }
61
+ let _value = value.toLocaleString("en-US", {
62
+ maximumFractionDigits,
63
+ minimumFractionDigits
64
+ });
65
+ return h(Value, { value: _value, unit });
66
+ }
67
+ function IntervalProportions({
68
+ unit,
69
+ className,
70
+ showProportions,
71
+ calculateProportionsFromAges = true,
72
+ ...rest
73
+ }) {
74
+ if (unit.b_int_id == null && unit.t_int_id == null) return null;
75
+ let _showProps = showProportions;
76
+ const i0 = unit.b_int_id;
77
+ const i1 = unit.t_int_id;
78
+ const intervalMap = useMacrostratDefs("intervals");
79
+ const [int0, int1] = useMemo(() => {
80
+ const int02 = intervalMap?.get(i0) ?? {};
81
+ if (i0 === i1) {
82
+ return [int02, int02];
83
+ }
84
+ const int12 = intervalMap?.get(i1) ?? {};
85
+ return [int02, int12];
86
+ }, [intervalMap, i0, i1]);
87
+ const interval0 = {
88
+ id: i0,
89
+ name: unit.b_int_name,
90
+ ...int0
91
+ };
92
+ let b_prop = unit.b_prop;
93
+ let t_prop = unit.t_prop;
94
+ if (b_prop == null && unit.b_age != null && calculateProportionsFromAges) {
95
+ b_prop = getProportion(unit.b_age, int0);
96
+ }
97
+ if (t_prop == null && unit.t_age != null && calculateProportionsFromAges) {
98
+ t_prop = getProportion(unit.t_age, int1);
99
+ }
100
+ if (b_prop == null && t_prop == null) {
101
+ _showProps ??= false;
102
+ }
103
+ b_prop ??= 0;
104
+ t_prop ??= 1;
105
+ let p0 = null;
106
+ let p1 = null;
107
+ if (_showProps !== false) {
108
+ p1 = h(Proportion, { value: t_prop });
109
+ if (i0 !== i1 || b_prop !== 0 || t_prop !== 1) {
110
+ p0 = h(Proportion, { value: b_prop });
111
+ }
112
+ if (i0 === i1 && (b_prop !== 0 || t_prop !== 1)) {
113
+ p0 = h("span.joint-proportion", [p0, " ", h("span.sep", "to"), " ", p1]);
114
+ }
115
+ }
116
+ return h(
117
+ ItemList,
118
+ { className: classNames("interval-proportions", className) },
119
+ [
120
+ h(IntervalTag, {
121
+ interval: interval0,
122
+ prefix: p0,
123
+ ...rest
124
+ }),
125
+ h.if(i0 != i1)("span.discourage-break", [
126
+ h("span.sep", " to "),
127
+ h(IntervalTag, {
128
+ interval: {
129
+ id: i1,
130
+ name: unit.t_int_name,
131
+ ...int1
132
+ },
133
+ prefix: p1,
134
+ ...rest
135
+ })
136
+ ])
137
+ ]
138
+ );
139
+ }
140
+ function getProportion(age, interval) {
141
+ console.log(age, interval);
142
+ return (interval.b_age - age) / (interval.b_age - interval.t_age);
143
+ }
144
+ function Proportion({ value }) {
145
+ let content = null;
146
+ if (value == 0) {
147
+ content = "base";
148
+ } else if (value == 1) {
149
+ content = "top";
150
+ } else {
151
+ content = formatProportion(value * 100) + "%";
152
+ }
153
+ return h("span.proportion", content);
154
+ }
155
+ function getAgeRange(_unit) {
156
+ let b_age = _unit.b_age;
157
+ let t_age = _unit.t_age;
158
+ let unit = "Ma";
159
+ if (b_age < 0.8 && t_age < 1.2) {
160
+ b_age *= 1e3;
161
+ t_age *= 1e3;
162
+ unit = "ka";
163
+ } else if (b_age > 800 && t_age > 1200) {
164
+ b_age /= 1e3;
165
+ t_age /= 1e3;
166
+ unit = "Ga";
167
+ }
168
+ return [b_age, t_age, unit];
169
+ }
170
+ function getAge(value) {
171
+ let unit = "Ma";
172
+ if (value < 0.8) {
173
+ unit = "ka";
174
+ value *= 1e3;
175
+ if (value < 5) {
176
+ unit = "yr";
177
+ value *= 1e3;
178
+ }
179
+ } else if (value > 1e3) {
180
+ unit = "Ga";
181
+ value /= 1e3;
182
+ }
183
+ return [value, unit];
184
+ }
185
+ export {
186
+ AgeField,
187
+ AgeLabel,
188
+ AgeRange,
189
+ Duration,
190
+ IntervalProportions,
191
+ getAge,
192
+ getAgeRange
193
+ };
194
+ //# sourceMappingURL=age-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"age-range.js","sources":["../../src/unit-details/age-range.ts"],"sourcesContent":["import {\n DataField,\n IntervalShort,\n IntervalTag,\n type IntervalTagProps,\n ItemList,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useMacrostratDefs } from \"@macrostrat/data-provider\";\nimport h from \"./age-range.module.sass\";\nimport { formatProportion, formatRange } from \"./utils\";\nimport classNames from \"classnames\";\nimport { useMemo } from \"react\";\n\nexport function AgeField({ unit, children, ...rest }) {\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 ...rest,\n },\n children,\n );\n}\n\nexport function AgeRange({\n data,\n className,\n}: {\n data: {\n t_age: number;\n b_age: number;\n };\n className?: string;\n}) {\n const [_b_age, _t_age, _unit] = getAgeRange(data);\n\n return h(Value, {\n value: formatRange(_b_age, _t_age),\n unit: _unit,\n className,\n });\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\ninterface UnitIntervalConstraints {\n b_int_id?: number;\n t_int_id?: number;\n b_prop?: number;\n t_prop?: number;\n b_int_name?: string;\n t_int_name?: string;\n b_age?: number;\n t_age?: number;\n}\n\nexport interface IntervalProportionsProps extends Omit<\n IntervalTagProps,\n \"interval\"\n> {\n unit: UnitIntervalConstraints;\n showProportions?: boolean;\n calculateProportionsFromAges?: boolean;\n}\n\nexport function IntervalProportions({\n unit,\n className,\n showProportions,\n calculateProportionsFromAges = true,\n ...rest\n}: IntervalProportionsProps) {\n /** Display the proportions of the unit that belong to the base and top intervals, if they are different */\n if (unit.b_int_id == null && unit.t_int_id == null) return null;\n\n let _showProps = showProportions;\n\n const i0 = unit.b_int_id;\n const i1 = unit.t_int_id;\n\n /** Get interval information */\n const intervalMap = useMacrostratDefs(\"intervals\");\n const [int0, int1] = useMemo(() => {\n const int0 = intervalMap?.get(i0) ?? {};\n if (i0 === i1) {\n return [int0, int0];\n }\n const int1 = intervalMap?.get(i1) ?? {};\n return [int0, int1];\n }, [intervalMap, i0, i1]);\n\n const interval0: IntervalShort = {\n id: i0,\n name: unit.b_int_name,\n ...int0,\n };\n\n let b_prop = unit.b_prop;\n let t_prop = unit.t_prop;\n\n // If we have b_age and t_age, then we can calculate proportions if they are not given\n if (b_prop == null && unit.b_age != null && calculateProportionsFromAges) {\n b_prop = getProportion(unit.b_age, int0);\n }\n if (t_prop == null && unit.t_age != null && calculateProportionsFromAges) {\n t_prop = getProportion(unit.t_age, int1);\n }\n\n // If there are no proportions given and we are not explicitly directed to show them,\n // then we set them to hidden.\n if (b_prop == null && t_prop == null) {\n _showProps ??= false;\n }\n\n /*\n Set default proportions to 0 and 1 if they are not given,\n so that we can display \"base\" and \"top\" labels\n */\n b_prop ??= 0;\n t_prop ??= 1;\n\n let p0: any = null;\n let p1: any = null;\n\n if (_showProps !== false) {\n p1 = 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\n return h(\n ItemList,\n { className: classNames(\"interval-proportions\", className) },\n [\n h(IntervalTag, {\n interval: interval0,\n prefix: p0,\n ...rest,\n }),\n h.if(i0 != i1)(\"span.discourage-break\", [\n h(\"span.sep\", \" to \"),\n h(IntervalTag, {\n interval: {\n id: i1,\n name: unit.t_int_name,\n ...int1,\n },\n prefix: p1,\n ...rest,\n }),\n ]),\n ],\n );\n}\n\nfunction getProportion(age: number, interval: IntervalShort): number | null {\n /** Get proportion with the age */\n console.log(age, interval);\n return (interval.b_age - age) / (interval.b_age - interval.t_age);\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\nexport function 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\nexport function 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"],"names":["int0","int1"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const h$1 = require("@macrostrat/hyper");
4
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
5
+ const h__default = /* @__PURE__ */ _interopDefault(h$1);
6
+ const sep = "_sep_1ibvp_16";
7
+ const styles = {
8
+ "interval-proportions": "_interval-proportions_1ibvp_1",
9
+ "discourage-break": "_discourage-break_1ibvp_9",
10
+ sep
11
+ };
12
+ let h = h__default.default.styled(styles);
13
+ Object.assign(h, styles);
14
+ exports.default = h;
15
+ exports.sep = sep;
16
+ //# sourceMappingURL=age-range.module.sass.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"age-range.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -0,0 +1,14 @@
1
+ import h$1 from "@macrostrat/hyper";
2
+ const sep = "_sep_1ibvp_16";
3
+ const styles = {
4
+ "interval-proportions": "_interval-proportions_1ibvp_1",
5
+ "discourage-break": "_discourage-break_1ibvp_9",
6
+ sep
7
+ };
8
+ let h = h$1.styled(styles);
9
+ Object.assign(h, styles);
10
+ export {
11
+ h as default,
12
+ sep
13
+ };
14
+ //# sourceMappingURL=age-range.module.sass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"age-range.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -1,3 +1,4 @@
1
1
  export * from './panel';
2
2
  export * from './popover';
3
3
  export * from './modal-panel';
4
+ export * from './age-range';
@@ -9,6 +9,8 @@ const dataComponents = require("@macrostrat/data-components");
9
9
  const dataProvider = require("@macrostrat/data-provider");
10
10
  const names = require("../units/names.cjs");
11
11
  const classNames = require("classnames");
12
+ const ageRange = require("./age-range.cjs");
13
+ const utils = require("./utils.cjs");
12
14
  const store = require("../data-provider/store.cjs");
13
15
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
14
16
  const h__default = /* @__PURE__ */ _interopDefault(h$1);
@@ -178,7 +180,7 @@ function UnitDetailsContent({
178
180
  thicknessOrHeightRange = h(dataComponents.DataField, {
179
181
  unit: u1,
180
182
  label,
181
- value: formatRange(unit.b_pos, unit.t_pos),
183
+ value: utils.formatRange(unit.b_pos, unit.t_pos),
182
184
  children: h(
183
185
  dataComponents.Parenthetical,
184
186
  h(dataComponents.Value, { value: thickness, unit: thicknessUnit })
@@ -213,9 +215,9 @@ function UnitDetailsContent({
213
215
  lithologies,
214
216
  features: lithologyFeatures
215
217
  }),
216
- h(AgeField, { unit }, [
217
- h(dataComponents.Parenthetical, h(Duration, { value: unit.b_age - unit.t_age })),
218
- h(IntervalProportions, {
218
+ h(ageRange.AgeField, { unit }, [
219
+ h(dataComponents.Parenthetical, h(ageRange.Duration, { value: unit.b_age - unit.t_age })),
220
+ h(ageRange.IntervalProportions, {
219
221
  unit,
220
222
  onClickItem
221
223
  })
@@ -337,9 +339,9 @@ function getThickness(unit) {
337
339
  _unit = "km";
338
340
  }
339
341
  if (minThickness == maxThickness) {
340
- return [formatSignificance(minThickness), _unit];
342
+ return [utils.formatSignificance(minThickness), _unit];
341
343
  }
342
- return [formatRange(minThickness, maxThickness), _unit];
344
+ return [utils.formatRange(minThickness, maxThickness), _unit];
343
345
  }
344
346
  function ThicknessField({ unit, label = "Thickness" }) {
345
347
  const [value, thicknessUnit] = getThickness(unit);
@@ -377,84 +379,6 @@ function Citation({ data, tag = "p" }) {
377
379
  h("span.title", data.ref)
378
380
  ]);
379
381
  }
380
- function AgeField({ unit, children }) {
381
- const [b_age, t_age, _unit] = getAgeRange(unit);
382
- return h(
383
- dataComponents.DataField,
384
- {
385
- label: "Age",
386
- value: formatRange(b_age, t_age),
387
- unit: _unit
388
- },
389
- children
390
- );
391
- }
392
- function getAgeRange(_unit) {
393
- let b_age = _unit.b_age;
394
- let t_age = _unit.t_age;
395
- let unit = "Ma";
396
- if (b_age < 0.8 && t_age < 1.2) {
397
- b_age *= 1e3;
398
- t_age *= 1e3;
399
- unit = "ka";
400
- } else if (b_age > 800 && t_age > 1200) {
401
- b_age /= 1e3;
402
- t_age /= 1e3;
403
- unit = "Ga";
404
- }
405
- return [b_age, t_age, unit];
406
- }
407
- function getAge(value) {
408
- let unit = "Ma";
409
- if (value < 0.8) {
410
- unit = "ka";
411
- value *= 1e3;
412
- if (value < 5) {
413
- unit = "yr";
414
- value *= 1e3;
415
- }
416
- } else if (value > 1e3) {
417
- unit = "Ga";
418
- value /= 1e3;
419
- }
420
- return [value, unit];
421
- }
422
- function AgeLabel({
423
- age,
424
- maximumFractionDigits = 2,
425
- minimumFractionDigits = 0,
426
- className
427
- }) {
428
- const [value, unit] = getAge(age);
429
- const _value = value.toLocaleString("en-US", {
430
- maximumFractionDigits,
431
- minimumFractionDigits
432
- });
433
- return h(dataComponents.Value, { value: _value, unit, className });
434
- }
435
- function Duration({
436
- value,
437
- maximumFractionDigits = 2,
438
- minimumFractionDigits = 0
439
- }) {
440
- let unit = "Myr";
441
- if (value < 0.8) {
442
- unit = "kyr";
443
- value *= 1e3;
444
- if (value < 5) {
445
- unit = "yr";
446
- value *= 1e3;
447
- }
448
- } else if (value > 1e3) {
449
- unit = "Gyr";
450
- value /= 1e3;
451
- }
452
- let _value = value.toLocaleString("en-US", {
453
- maximumFractionDigits,
454
- minimumFractionDigits
455
- });
456
- return h(dataComponents.Value, { value: _value, unit });
457
- }
458
382
  function enhanceEnvironments(environments, envMap) {
459
383
  return environments?.map((env) => {
460
384
  return {
@@ -559,96 +483,7 @@ function UnitIdentifier({
559
483
  ...interactionProps
560
484
  });
561
485
  }
562
- function IntervalProportions({ unit, onClickItem }) {
563
- if (unit.b_int_id == null && unit.t_int_id == null && unit.b_prop == null && unit.t_prop == null)
564
- return null;
565
- const i0 = unit.b_int_id;
566
- const i1 = unit.t_int_id;
567
- let b_prop = unit.b_prop ?? 0;
568
- let t_prop = unit.t_prop ?? 1;
569
- const intervalMap = dataProvider.useMacrostratDefs("intervals");
570
- const int0 = intervalMap?.get(i0) ?? {};
571
- const interval0 = {
572
- ...int0,
573
- id: i0,
574
- name: unit.b_int_name
575
- };
576
- let p0 = null;
577
- const int1 = intervalMap?.get(i1) ?? {};
578
- const p1 = h(Proportion, { value: t_prop });
579
- if (i0 !== i1 || b_prop !== 0 || t_prop !== 1) {
580
- p0 = h(Proportion, { value: b_prop });
581
- }
582
- if (i0 === i1 && (b_prop !== 0 || t_prop !== 1)) {
583
- p0 = h("span.joint-proportion", [p0, h("span.sep", "to"), p1]);
584
- }
585
- const clickable = onClickItem != null;
586
- const handleClick = (event) => {
587
- if (onClickItem) {
588
- onClickItem(event, interval0);
589
- }
590
- };
591
- return h("div.interval-proportions", [
592
- h(dataComponents.IntervalTag, {
593
- className: clickable ? "clickable" : "",
594
- onClick: clickable ? handleClick : void 0,
595
- interval: interval0,
596
- prefix: p0
597
- }),
598
- h.if(i0 != i1)("span.discourage-break", [
599
- h("span.sep", "to"),
600
- h(dataComponents.IntervalTag, {
601
- className: clickable ? "clickable" : "",
602
- onClick: clickable ? handleClick : void 0,
603
- interval: {
604
- ...int1,
605
- id: i1,
606
- name: unit.t_int_name
607
- },
608
- prefix: p1
609
- })
610
- ])
611
- ]);
612
- }
613
- const formatProportion = (d) => {
614
- if (d == null) return null;
615
- return d.toFixed(1);
616
- };
617
- function Proportion({ value }) {
618
- let content = null;
619
- if (value == 0) {
620
- content = "base";
621
- } else if (value == 1) {
622
- content = "top";
623
- } else {
624
- content = formatProportion(value * 100) + "%";
625
- }
626
- return h("span.proportion", content);
627
- }
628
- function formatRange(min, max, precision = null) {
629
- if (min == null || max == null) return null;
630
- if (min === max) {
631
- return min.toFixed(precision);
632
- }
633
- return `${formatSignificance(min, precision)}–${formatSignificance(
634
- max,
635
- precision
636
- )}`;
637
- }
638
- function formatSignificance(value, precision = null) {
639
- if (precision == null) {
640
- return value.toLocaleString();
641
- }
642
- if (precision >= 0) {
643
- return value.toFixed(precision);
644
- }
645
- if (precision < 0) {
646
- return (value / Math.pow(10, -precision)).toFixed(0) + "0".repeat(-precision);
647
- }
648
- }
649
- exports.AgeLabel = AgeLabel;
650
486
  exports.ClickableText = ClickableText;
651
- exports.Duration = Duration;
652
487
  exports.Identifier = Identifier;
653
488
  exports.LegendPanelHeader = LegendPanelHeader;
654
489
  exports.ReferencesField = ReferencesField;
@@ -1 +1 @@
1
- {"version":3,"file":"panel.cjs","sources":["../../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, useCallback, useMemo, useState } from \"react\";\nimport {\n DataField,\n EnvironmentsList,\n IntervalShort,\n IntervalTag,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n Parenthetical,\n Value,\n MacrostratInteractionManager,\n useInteractionProps,\n ItemInteractionProps,\n useInteractionManager,\n MacrostratItemIdentifier,\n MacrostratInteractionProvider,\n isClickable,\n} from \"@macrostrat/data-components\";\nimport { useColumnUnitsMap } from \"../data-provider\";\nimport {\n useMacrostratColumnInfo,\n useMacrostratData,\n useMacrostratDefs,\n useStratNames,\n} from \"@macrostrat/data-provider\";\nimport type {\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 interface UnitDetailsPanelProps {\n unit: any;\n onClose?: any;\n className?: string;\n actions?: ReactNode;\n hiddenActions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n onSelectUnit?: (unitID: number) => void;\n onClickItem?: MacrostratItemClickHandler;\n interactionManager?: MacrostratInteractionManager;\n}\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 hiddenActions = null,\n onSelectUnit,\n onClickItem,\n}: UnitDetailsPanelProps) {\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 if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h([\n 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 hiddenActions,\n ]);\n }\n\n const main = 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 /** Handle unit selection clicks */\n const clickHandlerForItem = useMemo(() => {\n if (onSelectUnit == null && onClickItem == null) return null;\n return (item: MacrostratItemIdentifier) => {\n if (\"unit_id\" in item && !(\"col_id\" in item)) {\n // We are selecting a unit within the column\n return (event: MouseEvent) => {\n onSelectUnit(item.unit_id);\n // Don't allow event to propagate further (e.g., to open a link)\n event.preventDefault();\n };\n }\n return undefined;\n };\n }, [onSelectUnit, onClickItem]);\n\n if (clickHandlerForItem != null) {\n // We wrap this in a MacrostratInteractionManager to handle unit selection\n return h(\n MacrostratInteractionProvider,\n {\n clickHandlerForItem,\n inherit: true,\n },\n main,\n );\n }\n\n return main;\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)(\n \"span.hidden-actions-container\",\n h(\"div.hidden-actions\", hiddenActions),\n ),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code.unit-id\", 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 ColumnName = \"column-name\",\n}\n\nexport type MacrostratItemClickHandler = (\n event: MouseEvent,\n item:\n | Lithology\n | Environment\n | UnitLong\n | Interval\n | { strat_name_id: number },\n) => void;\n\nfunction UnitDetailsContent({\n unit,\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 lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: MacrostratItemClickHandler;\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 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 && features.has(UnitDetailsFeature.Color)) {\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 h.if(features.has(UnitDetailsFeature.ColumnName))(ColumnNameField, {\n col_id: unit.col_id,\n }),\n thicknessOrHeightRange,\n h.if(lithologies != null)(LithologyList, {\n label: \"Lithology\",\n lithologies,\n features: lithologyFeatures,\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.if(environments != null)(EnvironmentsList, {\n environments,\n }),\n h.if(unit.strat_name_id != null)(StratNameField, {\n strat_name_id: unit.strat_name_id,\n }),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h.if(unit.units_above != null)(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, {\n units: unit.units_above,\n showNames: true,\n }),\n ),\n h.if(unit.units_below != null)(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, {\n units: unit.units_below,\n showNames: true,\n }),\n ),\n ]),\n colorSwatch,\n h(ReferencesField, { refs: unit.refs, inline: true }),\n ]);\n}\n\nfunction ColumnNameField({\n col_id,\n showIdentifier = false,\n}: {\n col_id: number;\n showIdentifier?: boolean;\n}) {\n const colData = useMacrostratColumnInfo(col_id);\n let inner: any = h(Identifier, { id: col_id });\n const name = colData?.col_name;\n if (name != null) {\n inner = h(\"span.value\", [\n h(\"span.col-name\", name),\n h.if(showIdentifier)([\" \", h(Parenthetical, inner)]),\n ]);\n }\n\n return h(\n DataField,\n {\n label: \"Column\",\n },\n inner,\n );\n}\n\nexport function ReferencesField({ refs, className = null, ...rest }) {\n if (refs == null || refs.length === 0) {\n return null;\n }\n\n return h(\n DataField,\n {\n label: \"References\",\n className: classNames(\"refs-field\", className),\n ...rest,\n },\n h(BibInfo, { refs }),\n );\n}\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nfunction StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\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\nexport function 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, {\n data: refData[0],\n tag: \"span\",\n key: refData[0].ref_id,\n });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) =>\n h(Citation, { data, tag: \"li\", key: data.ref_id }),\n ),\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>[] | null,\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\nexport function ClickableText({\n className,\n ...rest\n}: {\n className?: string;\n children: ReactNode;\n} & ItemInteractionProps) {\n /** An optionally clickable text element */\n const clickable = isClickable(rest);\n const tag = clickable ? \"a\" : \"span\";\n return h(tag, { className: classNames(className, { clickable }), ...rest });\n}\n\nexport function Identifier({\n id,\n className,\n ...rest\n}: {\n id: number | string;\n className?: string;\n} & ItemInteractionProps) {\n /** An item that displays a numeric identifier, optionally clickable */\n return h(\n ClickableText,\n {\n className: classNames(\"identifier\", className),\n ...rest,\n },\n id,\n );\n}\n\ntype UnitInfo = {\n unitID: number;\n colID?: number;\n name?: string;\n};\n\nfunction UnitIDList({ units, showNames = false }) {\n const unitsMap = useColumnUnitsMap();\n\n const interactionManager = useInteractionManager();\n\n const extUnits: UnitInfo[] = useMemo(() => {\n const u1 = units.filter((d) => d != 0);\n if (showNames) {\n return u1.map((unitID) => {\n const unitData = unitsMap?.get(unitID);\n let name: string = undefined;\n if (unitData != null) {\n name = defaultNameFunction(unitData);\n }\n return {\n unitID,\n colID: unitData?.col_id,\n name,\n };\n });\n } else {\n return u1.map((unitID) => ({ unitID }));\n }\n }, [units, unitsMap]);\n\n if (extUnits.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n return h(\n ItemList,\n { className: \"units-list\" },\n extUnits.map((info) => {\n return h(\n \"span.item\",\n h(UnitIdentifier, {\n ...info,\n ...interactionManager?.interactionPropsForItem({\n unit_id: info.unitID,\n }),\n }),\n );\n }),\n );\n}\n\nfunction UnitIdentifier({\n unitID,\n colID,\n name,\n ...interactionProps\n}: UnitInfo & ItemInteractionProps) {\n if (name != null) {\n return h(\n ClickableText,\n {\n className: \"unit-name\",\n ...interactionProps,\n },\n name,\n );\n }\n\n return h(Identifier, {\n className: \"unit-id\",\n key: unitID,\n id: unitID,\n ...interactionProps,\n });\n}\n\nfunction IntervalProportions({ unit, onClickItem }) {\n if (\n unit.b_int_id == null &&\n unit.t_int_id == null &&\n unit.b_prop == null &&\n unit.t_prop == null\n )\n return null;\n\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":["hyper","styles","useState","JSONView","defaultNameFunction","Button","classNames","useMemo","MacrostratInteractionProvider","ButtonGroup","UnitDetailsFeature","LithologyTagFeature","useMacrostratDefs","DataField","Parenthetical","Value","LithologyList","EnvironmentsList","useMacrostratColumnInfo","useStratNames","useInteractionProps","isClickable","useMacrostratData","useColumnUnitsMap","useInteractionManager","ItemList","IntervalTag"],"mappings":"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"}
1
+ {"version":3,"file":"panel.cjs","sources":["../../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 isClickable,\n ItemInteractionProps,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n MacrostratInteractionManager,\n MacrostratInteractionProvider,\n MacrostratItemIdentifier,\n Parenthetical,\n useInteractionManager,\n useInteractionProps,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useColumnUnitsMap } from \"../data-provider\";\nimport {\n useMacrostratColumnInfo,\n useMacrostratData,\n useMacrostratDefs,\n useStratNames,\n} from \"@macrostrat/data-provider\";\nimport type {\n Environment,\n Interval,\n Lithology,\n UnitLong,\n UnitLongFull,\n} from \"@macrostrat/api-types\";\nimport { defaultNameFunction } from \"../units/names\";\nimport classNames from \"classnames\";\nimport { AgeField, Duration, IntervalProportions } from \"./age-range\";\nimport { formatRange, formatSignificance } from \"./utils.ts\";\n\nconst h = hyper.styled(styles);\n\nexport interface UnitDetailsPanelProps {\n unit: any;\n onClose?: any;\n className?: string;\n actions?: ReactNode;\n hiddenActions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n onSelectUnit?: (unitID: number) => void;\n onClickItem?: MacrostratItemClickHandler;\n interactionManager?: MacrostratInteractionManager;\n}\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 hiddenActions = null,\n onSelectUnit,\n onClickItem,\n}: UnitDetailsPanelProps) {\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 if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h([\n 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 hiddenActions,\n ]);\n }\n\n const main = 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 /** Handle unit selection clicks */\n const clickHandlerForItem = useMemo(() => {\n if (onSelectUnit == null && onClickItem == null) return null;\n return (item: MacrostratItemIdentifier) => {\n if (\"unit_id\" in item && !(\"col_id\" in item)) {\n // We are selecting a unit within the column\n return (event: MouseEvent) => {\n onSelectUnit(item.unit_id);\n // Don't allow event to propagate further (e.g., to open a link)\n event.preventDefault();\n };\n }\n return undefined;\n };\n }, [onSelectUnit, onClickItem]);\n\n if (clickHandlerForItem != null) {\n // We wrap this in a MacrostratInteractionManager to handle unit selection\n return h(\n MacrostratInteractionProvider,\n {\n clickHandlerForItem,\n inherit: true,\n },\n main,\n );\n }\n\n return main;\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)(\n \"span.hidden-actions-container\",\n h(\"div.hidden-actions\", hiddenActions),\n ),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code.unit-id\", 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 ColumnName = \"column-name\",\n}\n\nexport type MacrostratItemClickHandler = (\n event: MouseEvent,\n item:\n | Lithology\n | Environment\n | UnitLong\n | Interval\n | { strat_name_id: number },\n) => void;\n\nfunction UnitDetailsContent({\n unit,\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 lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: MacrostratItemClickHandler;\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 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 && features.has(UnitDetailsFeature.Color)) {\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 h.if(features.has(UnitDetailsFeature.ColumnName))(ColumnNameField, {\n col_id: unit.col_id,\n }),\n thicknessOrHeightRange,\n h.if(lithologies != null)(LithologyList, {\n label: \"Lithology\",\n lithologies,\n features: lithologyFeatures,\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.if(environments != null)(EnvironmentsList, {\n environments,\n }),\n h.if(unit.strat_name_id != null)(StratNameField, {\n strat_name_id: unit.strat_name_id,\n }),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h.if(unit.units_above != null)(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, {\n units: unit.units_above,\n showNames: true,\n }),\n ),\n h.if(unit.units_below != null)(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, {\n units: unit.units_below,\n showNames: true,\n }),\n ),\n ]),\n colorSwatch,\n h(ReferencesField, { refs: unit.refs, inline: true }),\n ]);\n}\n\nfunction ColumnNameField({\n col_id,\n showIdentifier = false,\n}: {\n col_id: number;\n showIdentifier?: boolean;\n}) {\n const colData = useMacrostratColumnInfo(col_id);\n let inner: any = h(Identifier, { id: col_id });\n const name = colData?.col_name;\n if (name != null) {\n inner = h(\"span.value\", [\n h(\"span.col-name\", name),\n h.if(showIdentifier)([\" \", h(Parenthetical, inner)]),\n ]);\n }\n\n return h(\n DataField,\n {\n label: \"Column\",\n },\n inner,\n );\n}\n\nexport function ReferencesField({ refs, className = null, ...rest }) {\n if (refs == null || refs.length === 0) {\n return null;\n }\n\n return h(\n DataField,\n {\n label: \"References\",\n className: classNames(\"refs-field\", className),\n ...rest,\n },\n h(BibInfo, { refs }),\n );\n}\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nfunction StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\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\nexport function 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, {\n data: refData[0],\n tag: \"span\",\n key: refData[0].ref_id,\n });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) =>\n h(Citation, { data, tag: \"li\", key: data.ref_id }),\n ),\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 enhanceEnvironments(\n environments: Partial<Environment>[] | null,\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\nexport function ClickableText({\n className,\n ...rest\n}: {\n className?: string;\n children: ReactNode;\n} & ItemInteractionProps) {\n /** An optionally clickable text element */\n const clickable = isClickable(rest);\n const tag = clickable ? \"a\" : \"span\";\n return h(tag, { className: classNames(className, { clickable }), ...rest });\n}\n\nexport function Identifier({\n id,\n className,\n ...rest\n}: {\n id: number | string;\n className?: string;\n} & ItemInteractionProps) {\n /** An item that displays a numeric identifier, optionally clickable */\n return h(\n ClickableText,\n {\n className: classNames(\"identifier\", className),\n ...rest,\n },\n id,\n );\n}\n\ntype UnitInfo = {\n unitID: number;\n colID?: number;\n name?: string;\n};\n\nfunction UnitIDList({ units, showNames = false }) {\n const unitsMap = useColumnUnitsMap();\n\n const interactionManager = useInteractionManager();\n\n const extUnits: UnitInfo[] = useMemo(() => {\n const u1 = units.filter((d) => d != 0);\n if (showNames) {\n return u1.map((unitID) => {\n const unitData = unitsMap?.get(unitID);\n let name: string = undefined;\n if (unitData != null) {\n name = defaultNameFunction(unitData);\n }\n return {\n unitID,\n colID: unitData?.col_id,\n name,\n };\n });\n } else {\n return u1.map((unitID) => ({ unitID }));\n }\n }, [units, unitsMap]);\n\n if (extUnits.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n return h(\n ItemList,\n { className: \"units-list\" },\n extUnits.map((info) => {\n return h(\n \"span.item\",\n h(UnitIdentifier, {\n ...info,\n ...interactionManager?.interactionPropsForItem({\n unit_id: info.unitID,\n }),\n }),\n );\n }),\n );\n}\n\nfunction UnitIdentifier({\n unitID,\n colID,\n name,\n ...interactionProps\n}: UnitInfo & ItemInteractionProps) {\n if (name != null) {\n return h(\n ClickableText,\n {\n className: \"unit-name\",\n ...interactionProps,\n },\n name,\n );\n }\n\n return h(Identifier, {\n className: \"unit-id\",\n key: unitID,\n id: unitID,\n ...interactionProps,\n });\n}\n"],"names":["hyper","styles","useState","JSONView","defaultNameFunction","Button","classNames","useMemo","MacrostratInteractionProvider","ButtonGroup","UnitDetailsFeature","LithologyTagFeature","useMacrostratDefs","DataField","formatRange","Parenthetical","Value","LithologyList","AgeField","Duration","IntervalProportions","EnvironmentsList","useMacrostratColumnInfo","useStratNames","useInteractionProps","isClickable","formatSignificance","useMacrostratData","useColumnUnitsMap","useInteractionManager","ItemList"],"mappings":"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"}