@macrostrat/column-views 3.6.0 → 3.8.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 (107) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/column-views.css +118 -89
  3. package/dist/column.cjs +1 -2
  4. package/dist/column.cjs.map +1 -1
  5. package/dist/column.js +1 -2
  6. package/dist/column.js.map +1 -1
  7. package/dist/column.module.sass.cjs +15 -15
  8. package/dist/column.module.sass.js +15 -15
  9. package/dist/correlation-chart/main.cjs +136 -34
  10. package/dist/correlation-chart/main.cjs.map +1 -1
  11. package/dist/correlation-chart/main.d.ts +33 -2
  12. package/dist/correlation-chart/main.js +118 -15
  13. package/dist/correlation-chart/main.js.map +1 -1
  14. package/dist/correlation-chart/main.module.sass.cjs +23 -20
  15. package/dist/correlation-chart/main.module.sass.cjs.map +1 -1
  16. package/dist/correlation-chart/main.module.sass.js +23 -20
  17. package/dist/correlation-chart/main.module.sass.js.map +1 -1
  18. package/dist/correlation-chart/prepare-data.cjs +0 -1
  19. package/dist/correlation-chart/prepare-data.cjs.map +1 -1
  20. package/dist/correlation-chart/prepare-data.js +0 -1
  21. package/dist/correlation-chart/prepare-data.js.map +1 -1
  22. package/dist/data-provider/store.cjs +10 -2
  23. package/dist/data-provider/store.cjs.map +1 -1
  24. package/dist/data-provider/store.d.ts +2 -2
  25. package/dist/data-provider/store.js +10 -2
  26. package/dist/data-provider/store.js.map +1 -1
  27. package/dist/data-provider/unit-selection.cjs +4 -1
  28. package/dist/data-provider/unit-selection.cjs.map +1 -1
  29. package/dist/data-provider/unit-selection.d.ts +1 -1
  30. package/dist/data-provider/unit-selection.js +4 -1
  31. package/dist/data-provider/unit-selection.js.map +1 -1
  32. package/dist/index.cjs +14 -4
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.js +3 -2
  35. package/dist/maps/column-correlation/core.cjs +127 -6
  36. package/dist/maps/column-correlation/core.cjs.map +1 -1
  37. package/dist/maps/column-correlation/core.js +128 -7
  38. package/dist/maps/column-correlation/core.js.map +1 -1
  39. package/dist/maps/column-correlation/state.cjs +63 -2
  40. package/dist/maps/column-correlation/state.cjs.map +1 -1
  41. package/dist/maps/column-correlation/state.d.ts +31 -1
  42. package/dist/maps/column-correlation/state.js +63 -2
  43. package/dist/maps/column-correlation/state.js.map +1 -1
  44. package/dist/maps/layers/columns.cjs +5 -1
  45. package/dist/maps/layers/columns.cjs.map +1 -1
  46. package/dist/maps/layers/columns.js +5 -1
  47. package/dist/maps/layers/columns.js.map +1 -1
  48. package/dist/prepare-units/helpers.cjs +4 -2
  49. package/dist/prepare-units/helpers.cjs.map +1 -1
  50. package/dist/prepare-units/helpers.js +4 -2
  51. package/dist/prepare-units/helpers.js.map +1 -1
  52. package/dist/section.cjs +8 -2
  53. package/dist/section.cjs.map +1 -1
  54. package/dist/section.d.ts +2 -0
  55. package/dist/section.js +8 -2
  56. package/dist/section.js.map +1 -1
  57. package/dist/unit-details/age-range.cjs +2 -1
  58. package/dist/unit-details/age-range.cjs.map +1 -1
  59. package/dist/unit-details/age-range.js +2 -1
  60. package/dist/unit-details/age-range.js.map +1 -1
  61. package/dist/unit-details/index.d.ts +1 -1
  62. package/dist/unit-details/panel.cjs +2 -3
  63. package/dist/unit-details/panel.cjs.map +1 -1
  64. package/dist/unit-details/panel.js +1 -2
  65. package/dist/unit-details/panel.js.map +1 -1
  66. package/dist/unit-details/panel.module.sass.cjs +18 -22
  67. package/dist/unit-details/panel.module.sass.cjs.map +1 -1
  68. package/dist/unit-details/panel.module.sass.js +18 -22
  69. package/dist/unit-details/panel.module.sass.js.map +1 -1
  70. package/dist/unit-details/strat-names.cjs +1 -2
  71. package/dist/unit-details/strat-names.cjs.map +1 -1
  72. package/dist/unit-details/strat-names.js +1 -2
  73. package/dist/unit-details/strat-names.js.map +1 -1
  74. package/dist/units/boxes.cjs +2 -1
  75. package/dist/units/boxes.cjs.map +1 -1
  76. package/dist/units/boxes.js +2 -1
  77. package/dist/units/boxes.js.map +1 -1
  78. package/package.json +7 -7
  79. package/src/column.module.sass +6 -0
  80. package/src/correlation-chart/main.module.sass +46 -2
  81. package/src/correlation-chart/main.ts +180 -9
  82. package/src/correlation-chart/prepare-data.ts +0 -1
  83. package/src/data-provider/store.ts +11 -1
  84. package/src/data-provider/unit-selection.ts +13 -2
  85. package/src/maps/column-correlation/column-correlation-map.stories.ts +12 -0
  86. package/src/maps/column-correlation/core.ts +155 -9
  87. package/src/maps/column-correlation/state.ts +110 -2
  88. package/src/maps/layers/columns.ts +7 -1
  89. package/src/prepare-units/helpers.ts +4 -3
  90. package/src/section.ts +9 -1
  91. package/src/unit-details/age-range.ts +3 -1
  92. package/src/unit-details/index.ts +7 -1
  93. package/src/unit-details/panel.module.sass +0 -8
  94. package/src/unit-details/panel.ts +6 -6
  95. package/src/unit-details/strat-names.ts +1 -1
  96. package/src/units/boxes.ts +4 -2
  97. package/dist/correlation-chart/stories/utils.d.ts +0 -6
  98. package/dist/unit-details/identifiers.cjs +0 -56
  99. package/dist/unit-details/identifiers.cjs.map +0 -1
  100. package/dist/unit-details/identifiers.d.ts +0 -31
  101. package/dist/unit-details/identifiers.js +0 -54
  102. package/dist/unit-details/identifiers.js.map +0 -1
  103. package/src/correlation-chart/stories/correlation-chart.stories.ts +0 -228
  104. package/src/correlation-chart/stories/namibia-correlation.stories.ts +0 -151
  105. package/src/correlation-chart/stories/stories.module.sass +0 -18
  106. package/src/correlation-chart/stories/utils.ts +0 -24
  107. package/src/unit-details/identifiers.ts +0 -67
@@ -1,6 +1,25 @@
1
1
  import { CorrelationChartSettings } from './prepare-data';
2
- import { ColumnData } from '../data-provider';
2
+ import { ColumnData } from '@macrostrat/data-provider';
3
3
  import { BaseUnit } from '@macrostrat/api-types';
4
+ import { ExtUnit } from '../prepare-units/types';
5
+ import { TimescaleClickHandler } from '@macrostrat/timescale';
6
+ /** Standard props passed to a `columnHeaderComponent`. Everything a header
7
+ * needs is provided here, so the component can be a pure function of its props
8
+ * (no hooks required). Column-level hover/click are handled by the chart. */
9
+ export interface ColumnHeaderProps {
10
+ /** The column data (units + identifier) for this column */
11
+ column: ColumnData;
12
+ /** The column's ID (col_id) */
13
+ columnID: number;
14
+ /** The column's index (left-to-right) within the chart */
15
+ columnIndex: number;
16
+ /** The units within the column */
17
+ units: ExtUnit[];
18
+ /** The rendered width of the column, in pixels */
19
+ width: number;
20
+ /** The column's name, resolved from column metadata when available */
21
+ columnName?: string | null;
22
+ }
4
23
  export interface CorrelationChartProps extends CorrelationChartSettings {
5
24
  data: ColumnData[];
6
25
  columnWidth?: number;
@@ -10,6 +29,18 @@ export interface CorrelationChartProps extends CorrelationChartSettings {
10
29
  selectedUnit?: number | null;
11
30
  showUnitPopover?: boolean;
12
31
  unitComponent?: any;
32
+ /** Arbitrary content (e.g. column title and/or ID) rendered above each column */
33
+ columnHeaderComponent?: React.ComponentType<ColumnHeaderProps>;
34
+ /** Content rendered above the timescale axis (top-left), beside the column
35
+ * headers — e.g. a zoom/filter indicator. */
36
+ axisTopContent?: React.ReactNode;
13
37
  onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;
38
+ /** Called when a timescale interval is clicked (e.g. to zoom the age range) */
39
+ onClickTimescaleInterval?: TimescaleClickHandler;
40
+ /** Called when the pointer enters/leaves a column (header or body). Passes
41
+ * the column ID, or null on leave. */
42
+ onColumnMouseOver?: (columnID: number | null) => void;
43
+ /** Called when a column header is clicked (e.g. to frame it on a map) */
44
+ onColumnClick?: (columnID: number) => void;
14
45
  }
15
- export declare function CorrelationChart({ data, columnSpacing, columnWidth, unconformityLabels, showUnitPopover, selectedUnit, onUnitSelected, unitComponent, ...scaleProps }: CorrelationChartProps): import('react').FunctionComponentElement<import('..').ColumnContainerProps> | null;
46
+ export declare function CorrelationChart({ data, columnSpacing, columnWidth, unconformityLabels, showUnitPopover, selectedUnit, onUnitSelected, unitComponent, columnHeaderComponent, axisTopContent, onClickTimescaleInterval, onColumnMouseOver, onColumnClick, ...scaleProps }: CorrelationChartProps): import('react').FunctionComponentElement<import('..').ColumnContainerProps> | null;
@@ -1,5 +1,4 @@
1
- import h$1 from "@macrostrat/hyper";
2
- import h$2 from "./main.module.sass.js";
1
+ import h from "./main.module.sass.js";
3
2
  import { useMemo } from "react";
4
3
  import { useInDarkMode } from "@macrostrat/ui-components";
5
4
  import { CompositeTimescaleCore } from "../section.js";
@@ -10,11 +9,12 @@ import { SVG, ColumnProvider, ColumnAxisType } from "@macrostrat/column-componen
10
9
  import { ColoredUnitComponent } from "../units/index.js";
11
10
  import { UnitBoxes } from "../units/boxes.js";
12
11
  import { ColumnContainer } from "../column.js";
12
+ import { useMacrostratColumnInfo } from "@macrostrat/data-provider";
13
13
  import { UnitSelectionProvider } from "../data-provider/store.js";
14
14
  import { UnitDetailsFeature } from "../unit-details/panel.js";
15
15
  import { UnitSelectionPopover } from "../unit-details/popover.js";
16
16
  import { UnitKeyboardNavigation, useUnitSelectionDispatch, useColumnRef } from "../data-provider/unit-selection.js";
17
- const h = h$1.styled(h$2);
17
+ const chartPaddingH = 4;
18
18
  function MainChartArea({ children }) {
19
19
  const columnRef = useColumnRef();
20
20
  return h("div.main-chart", { ref: columnRef }, children);
@@ -34,6 +34,11 @@ function CorrelationChart({
34
34
  selectedUnit,
35
35
  onUnitSelected,
36
36
  unitComponent,
37
+ columnHeaderComponent,
38
+ axisTopContent,
39
+ onClickTimescaleInterval,
40
+ onColumnMouseOver,
41
+ onColumnClick,
37
42
  ...scaleProps
38
43
  }) {
39
44
  const defaultScaleProps = {
@@ -69,9 +74,9 @@ function CorrelationChart({
69
74
  { selectedUnit, onUnitSelected, units },
70
75
  h(ChartArea, [
71
76
  h(TimescaleColumn, {
72
- key: "timescale",
73
77
  scaleInfo,
74
- unconformityLabels
78
+ unconformityLabels,
79
+ onClickInterval: onClickTimescaleInterval
75
80
  }),
76
81
  h(MainChartArea, [
77
82
  h(
@@ -80,7 +85,7 @@ function CorrelationChart({
80
85
  className,
81
86
  innerWidth: mainWidth,
82
87
  height: scaleInfo.totalHeight,
83
- paddingH: 4
88
+ paddingH: chartPaddingH
84
89
  },
85
90
  packages.map((pkg, i) => {
86
91
  const { offset, domain, pixelScale, scale, key } = scaleInfo.packages[i];
@@ -93,7 +98,8 @@ function CorrelationChart({
93
98
  domain,
94
99
  pixelScale,
95
100
  scale,
96
- unitComponent
101
+ unitComponent,
102
+ onColumnMouseOver
97
103
  });
98
104
  })
99
105
  ),
@@ -102,7 +108,18 @@ function CorrelationChart({
102
108
  }),
103
109
  // Navigation only works within a column for now...
104
110
  h(UnitKeyboardNavigation, { columnData: data })
105
- ])
111
+ ]),
112
+ // Rendered last so the sticky header paints above the unit boxes
113
+ // (positioned siblings paint in document order at the same z-index)
114
+ h(ColumnHeaderRow, {
115
+ data,
116
+ columnWidth,
117
+ columnSpacing,
118
+ columnHeaderComponent,
119
+ axisTopContent,
120
+ onColumnMouseOver,
121
+ onColumnClick
122
+ })
106
123
  ])
107
124
  )
108
125
  );
@@ -115,7 +132,8 @@ function Package({
115
132
  offset,
116
133
  domain,
117
134
  pixelScale,
118
- scale
135
+ scale,
136
+ onColumnMouseOver
119
137
  }) {
120
138
  return h("g.package", { transform: `translate(0 ${offset})` }, [
121
139
  // Disable the SVG overlay for now
@@ -124,13 +142,15 @@ function Package({
124
142
  columnData.map((data, i) => {
125
143
  return h(Column, {
126
144
  units: data.units,
145
+ columnID: data.columnID,
127
146
  unitComponent,
128
147
  width: columnWidth,
129
148
  key: i,
130
149
  domain,
131
150
  pixelScale,
132
151
  scale,
133
- offsetLeft: i * (columnWidth + columnSpacing)
152
+ offsetLeft: i * (columnWidth + columnSpacing),
153
+ onColumnMouseOver
134
154
  });
135
155
  })
136
156
  ])
@@ -139,21 +159,28 @@ function Package({
139
159
  function Column(props) {
140
160
  const {
141
161
  units,
162
+ columnID,
142
163
  width = 150,
143
164
  offsetLeft,
144
165
  domain,
145
166
  pixelScale,
146
167
  scale,
147
- unitComponent = ColoredUnitComponent
168
+ unitComponent = ColoredUnitComponent,
169
+ onColumnMouseOver
148
170
  } = props;
149
171
  const columnWidth = width;
150
172
  if (units.length == 0) {
151
173
  return null;
152
174
  }
175
+ const hoverHandlers = onColumnMouseOver != null && columnID != null ? {
176
+ onMouseEnter: () => onColumnMouseOver(columnID),
177
+ onMouseLeave: () => onColumnMouseOver(null)
178
+ } : {};
153
179
  return h(
154
180
  "g.section",
155
181
  {
156
- transform: `translate(${offsetLeft} 0)`
182
+ transform: `translate(${offsetLeft} 0)`,
183
+ ...hoverHandlers
157
184
  },
158
185
  h(
159
186
  ColumnProvider,
@@ -169,7 +196,6 @@ function Column(props) {
169
196
  h(UnitBoxes, {
170
197
  unitComponent,
171
198
  unitComponentProps: {
172
- nColumns: 2,
173
199
  width: columnWidth,
174
200
  showLabel: true
175
201
  }
@@ -189,11 +215,88 @@ function ChartArea({ children }) {
189
215
  children
190
216
  );
191
217
  }
218
+ function ColumnHeaderRow({
219
+ data,
220
+ columnWidth,
221
+ columnSpacing,
222
+ columnHeaderComponent,
223
+ axisTopContent,
224
+ onColumnMouseOver,
225
+ onColumnClick
226
+ }) {
227
+ const Component = columnHeaderComponent;
228
+ if (Component == null && axisTopContent == null) {
229
+ return null;
230
+ }
231
+ return h([
232
+ h("div.column-header-spacer", axisTopContent),
233
+ h.if(Component != null)(
234
+ "div.column-header-row",
235
+ {
236
+ style: {
237
+ paddingLeft: chartPaddingH,
238
+ paddingRight: chartPaddingH,
239
+ gap: columnSpacing
240
+ }
241
+ },
242
+ data.map((column, i) => {
243
+ return h(ColumnHeaderCell, {
244
+ key: column.columnID ?? i,
245
+ column,
246
+ columnIndex: i,
247
+ columnWidth,
248
+ Component,
249
+ onColumnMouseOver,
250
+ onColumnClick
251
+ });
252
+ })
253
+ )
254
+ ]);
255
+ }
256
+ function ColumnHeaderCell({
257
+ column,
258
+ columnIndex,
259
+ columnWidth,
260
+ Component,
261
+ onColumnMouseOver,
262
+ onColumnClick
263
+ }) {
264
+ const columnID = column.columnID;
265
+ const info = useMacrostratColumnInfo(columnID);
266
+ return h(
267
+ "div.column-header-cell",
268
+ {
269
+ style: {
270
+ width: columnWidth,
271
+ minWidth: columnWidth,
272
+ maxWidth: columnWidth
273
+ },
274
+ onMouseEnter: () => onColumnMouseOver?.(columnID),
275
+ onMouseLeave: () => onColumnMouseOver?.(null),
276
+ onClick: onColumnClick ? (e) => {
277
+ e.stopPropagation();
278
+ onColumnClick(columnID);
279
+ } : void 0
280
+ },
281
+ h(Component, {
282
+ column,
283
+ columnID,
284
+ columnIndex,
285
+ units: column.units,
286
+ width: columnWidth,
287
+ columnName: info?.col_name ?? null
288
+ })
289
+ );
290
+ }
192
291
  function TimescaleColumn(props) {
193
- const { scaleInfo, unconformityLabels = true } = props;
292
+ const { scaleInfo, unconformityLabels = true, onClickInterval } = props;
194
293
  return h("div.column-container.age-axis-container", [
195
294
  h(CompositeAgeAxisCore, { ...scaleInfo }),
196
- h(CompositeTimescaleCore, { ...scaleInfo, unconformityLabels })
295
+ h(CompositeTimescaleCore, {
296
+ ...scaleInfo,
297
+ unconformityLabels,
298
+ onClickInterval
299
+ })
197
300
  ]);
198
301
  }
199
302
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":["../../src/correlation-chart/main.ts"],"sourcesContent":["/** Correlation chart */\nimport {\n UnitSelectionProvider,\n UnitKeyboardNavigation,\n useUnitSelectionDispatch,\n useColumnRef,\n} from \"../data-provider\";\nimport { UnitDetailsFeature, UnitSelectionPopover } from \"../unit-details\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useMemo } from \"react\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { CompositeTimescaleCore } from \"../section\";\nimport classNames from \"classnames\";\nimport {\n findLaterallyExtensiveUnits,\n splitStratIntoBoxes,\n UnitGroupBox,\n CorrelationChartSettings,\n buildCorrelationChartData,\n} from \"./prepare-data\";\nimport {\n CompositeAgeAxisCore,\n CompositeStratigraphicScaleInfo,\n} from \"../age-axis\";\nimport {\n ColumnAxisType,\n ColumnProvider,\n SVG,\n} from \"@macrostrat/column-components\";\nimport { ColoredUnitComponent } from \"../units\";\nimport { UnitBoxes } from \"../units/boxes\";\nimport { ColumnContainer } from \"../column\";\nimport { ColumnData } from \"../data-provider\";\nimport { BaseUnit } from \"@macrostrat/api-types\";\nimport { ScaleContinuousNumeric } from \"d3-scale\";\nimport { ExtUnit } from \"../prepare-units/types\";\n\nconst h = hyper.styled(styles);\n\nexport interface CorrelationChartProps extends CorrelationChartSettings {\n data: ColumnData[];\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n unconformityLabels?: boolean;\n selectedUnit?: number | null;\n showUnitPopover?: boolean;\n unitComponent?: any;\n onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;\n}\n\nfunction MainChartArea({ children }) {\n const columnRef = useColumnRef();\n return h(\"div.main-chart\", { ref: columnRef }, children);\n}\n\nconst unitPopoverFeatures = new Set([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.DepthRange,\n UnitDetailsFeature.ColumnName,\n]);\n\nexport function CorrelationChart({\n data,\n columnSpacing = 0,\n columnWidth = 130,\n unconformityLabels = true,\n showUnitPopover = true,\n selectedUnit,\n onUnitSelected,\n unitComponent,\n ...scaleProps\n}: CorrelationChartProps) {\n const defaultScaleProps = {\n targetUnitHeight: 10,\n unconformityHeight: 60,\n minSectionHeight: 60,\n collapseSmallUnconformities: true,\n };\n\n const chartData = useMemo(() => {\n if (!data) return null;\n return buildCorrelationChartData(data, {\n ...defaultScaleProps,\n ...scaleProps,\n });\n }, [data, ...Object.values(scaleProps)]);\n\n // A flattened units array is used to support keyboard navigation\n const units = useMemo(() => {\n return data?.map((d0) => d0.units).flat() ?? [];\n }, [data]);\n\n const inDarkMode = useInDarkMode();\n\n const className = classNames({\n \"dark-mode\": inDarkMode,\n });\n\n if (chartData == null) {\n return null;\n }\n\n const { packages, scaleInfo, nColumns } = chartData;\n\n const mainWidth = (columnWidth + columnSpacing) * nColumns;\n\n return h(\n ColumnContainer,\n { className: \"correlation-diagram\" },\n h(\n UnitSelectionProvider,\n { selectedUnit, onUnitSelected, units },\n h(ChartArea, [\n h(TimescaleColumn, {\n key: \"timescale\",\n scaleInfo,\n unconformityLabels,\n }),\n h(MainChartArea, [\n h(\n SVG,\n {\n className,\n innerWidth: mainWidth,\n height: scaleInfo.totalHeight,\n paddingH: 4,\n },\n packages.map((pkg, i) => {\n const { offset, domain, pixelScale, scale, key } =\n scaleInfo.packages[i];\n return h(Package, {\n columnData: pkg.columnData,\n key,\n columnWidth,\n columnSpacing,\n offset,\n domain,\n pixelScale,\n scale,\n unitComponent,\n });\n }),\n ),\n h.if(showUnitPopover)(UnitSelectionPopover, {\n features: unitPopoverFeatures,\n }),\n // Navigation only works within a column for now...\n h(UnitKeyboardNavigation, { columnData: data }),\n ]),\n ]),\n ),\n );\n}\n\nfunction Package({\n columnData,\n columnSpacing,\n columnWidth,\n unitComponent,\n offset,\n domain,\n pixelScale,\n scale,\n}) {\n return h(\"g.package\", { transform: `translate(0 ${offset})` }, [\n // Disable the SVG overlay for now\n //h(PackageSVGOverlay, { columnData, columnSpacing }),\n h(\"g.column-units\", [\n columnData.map((data, i) => {\n return h(Column, {\n units: data.units,\n unitComponent,\n width: columnWidth,\n key: i,\n domain,\n pixelScale,\n scale,\n offsetLeft: i * (columnWidth + columnSpacing),\n });\n }),\n ]),\n ]);\n}\n\ninterface ColumnProps {\n units: ExtUnit[];\n unitComponent?: React.FunctionComponent<any>;\n unitComponentProps?: any;\n showLabels?: boolean;\n width?: number;\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n offsetLeft?: number;\n domain: [number, number];\n pixelScale: number;\n scale?: ScaleContinuousNumeric<number, number>;\n}\n\nfunction Column(props: ColumnProps) {\n const {\n units,\n width = 150,\n offsetLeft,\n domain,\n pixelScale,\n scale,\n unitComponent = ColoredUnitComponent,\n } = props;\n\n const columnWidth = width;\n\n if (units.length == 0) {\n return null;\n }\n\n return h(\n \"g.section\",\n {\n transform: `translate(${offsetLeft} 0)`,\n },\n h(\n ColumnProvider,\n {\n // Need to tighten up types here...\n divisions: units as any[],\n range: domain,\n scale,\n pixelsPerMeter: pixelScale, // Actually pixels per myr\n axisType: ColumnAxisType.AGE,\n },\n h(UnitBoxes, {\n unitComponent,\n unitComponentProps: {\n nColumns: 2,\n width: columnWidth,\n showLabel: true,\n },\n }),\n ),\n );\n}\n\nfunction PackageSVGOverlay({ data, columnWidth = 100, columnSpacing = 0 }) {\n const { b_age, t_age, bestPixelScale, columnData } = data;\n\n const width = (columnWidth + columnSpacing) * columnData.length;\n const height = Math.ceil((b_age - t_age) * bestPixelScale) + 2;\n\n const extensiveUnits = findLaterallyExtensiveUnits(data);\n\n const scale = (val: number) => {\n return (val - t_age) * bestPixelScale;\n };\n\n return h(\n \"div.package-overlay\",\n { style: { width, height } },\n extensiveUnits.map((d) => {\n return h(LaterallyExtensiveUnit, {\n data: d,\n scale,\n pixelScale: bestPixelScale,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction LaterallyExtensiveUnit({ data, scale, pixelScale, columnSpacing }) {\n const { b_age, t_age, strat_name_long, units } = data;\n // Build boxes by column groups\n const boxes: UnitGroupBox[] = splitStratIntoBoxes(data);\n\n return h(\n \"div.laterally-extensive-unit\",\n boxes.map((d, i) => {\n return h(StratColSpan, {\n scale,\n data: d,\n pixelScale,\n key: i,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction StratColSpan({\n data,\n scale,\n columnWidth = 100,\n columnSpacing = 0,\n pixelScale = 1,\n}) {\n const { startCol, endCol, strat_name_long, t_age, b_age } = data;\n const top = scale(t_age);\n const left = startCol * (columnWidth + columnSpacing);\n const width = (endCol - startCol + 1) * (columnWidth + columnSpacing);\n const height = (b_age - t_age) * pixelScale;\n return h(\n \"div.strat-col-span\",\n { style: { top, height, width, left } },\n strat_name_long,\n );\n}\n\nfunction ChartArea({ children }) {\n const setSelectedUnit = useUnitSelectionDispatch();\n\n return h(\n \"div.correlation-chart-inner\",\n {\n onClick() {\n setSelectedUnit(null, null);\n },\n },\n children,\n );\n}\n\ninterface TimescaleColumnProps {\n scaleInfo: CompositeStratigraphicScaleInfo;\n showLabels?: boolean;\n unconformityLabels?: boolean;\n}\n\nfunction TimescaleColumn(props: TimescaleColumnProps) {\n const { scaleInfo, unconformityLabels = true } = props;\n return h(\"div.column-container.age-axis-container\", [\n h(CompositeAgeAxisCore, { ...scaleInfo }),\n h(CompositeTimescaleCore, { ...scaleInfo, unconformityLabels }),\n ]);\n}\n"],"names":["hyper","styles"],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sources":["../../src/correlation-chart/main.ts"],"sourcesContent":["/** Correlation chart */\nimport {\n UnitSelectionProvider,\n UnitKeyboardNavigation,\n useUnitSelectionDispatch,\n useColumnRef,\n} from \"../data-provider\";\nimport { UnitDetailsFeature, UnitSelectionPopover } from \"../unit-details\";\nimport h from \"./main.module.sass\";\nimport { useMemo } from \"react\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { CompositeTimescaleCore } from \"../section\";\nimport classNames from \"classnames\";\nimport {\n findLaterallyExtensiveUnits,\n splitStratIntoBoxes,\n UnitGroupBox,\n CorrelationChartSettings,\n buildCorrelationChartData,\n} from \"./prepare-data\";\nimport {\n CompositeAgeAxisCore,\n CompositeStratigraphicScaleInfo,\n} from \"../age-axis\";\nimport {\n ColumnAxisType,\n ColumnProvider,\n SVG,\n} from \"@macrostrat/column-components\";\nimport { ColoredUnitComponent } from \"../units\";\nimport { UnitBoxes } from \"../units/boxes\";\nimport { ColumnContainer } from \"../column\";\nimport type { ColumnData } from \"@macrostrat/data-provider\";\nimport { BaseUnit } from \"@macrostrat/api-types\";\nimport { ScaleContinuousNumeric } from \"d3-scale\";\nimport { ExtUnit } from \"../prepare-units/types\";\nimport type { TimescaleClickHandler } from \"@macrostrat/timescale\";\nimport { useMacrostratColumnInfo } from \"@macrostrat/data-provider\";\n\n/** Standard props passed to a `columnHeaderComponent`. Everything a header\n * needs is provided here, so the component can be a pure function of its props\n * (no hooks required). Column-level hover/click are handled by the chart. */\nexport interface ColumnHeaderProps {\n /** The column data (units + identifier) for this column */\n column: ColumnData;\n /** The column's ID (col_id) */\n columnID: number;\n /** The column's index (left-to-right) within the chart */\n columnIndex: number;\n /** The units within the column */\n units: ExtUnit[];\n /** The rendered width of the column, in pixels */\n width: number;\n /** The column's name, resolved from column metadata when available */\n columnName?: string | null;\n}\n\nexport interface CorrelationChartProps extends CorrelationChartSettings {\n data: ColumnData[];\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n unconformityLabels?: boolean;\n selectedUnit?: number | null;\n showUnitPopover?: boolean;\n unitComponent?: any;\n /** Arbitrary content (e.g. column title and/or ID) rendered above each column */\n columnHeaderComponent?: React.ComponentType<ColumnHeaderProps>;\n /** Content rendered above the timescale axis (top-left), beside the column\n * headers — e.g. a zoom/filter indicator. */\n axisTopContent?: React.ReactNode;\n onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;\n /** Called when a timescale interval is clicked (e.g. to zoom the age range) */\n onClickTimescaleInterval?: TimescaleClickHandler;\n /** Called when the pointer enters/leaves a column (header or body). Passes\n * the column ID, or null on leave. */\n onColumnMouseOver?: (columnID: number | null) => void;\n /** Called when a column header is clicked (e.g. to frame it on a map) */\n onColumnClick?: (columnID: number) => void;\n}\n\n/** Horizontal padding of the main chart SVG. Column headers are aligned to\n * this so that they line up with the columns beneath them. */\nconst chartPaddingH = 4;\n\nfunction MainChartArea({ children }) {\n const columnRef = useColumnRef();\n return h(\"div.main-chart\", { ref: columnRef }, children);\n}\n\nconst unitPopoverFeatures = new Set([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.DepthRange,\n UnitDetailsFeature.ColumnName,\n]);\n\nexport function CorrelationChart({\n data,\n columnSpacing = 0,\n columnWidth = 130,\n unconformityLabels = true,\n showUnitPopover = true,\n selectedUnit,\n onUnitSelected,\n unitComponent,\n columnHeaderComponent,\n axisTopContent,\n onClickTimescaleInterval,\n onColumnMouseOver,\n onColumnClick,\n ...scaleProps\n}: CorrelationChartProps) {\n const defaultScaleProps = {\n targetUnitHeight: 10,\n unconformityHeight: 60,\n minSectionHeight: 60,\n collapseSmallUnconformities: true,\n };\n\n const chartData = useMemo(() => {\n if (!data) return null;\n return buildCorrelationChartData(data, {\n ...defaultScaleProps,\n ...scaleProps,\n });\n }, [data, ...Object.values(scaleProps)]);\n\n // A flattened units array is used to support keyboard navigation\n const units = useMemo(() => {\n return data?.map((d0) => d0.units).flat() ?? [];\n }, [data]);\n\n const inDarkMode = useInDarkMode();\n\n const className = classNames({\n \"dark-mode\": inDarkMode,\n });\n\n if (chartData == null) {\n return null;\n }\n\n const { packages, scaleInfo, nColumns } = chartData;\n\n const mainWidth = (columnWidth + columnSpacing) * nColumns;\n\n return h(\n ColumnContainer,\n { className: \"correlation-diagram\" },\n h(\n UnitSelectionProvider,\n { selectedUnit, onUnitSelected, units },\n h(ChartArea, [\n h(TimescaleColumn, {\n scaleInfo,\n unconformityLabels,\n onClickInterval: onClickTimescaleInterval,\n }),\n h(MainChartArea, [\n h(\n SVG,\n {\n className,\n innerWidth: mainWidth,\n height: scaleInfo.totalHeight,\n paddingH: chartPaddingH,\n },\n packages.map((pkg, i) => {\n const { offset, domain, pixelScale, scale, key } =\n scaleInfo.packages[i];\n return h(Package, {\n columnData: pkg.columnData,\n key,\n columnWidth,\n columnSpacing,\n offset,\n domain,\n pixelScale,\n scale,\n unitComponent,\n onColumnMouseOver,\n });\n }),\n ),\n h.if(showUnitPopover)(UnitSelectionPopover, {\n features: unitPopoverFeatures,\n }),\n // Navigation only works within a column for now...\n h(UnitKeyboardNavigation, { columnData: data }),\n ]),\n // Rendered last so the sticky header paints above the unit boxes\n // (positioned siblings paint in document order at the same z-index)\n h(ColumnHeaderRow, {\n data,\n columnWidth,\n columnSpacing,\n columnHeaderComponent,\n axisTopContent,\n onColumnMouseOver,\n onColumnClick,\n }),\n ]),\n ),\n );\n}\n\nfunction Package({\n columnData,\n columnSpacing,\n columnWidth,\n unitComponent,\n offset,\n domain,\n pixelScale,\n scale,\n onColumnMouseOver,\n}) {\n return h(\"g.package\", { transform: `translate(0 ${offset})` }, [\n // Disable the SVG overlay for now\n //h(PackageSVGOverlay, { columnData, columnSpacing }),\n h(\"g.column-units\", [\n columnData.map((data, i) => {\n return h(Column, {\n units: data.units,\n columnID: data.columnID,\n unitComponent,\n width: columnWidth,\n key: i,\n domain,\n pixelScale,\n scale,\n offsetLeft: i * (columnWidth + columnSpacing),\n onColumnMouseOver,\n });\n }),\n ]),\n ]);\n}\n\ninterface ColumnProps {\n units: ExtUnit[];\n columnID?: number;\n unitComponent?: React.FunctionComponent<any>;\n unitComponentProps?: any;\n showLabels?: boolean;\n width?: number;\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n offsetLeft?: number;\n domain: [number, number];\n pixelScale: number;\n scale?: ScaleContinuousNumeric<number, number>;\n onColumnMouseOver?: (columnID: number | null) => void;\n}\n\nfunction Column(props: ColumnProps) {\n const {\n units,\n columnID,\n width = 150,\n offsetLeft,\n domain,\n pixelScale,\n scale,\n unitComponent = ColoredUnitComponent,\n onColumnMouseOver,\n } = props;\n\n const columnWidth = width;\n\n if (units.length == 0) {\n return null;\n }\n\n const hoverHandlers =\n onColumnMouseOver != null && columnID != null\n ? {\n onMouseEnter: () => onColumnMouseOver(columnID),\n onMouseLeave: () => onColumnMouseOver(null),\n }\n : {};\n\n return h(\n \"g.section\",\n {\n transform: `translate(${offsetLeft} 0)`,\n ...hoverHandlers,\n },\n h(\n ColumnProvider,\n {\n // Need to tighten up types here...\n divisions: units as any[],\n range: domain,\n scale,\n pixelsPerMeter: pixelScale, // Actually pixels per myr\n axisType: ColumnAxisType.AGE,\n },\n h(UnitBoxes, {\n unitComponent,\n unitComponentProps: {\n width: columnWidth,\n showLabel: true,\n },\n }),\n ),\n );\n}\n\nfunction PackageSVGOverlay({ data, columnWidth = 100, columnSpacing = 0 }) {\n const { b_age, t_age, bestPixelScale, columnData } = data;\n\n const width = (columnWidth + columnSpacing) * columnData.length;\n const height = Math.ceil((b_age - t_age) * bestPixelScale) + 2;\n\n const extensiveUnits = findLaterallyExtensiveUnits(data);\n\n const scale = (val: number) => {\n return (val - t_age) * bestPixelScale;\n };\n\n return h(\n \"div.package-overlay\",\n { style: { width, height } },\n extensiveUnits.map((d) => {\n return h(LaterallyExtensiveUnit, {\n data: d,\n scale,\n pixelScale: bestPixelScale,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction LaterallyExtensiveUnit({ data, scale, pixelScale, columnSpacing }) {\n const { b_age, t_age, strat_name_long, units } = data;\n // Build boxes by column groups\n const boxes: UnitGroupBox[] = splitStratIntoBoxes(data);\n\n return h(\n \"div.laterally-extensive-unit\",\n boxes.map((d, i) => {\n return h(StratColSpan, {\n scale,\n data: d,\n pixelScale,\n key: i,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction StratColSpan({\n data,\n scale,\n columnWidth = 100,\n columnSpacing = 0,\n pixelScale = 1,\n}) {\n const { startCol, endCol, strat_name_long, t_age, b_age } = data;\n const top = scale(t_age);\n const left = startCol * (columnWidth + columnSpacing);\n const width = (endCol - startCol + 1) * (columnWidth + columnSpacing);\n const height = (b_age - t_age) * pixelScale;\n return h(\n \"div.strat-col-span\",\n { style: { top, height, width, left } },\n strat_name_long,\n );\n}\n\nfunction ChartArea({ children }) {\n const setSelectedUnit = useUnitSelectionDispatch();\n\n return h(\n \"div.correlation-chart-inner\",\n {\n onClick() {\n setSelectedUnit(null, null);\n },\n },\n children,\n );\n}\n\ninterface ColumnHeaderRowProps {\n data: ColumnData[];\n columnWidth: number;\n columnSpacing: number;\n columnHeaderComponent?: React.ComponentType<ColumnHeaderProps>;\n axisTopContent?: React.ReactNode;\n onColumnMouseOver?: (columnID: number | null) => void;\n onColumnClick?: (columnID: number) => void;\n}\n\nfunction ColumnHeaderRow({\n data,\n columnWidth,\n columnSpacing,\n columnHeaderComponent,\n axisTopContent,\n onColumnMouseOver,\n onColumnClick,\n}: ColumnHeaderRowProps) {\n /** The top grid row: arbitrary content above the timescale axis (top-left)\n * and, when a header component is provided, per-column headers aligned with\n * the columns. Collapses to nothing when neither is present. */\n const Component = columnHeaderComponent;\n if (Component == null && axisTopContent == null) {\n return null;\n }\n\n return h([\n h(\"div.column-header-spacer\", axisTopContent),\n h.if(Component != null)(\n \"div.column-header-row\",\n {\n style: {\n paddingLeft: chartPaddingH,\n paddingRight: chartPaddingH,\n gap: columnSpacing,\n },\n },\n data.map((column, i) => {\n return h(ColumnHeaderCell, {\n key: column.columnID ?? i,\n column,\n columnIndex: i,\n columnWidth,\n Component: Component!,\n onColumnMouseOver,\n onColumnClick,\n });\n }),\n ),\n ]);\n}\n\nfunction ColumnHeaderCell({\n column,\n columnIndex,\n columnWidth,\n Component,\n onColumnMouseOver,\n onColumnClick,\n}: {\n column: ColumnData;\n columnIndex: number;\n columnWidth: number;\n Component: React.ComponentType<ColumnHeaderProps>;\n onColumnMouseOver?: (columnID: number | null) => void;\n onColumnClick?: (columnID: number) => void;\n}) {\n /** Resolves the column name and wires column-level hover/click so the header\n * component itself can stay a pure function of props. */\n const columnID = column.columnID;\n const info = useMacrostratColumnInfo(columnID);\n\n return h(\n \"div.column-header-cell\",\n {\n style: {\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n },\n onMouseEnter: () => onColumnMouseOver?.(columnID),\n onMouseLeave: () => onColumnMouseOver?.(null),\n onClick: onColumnClick\n ? (e: React.MouseEvent) => {\n e.stopPropagation();\n onColumnClick(columnID);\n }\n : undefined,\n },\n h(Component, {\n column,\n columnID,\n columnIndex,\n units: column.units as ExtUnit[],\n width: columnWidth,\n columnName: info?.col_name ?? null,\n }),\n );\n}\n\ninterface TimescaleColumnProps {\n scaleInfo: CompositeStratigraphicScaleInfo;\n showLabels?: boolean;\n unconformityLabels?: boolean;\n onClickInterval?: TimescaleClickHandler;\n}\n\nfunction TimescaleColumn(props: TimescaleColumnProps) {\n const { scaleInfo, unconformityLabels = true, onClickInterval } = props;\n return h(\"div.column-container.age-axis-container\", [\n h(CompositeAgeAxisCore, { ...scaleInfo }),\n h(CompositeTimescaleCore, {\n ...scaleInfo,\n unconformityLabels,\n onClickInterval,\n }),\n ]);\n}\n"],"names":[],"mappings":"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"}
@@ -3,28 +3,31 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const h$1 = require("@macrostrat/hyper");
4
4
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
5
5
  const h__default = /* @__PURE__ */ _interopDefault(h$1);
6
- const assistant = "_assistant_jnc7r_26";
6
+ const assistant = "_assistant_17ryg_26";
7
7
  const styles = {
8
- "page-header": "_page-header_jnc7r_1",
9
- "diagram-container": "_diagram-container_jnc7r_8",
10
- "map-inset": "_map-inset_jnc7r_14",
11
- "column-selection-map": "_column-selection-map_jnc7r_14",
12
- "map-expanded": "_map-expanded_jnc7r_22",
8
+ "page-header": "_page-header_17ryg_1",
9
+ "diagram-container": "_diagram-container_17ryg_8",
10
+ "map-inset": "_map-inset_17ryg_14",
11
+ "column-selection-map": "_column-selection-map_17ryg_14",
12
+ "map-expanded": "_map-expanded_17ryg_22",
13
13
  assistant,
14
- "unit-details-panel": "_unit-details-panel_jnc7r_31",
15
- "main-area": "_main-area_jnc7r_31",
16
- "correlation-map": "_correlation-map_jnc7r_46",
17
- "correlation-diagram": "_correlation-diagram_jnc7r_68",
18
- "package": "_package_jnc7r_76",
19
- "package-overlay": "_package-overlay_jnc7r_79",
20
- "laterally-extensive-unit": "_laterally-extensive-unit_jnc7r_85",
21
- "strat-col-span": "_strat-col-span_jnc7r_85",
22
- "column-container": "_column-container_jnc7r_89",
23
- "map-expanded-button": "_map-expanded-button_jnc7r_94",
24
- "main-panel": "_main-panel_jnc7r_101",
25
- "main-chart": "_main-chart_jnc7r_108",
26
- "correlation-chart-inner": "_correlation-chart-inner_jnc7r_112",
27
- "age-axis-container": "_age-axis-container_jnc7r_118"
14
+ "unit-details-panel": "_unit-details-panel_17ryg_31",
15
+ "main-area": "_main-area_17ryg_31",
16
+ "correlation-map": "_correlation-map_17ryg_46",
17
+ "correlation-diagram": "_correlation-diagram_17ryg_68",
18
+ "package": "_package_17ryg_76",
19
+ "package-overlay": "_package-overlay_17ryg_79",
20
+ "laterally-extensive-unit": "_laterally-extensive-unit_17ryg_85",
21
+ "strat-col-span": "_strat-col-span_17ryg_85",
22
+ "column-container": "_column-container_17ryg_89",
23
+ "map-expanded-button": "_map-expanded-button_17ryg_94",
24
+ "main-panel": "_main-panel_17ryg_101",
25
+ "main-chart": "_main-chart_17ryg_108",
26
+ "correlation-chart-inner": "_correlation-chart-inner_17ryg_114",
27
+ "age-axis-container": "_age-axis-container_17ryg_122",
28
+ "column-header-spacer": "_column-header-spacer_17ryg_135",
29
+ "column-header-row": "_column-header-row_17ryg_141",
30
+ "column-header-cell": "_column-header-cell_17ryg_152"
28
31
  };
29
32
  let h = h__default.default.styled(styles);
30
33
  Object.assign(h, styles);
@@ -1 +1 @@
1
- {"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,26 +1,29 @@
1
1
  import h$1 from "@macrostrat/hyper";
2
- const assistant = "_assistant_jnc7r_26";
2
+ const assistant = "_assistant_17ryg_26";
3
3
  const styles = {
4
- "page-header": "_page-header_jnc7r_1",
5
- "diagram-container": "_diagram-container_jnc7r_8",
6
- "map-inset": "_map-inset_jnc7r_14",
7
- "column-selection-map": "_column-selection-map_jnc7r_14",
8
- "map-expanded": "_map-expanded_jnc7r_22",
4
+ "page-header": "_page-header_17ryg_1",
5
+ "diagram-container": "_diagram-container_17ryg_8",
6
+ "map-inset": "_map-inset_17ryg_14",
7
+ "column-selection-map": "_column-selection-map_17ryg_14",
8
+ "map-expanded": "_map-expanded_17ryg_22",
9
9
  assistant,
10
- "unit-details-panel": "_unit-details-panel_jnc7r_31",
11
- "main-area": "_main-area_jnc7r_31",
12
- "correlation-map": "_correlation-map_jnc7r_46",
13
- "correlation-diagram": "_correlation-diagram_jnc7r_68",
14
- "package": "_package_jnc7r_76",
15
- "package-overlay": "_package-overlay_jnc7r_79",
16
- "laterally-extensive-unit": "_laterally-extensive-unit_jnc7r_85",
17
- "strat-col-span": "_strat-col-span_jnc7r_85",
18
- "column-container": "_column-container_jnc7r_89",
19
- "map-expanded-button": "_map-expanded-button_jnc7r_94",
20
- "main-panel": "_main-panel_jnc7r_101",
21
- "main-chart": "_main-chart_jnc7r_108",
22
- "correlation-chart-inner": "_correlation-chart-inner_jnc7r_112",
23
- "age-axis-container": "_age-axis-container_jnc7r_118"
10
+ "unit-details-panel": "_unit-details-panel_17ryg_31",
11
+ "main-area": "_main-area_17ryg_31",
12
+ "correlation-map": "_correlation-map_17ryg_46",
13
+ "correlation-diagram": "_correlation-diagram_17ryg_68",
14
+ "package": "_package_17ryg_76",
15
+ "package-overlay": "_package-overlay_17ryg_79",
16
+ "laterally-extensive-unit": "_laterally-extensive-unit_17ryg_85",
17
+ "strat-col-span": "_strat-col-span_17ryg_85",
18
+ "column-container": "_column-container_17ryg_89",
19
+ "map-expanded-button": "_map-expanded-button_17ryg_94",
20
+ "main-panel": "_main-panel_17ryg_101",
21
+ "main-chart": "_main-chart_17ryg_108",
22
+ "correlation-chart-inner": "_correlation-chart-inner_17ryg_114",
23
+ "age-axis-container": "_age-axis-container_17ryg_122",
24
+ "column-header-spacer": "_column-header-spacer_17ryg_135",
25
+ "column-header-row": "_column-header-row_17ryg_141",
26
+ "column-header-cell": "_column-header-cell_17ryg_152"
24
27
  };
25
28
  let h = h$1.styled(styles);
26
29
  Object.assign(h, styles);
@@ -1 +1 @@
1
- {"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,7 +6,6 @@ require("@macrostrat/stratigraphy-utils");
6
6
  const utils = require("../prepare-units/utils.cjs");
7
7
  const helpers = require("../prepare-units/helpers.cjs");
8
8
  function buildCorrelationChartData(columns, settings) {
9
- console.log(settings);
10
9
  const {
11
10
  mergeSections = utils.MergeSectionsMode.OVERLAPPING,
12
11
  targetUnitHeight,
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-data.cjs","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n console.log(settings);\n const {\n mergeSections = MergeSectionsMode.OVERLAPPING,\n targetUnitHeight,\n ...rest\n } = settings;\n\n const opts: PrepareColumnOptions = {\n axisType: ColumnAxisType.AGE,\n targetUnitHeight,\n mergeSections,\n ...rest,\n };\n\n if (columns.length == 0) {\n return null;\n }\n\n // Flatten the units array to pretend that all units are in the same column\n const _units = columns.map((d) => d.units).flat();\n\n const columnIDs = columns.map((d) => d.columnID);\n\n const preparedUnits = prepareColumnUnits(_units, opts);\n\n const { sections, totalHeight } = preparedUnits;\n\n const scaleInfo: CompositeStratigraphicScaleInfo = {\n axisType: ColumnAxisType.AGE,\n totalHeight,\n packages: sections.map((d) => d.scaleInfo),\n };\n\n const packages = sections.map((d) => {\n return separateColumns(d, columnIDs);\n });\n\n return { scaleInfo, packages, nColumns: columnIDs.length };\n}\n\ninterface UnitGroup {\n b_age: number;\n t_age: number;\n strat_name_id: number;\n strat_name_long: string;\n units: (UnitLong | null)[];\n}\n\nexport interface UnitGroupBox extends UnitGroup {\n units: UnitLong[];\n startCol: number;\n endCol: number;\n}\n\ninterface ColumnExt {\n columnID: number;\n units: UnitLong[];\n}\n\ninterface MultiColumnPackageData {\n columnData: ColumnExt[];\n bestPixelScale?: number;\n b_age: number;\n t_age: number;\n}\n\nexport function findLaterallyExtensiveUnits(\n pkg: MultiColumnPackageData,\n): UnitGroup[] {\n const { columnData, b_age, t_age } = pkg;\n // Group units by strat_name_id\n const unitIndex = new Map<number, Map<number, UnitLong>>();\n for (const column of columnData) {\n const { units } = column;\n for (const unit of units) {\n if (unit.strat_name_id == null) continue;\n if (!unitIndex.has(unit.strat_name_id)) {\n unitIndex.set(unit.strat_name_id, new Map());\n }\n unitIndex.get(unit.strat_name_id).set(column.columnID, unit);\n }\n }\n\n // Prepare grouped units for rendering\n const unitGroups: UnitGroup[] = [];\n for (const [strat_name_id, unitIndex0] of unitIndex) {\n const units = columnData.map((d) => unitIndex0.get(d.columnID) ?? null);\n const filteredUnits = units.filter((d) => d != null);\n const [t_age, b_age] = mergeAgeRanges(\n filteredUnits.map((d) => [d.t_age, d.b_age]),\n );\n if (filteredUnits.length <= 1) continue;\n\n unitGroups.push({\n b_age,\n t_age,\n strat_name_id,\n strat_name_long: filteredUnits[0].strat_name_long,\n units,\n });\n }\n\n return unitGroups;\n}\n\nexport function splitStratIntoBoxes(pkg: UnitGroup): UnitGroupBox[] {\n const { strat_name_long, strat_name_id, units } = pkg;\n const boxes: UnitGroupBox[] = [];\n let currentBox: UnitGroupBox = null;\n for (let i = 0; i < units.length; i++) {\n const unit = units[i];\n if (unit == null) {\n if (currentBox != null) {\n boxes.push(currentBox);\n currentBox = null;\n }\n continue;\n }\n if (currentBox == null) {\n currentBox = {\n startCol: i,\n endCol: i,\n strat_name_id,\n strat_name_long,\n t_age: unit.t_age,\n b_age: unit.b_age,\n units: [],\n };\n } else {\n currentBox.endCol = i;\n }\n currentBox.units.push(unit);\n }\n return boxes;\n}\n\nfunction separateColumns(\n pkg: PackageLayoutData,\n columnIDs: number[],\n): MultiColumnPackageData {\n /** Separate columns by col_id */\n const { units, t_age, b_age } = pkg;\n\n return {\n columnData: columnIDs.map((d) => {\n const u1 = units.filter((unit) => unit.col_id == d);\n u1.sort((a, b) => a.t_age - b.t_age);\n return {\n columnID: d,\n // Ensure that the units correctly show overlap\n units: preprocessUnits(\n {\n ...pkg,\n units: u1,\n },\n ColumnAxisType.AGE,\n ),\n };\n }),\n bestPixelScale: pkg.scaleInfo.pixelScale,\n t_age,\n b_age,\n };\n}\n\nexport function columnGeoJSONRecordToColumnIdentifier(\n col: ColumnGeoJSONRecord,\n): ColumnIdentifier {\n return {\n col_id: col.properties.col_id,\n col_name: col.properties.col_name,\n project_id: col.properties.project_id,\n };\n}\n"],"names":["MergeSectionsMode","ColumnAxisType","prepareColumnUnits","preprocessUnits"],"mappings":";;;;;;;AA0CO,SAAS,0BACd,SACA,UACsB;AACtB,UAAQ,IAAI,QAAQ;AACpB,QAAM;AAAA,IACJ,gBAAgBA,MAAAA,kBAAkB;AAAA,IAClC;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,OAA6B;AAAA,IACjC,UAAUC,iBAAAA,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAA;AAE3C,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE/C,QAAM,gBAAgBC,MAAAA,mBAAmB,QAAQ,IAAI;AAErD,QAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,QAAM,YAA6C;AAAA,IACjD,UAAUD,iBAAAA,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM;AACnC,WAAO,gBAAgB,GAAG,SAAS;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,WAAW,UAAU,UAAU,UAAU,OAAA;AACpD;AAkGA,SAAS,gBACP,KACA,WACwB;AAExB,QAAM,EAAE,OAAO,OAAO,MAAA,IAAU;AAEhC,SAAO;AAAA,IACL,YAAY,UAAU,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAClD,SAAG,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,aAAO;AAAA,QACL,UAAU;AAAA;AAAA,QAEV,OAAOE,QAAAA;AAAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,UAAA;AAAA,UAETF,gCAAe;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAgB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA;AAEJ;;"}
1
+ {"version":3,"file":"prepare-data.cjs","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n const {\n mergeSections = MergeSectionsMode.OVERLAPPING,\n targetUnitHeight,\n ...rest\n } = settings;\n\n const opts: PrepareColumnOptions = {\n axisType: ColumnAxisType.AGE,\n targetUnitHeight,\n mergeSections,\n ...rest,\n };\n\n if (columns.length == 0) {\n return null;\n }\n\n // Flatten the units array to pretend that all units are in the same column\n const _units = columns.map((d) => d.units).flat();\n\n const columnIDs = columns.map((d) => d.columnID);\n\n const preparedUnits = prepareColumnUnits(_units, opts);\n\n const { sections, totalHeight } = preparedUnits;\n\n const scaleInfo: CompositeStratigraphicScaleInfo = {\n axisType: ColumnAxisType.AGE,\n totalHeight,\n packages: sections.map((d) => d.scaleInfo),\n };\n\n const packages = sections.map((d) => {\n return separateColumns(d, columnIDs);\n });\n\n return { scaleInfo, packages, nColumns: columnIDs.length };\n}\n\ninterface UnitGroup {\n b_age: number;\n t_age: number;\n strat_name_id: number;\n strat_name_long: string;\n units: (UnitLong | null)[];\n}\n\nexport interface UnitGroupBox extends UnitGroup {\n units: UnitLong[];\n startCol: number;\n endCol: number;\n}\n\ninterface ColumnExt {\n columnID: number;\n units: UnitLong[];\n}\n\ninterface MultiColumnPackageData {\n columnData: ColumnExt[];\n bestPixelScale?: number;\n b_age: number;\n t_age: number;\n}\n\nexport function findLaterallyExtensiveUnits(\n pkg: MultiColumnPackageData,\n): UnitGroup[] {\n const { columnData, b_age, t_age } = pkg;\n // Group units by strat_name_id\n const unitIndex = new Map<number, Map<number, UnitLong>>();\n for (const column of columnData) {\n const { units } = column;\n for (const unit of units) {\n if (unit.strat_name_id == null) continue;\n if (!unitIndex.has(unit.strat_name_id)) {\n unitIndex.set(unit.strat_name_id, new Map());\n }\n unitIndex.get(unit.strat_name_id).set(column.columnID, unit);\n }\n }\n\n // Prepare grouped units for rendering\n const unitGroups: UnitGroup[] = [];\n for (const [strat_name_id, unitIndex0] of unitIndex) {\n const units = columnData.map((d) => unitIndex0.get(d.columnID) ?? null);\n const filteredUnits = units.filter((d) => d != null);\n const [t_age, b_age] = mergeAgeRanges(\n filteredUnits.map((d) => [d.t_age, d.b_age]),\n );\n if (filteredUnits.length <= 1) continue;\n\n unitGroups.push({\n b_age,\n t_age,\n strat_name_id,\n strat_name_long: filteredUnits[0].strat_name_long,\n units,\n });\n }\n\n return unitGroups;\n}\n\nexport function splitStratIntoBoxes(pkg: UnitGroup): UnitGroupBox[] {\n const { strat_name_long, strat_name_id, units } = pkg;\n const boxes: UnitGroupBox[] = [];\n let currentBox: UnitGroupBox = null;\n for (let i = 0; i < units.length; i++) {\n const unit = units[i];\n if (unit == null) {\n if (currentBox != null) {\n boxes.push(currentBox);\n currentBox = null;\n }\n continue;\n }\n if (currentBox == null) {\n currentBox = {\n startCol: i,\n endCol: i,\n strat_name_id,\n strat_name_long,\n t_age: unit.t_age,\n b_age: unit.b_age,\n units: [],\n };\n } else {\n currentBox.endCol = i;\n }\n currentBox.units.push(unit);\n }\n return boxes;\n}\n\nfunction separateColumns(\n pkg: PackageLayoutData,\n columnIDs: number[],\n): MultiColumnPackageData {\n /** Separate columns by col_id */\n const { units, t_age, b_age } = pkg;\n\n return {\n columnData: columnIDs.map((d) => {\n const u1 = units.filter((unit) => unit.col_id == d);\n u1.sort((a, b) => a.t_age - b.t_age);\n return {\n columnID: d,\n // Ensure that the units correctly show overlap\n units: preprocessUnits(\n {\n ...pkg,\n units: u1,\n },\n ColumnAxisType.AGE,\n ),\n };\n }),\n bestPixelScale: pkg.scaleInfo.pixelScale,\n t_age,\n b_age,\n };\n}\n\nexport function columnGeoJSONRecordToColumnIdentifier(\n col: ColumnGeoJSONRecord,\n): ColumnIdentifier {\n return {\n col_id: col.properties.col_id,\n col_name: col.properties.col_name,\n project_id: col.properties.project_id,\n };\n}\n"],"names":["MergeSectionsMode","ColumnAxisType","prepareColumnUnits","preprocessUnits"],"mappings":";;;;;;;AA0CO,SAAS,0BACd,SACA,UACsB;AACtB,QAAM;AAAA,IACJ,gBAAgBA,MAAAA,kBAAkB;AAAA,IAClC;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,OAA6B;AAAA,IACjC,UAAUC,iBAAAA,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAA;AAE3C,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE/C,QAAM,gBAAgBC,MAAAA,mBAAmB,QAAQ,IAAI;AAErD,QAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,QAAM,YAA6C;AAAA,IACjD,UAAUD,iBAAAA,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM;AACnC,WAAO,gBAAgB,GAAG,SAAS;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,WAAW,UAAU,UAAU,UAAU,OAAA;AACpD;AAkGA,SAAS,gBACP,KACA,WACwB;AAExB,QAAM,EAAE,OAAO,OAAO,MAAA,IAAU;AAEhC,SAAO;AAAA,IACL,YAAY,UAAU,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAClD,SAAG,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,aAAO;AAAA,QACL,UAAU;AAAA;AAAA,QAEV,OAAOE,QAAAA;AAAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,UAAA;AAAA,UAETF,gCAAe;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAgB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA;AAEJ;;"}
@@ -4,7 +4,6 @@ import "@macrostrat/stratigraphy-utils";
4
4
  import { MergeSectionsMode } from "../prepare-units/utils.js";
5
5
  import { preprocessUnits } from "../prepare-units/helpers.js";
6
6
  function buildCorrelationChartData(columns, settings) {
7
- console.log(settings);
8
7
  const {
9
8
  mergeSections = MergeSectionsMode.OVERLAPPING,
10
9
  targetUnitHeight,
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-data.js","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n console.log(settings);\n const {\n mergeSections = MergeSectionsMode.OVERLAPPING,\n targetUnitHeight,\n ...rest\n } = settings;\n\n const opts: PrepareColumnOptions = {\n axisType: ColumnAxisType.AGE,\n targetUnitHeight,\n mergeSections,\n ...rest,\n };\n\n if (columns.length == 0) {\n return null;\n }\n\n // Flatten the units array to pretend that all units are in the same column\n const _units = columns.map((d) => d.units).flat();\n\n const columnIDs = columns.map((d) => d.columnID);\n\n const preparedUnits = prepareColumnUnits(_units, opts);\n\n const { sections, totalHeight } = preparedUnits;\n\n const scaleInfo: CompositeStratigraphicScaleInfo = {\n axisType: ColumnAxisType.AGE,\n totalHeight,\n packages: sections.map((d) => d.scaleInfo),\n };\n\n const packages = sections.map((d) => {\n return separateColumns(d, columnIDs);\n });\n\n return { scaleInfo, packages, nColumns: columnIDs.length };\n}\n\ninterface UnitGroup {\n b_age: number;\n t_age: number;\n strat_name_id: number;\n strat_name_long: string;\n units: (UnitLong | null)[];\n}\n\nexport interface UnitGroupBox extends UnitGroup {\n units: UnitLong[];\n startCol: number;\n endCol: number;\n}\n\ninterface ColumnExt {\n columnID: number;\n units: UnitLong[];\n}\n\ninterface MultiColumnPackageData {\n columnData: ColumnExt[];\n bestPixelScale?: number;\n b_age: number;\n t_age: number;\n}\n\nexport function findLaterallyExtensiveUnits(\n pkg: MultiColumnPackageData,\n): UnitGroup[] {\n const { columnData, b_age, t_age } = pkg;\n // Group units by strat_name_id\n const unitIndex = new Map<number, Map<number, UnitLong>>();\n for (const column of columnData) {\n const { units } = column;\n for (const unit of units) {\n if (unit.strat_name_id == null) continue;\n if (!unitIndex.has(unit.strat_name_id)) {\n unitIndex.set(unit.strat_name_id, new Map());\n }\n unitIndex.get(unit.strat_name_id).set(column.columnID, unit);\n }\n }\n\n // Prepare grouped units for rendering\n const unitGroups: UnitGroup[] = [];\n for (const [strat_name_id, unitIndex0] of unitIndex) {\n const units = columnData.map((d) => unitIndex0.get(d.columnID) ?? null);\n const filteredUnits = units.filter((d) => d != null);\n const [t_age, b_age] = mergeAgeRanges(\n filteredUnits.map((d) => [d.t_age, d.b_age]),\n );\n if (filteredUnits.length <= 1) continue;\n\n unitGroups.push({\n b_age,\n t_age,\n strat_name_id,\n strat_name_long: filteredUnits[0].strat_name_long,\n units,\n });\n }\n\n return unitGroups;\n}\n\nexport function splitStratIntoBoxes(pkg: UnitGroup): UnitGroupBox[] {\n const { strat_name_long, strat_name_id, units } = pkg;\n const boxes: UnitGroupBox[] = [];\n let currentBox: UnitGroupBox = null;\n for (let i = 0; i < units.length; i++) {\n const unit = units[i];\n if (unit == null) {\n if (currentBox != null) {\n boxes.push(currentBox);\n currentBox = null;\n }\n continue;\n }\n if (currentBox == null) {\n currentBox = {\n startCol: i,\n endCol: i,\n strat_name_id,\n strat_name_long,\n t_age: unit.t_age,\n b_age: unit.b_age,\n units: [],\n };\n } else {\n currentBox.endCol = i;\n }\n currentBox.units.push(unit);\n }\n return boxes;\n}\n\nfunction separateColumns(\n pkg: PackageLayoutData,\n columnIDs: number[],\n): MultiColumnPackageData {\n /** Separate columns by col_id */\n const { units, t_age, b_age } = pkg;\n\n return {\n columnData: columnIDs.map((d) => {\n const u1 = units.filter((unit) => unit.col_id == d);\n u1.sort((a, b) => a.t_age - b.t_age);\n return {\n columnID: d,\n // Ensure that the units correctly show overlap\n units: preprocessUnits(\n {\n ...pkg,\n units: u1,\n },\n ColumnAxisType.AGE,\n ),\n };\n }),\n bestPixelScale: pkg.scaleInfo.pixelScale,\n t_age,\n b_age,\n };\n}\n\nexport function columnGeoJSONRecordToColumnIdentifier(\n col: ColumnGeoJSONRecord,\n): ColumnIdentifier {\n return {\n col_id: col.properties.col_id,\n col_name: col.properties.col_name,\n project_id: col.properties.project_id,\n };\n}\n"],"names":[],"mappings":";;;;;AA0CO,SAAS,0BACd,SACA,UACsB;AACtB,UAAQ,IAAI,QAAQ;AACpB,QAAM;AAAA,IACJ,gBAAgB,kBAAkB;AAAA,IAClC;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,OAA6B;AAAA,IACjC,UAAU,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAA;AAE3C,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE/C,QAAM,gBAAgB,mBAAmB,QAAQ,IAAI;AAErD,QAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,QAAM,YAA6C;AAAA,IACjD,UAAU,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM;AACnC,WAAO,gBAAgB,GAAG,SAAS;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,WAAW,UAAU,UAAU,UAAU,OAAA;AACpD;AAkGA,SAAS,gBACP,KACA,WACwB;AAExB,QAAM,EAAE,OAAO,OAAO,MAAA,IAAU;AAEhC,SAAO;AAAA,IACL,YAAY,UAAU,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAClD,SAAG,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,aAAO;AAAA,QACL,UAAU;AAAA;AAAA,QAEV,OAAO;AAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,UAAA;AAAA,UAET,eAAe;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAgB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"prepare-data.js","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n const {\n mergeSections = MergeSectionsMode.OVERLAPPING,\n targetUnitHeight,\n ...rest\n } = settings;\n\n const opts: PrepareColumnOptions = {\n axisType: ColumnAxisType.AGE,\n targetUnitHeight,\n mergeSections,\n ...rest,\n };\n\n if (columns.length == 0) {\n return null;\n }\n\n // Flatten the units array to pretend that all units are in the same column\n const _units = columns.map((d) => d.units).flat();\n\n const columnIDs = columns.map((d) => d.columnID);\n\n const preparedUnits = prepareColumnUnits(_units, opts);\n\n const { sections, totalHeight } = preparedUnits;\n\n const scaleInfo: CompositeStratigraphicScaleInfo = {\n axisType: ColumnAxisType.AGE,\n totalHeight,\n packages: sections.map((d) => d.scaleInfo),\n };\n\n const packages = sections.map((d) => {\n return separateColumns(d, columnIDs);\n });\n\n return { scaleInfo, packages, nColumns: columnIDs.length };\n}\n\ninterface UnitGroup {\n b_age: number;\n t_age: number;\n strat_name_id: number;\n strat_name_long: string;\n units: (UnitLong | null)[];\n}\n\nexport interface UnitGroupBox extends UnitGroup {\n units: UnitLong[];\n startCol: number;\n endCol: number;\n}\n\ninterface ColumnExt {\n columnID: number;\n units: UnitLong[];\n}\n\ninterface MultiColumnPackageData {\n columnData: ColumnExt[];\n bestPixelScale?: number;\n b_age: number;\n t_age: number;\n}\n\nexport function findLaterallyExtensiveUnits(\n pkg: MultiColumnPackageData,\n): UnitGroup[] {\n const { columnData, b_age, t_age } = pkg;\n // Group units by strat_name_id\n const unitIndex = new Map<number, Map<number, UnitLong>>();\n for (const column of columnData) {\n const { units } = column;\n for (const unit of units) {\n if (unit.strat_name_id == null) continue;\n if (!unitIndex.has(unit.strat_name_id)) {\n unitIndex.set(unit.strat_name_id, new Map());\n }\n unitIndex.get(unit.strat_name_id).set(column.columnID, unit);\n }\n }\n\n // Prepare grouped units for rendering\n const unitGroups: UnitGroup[] = [];\n for (const [strat_name_id, unitIndex0] of unitIndex) {\n const units = columnData.map((d) => unitIndex0.get(d.columnID) ?? null);\n const filteredUnits = units.filter((d) => d != null);\n const [t_age, b_age] = mergeAgeRanges(\n filteredUnits.map((d) => [d.t_age, d.b_age]),\n );\n if (filteredUnits.length <= 1) continue;\n\n unitGroups.push({\n b_age,\n t_age,\n strat_name_id,\n strat_name_long: filteredUnits[0].strat_name_long,\n units,\n });\n }\n\n return unitGroups;\n}\n\nexport function splitStratIntoBoxes(pkg: UnitGroup): UnitGroupBox[] {\n const { strat_name_long, strat_name_id, units } = pkg;\n const boxes: UnitGroupBox[] = [];\n let currentBox: UnitGroupBox = null;\n for (let i = 0; i < units.length; i++) {\n const unit = units[i];\n if (unit == null) {\n if (currentBox != null) {\n boxes.push(currentBox);\n currentBox = null;\n }\n continue;\n }\n if (currentBox == null) {\n currentBox = {\n startCol: i,\n endCol: i,\n strat_name_id,\n strat_name_long,\n t_age: unit.t_age,\n b_age: unit.b_age,\n units: [],\n };\n } else {\n currentBox.endCol = i;\n }\n currentBox.units.push(unit);\n }\n return boxes;\n}\n\nfunction separateColumns(\n pkg: PackageLayoutData,\n columnIDs: number[],\n): MultiColumnPackageData {\n /** Separate columns by col_id */\n const { units, t_age, b_age } = pkg;\n\n return {\n columnData: columnIDs.map((d) => {\n const u1 = units.filter((unit) => unit.col_id == d);\n u1.sort((a, b) => a.t_age - b.t_age);\n return {\n columnID: d,\n // Ensure that the units correctly show overlap\n units: preprocessUnits(\n {\n ...pkg,\n units: u1,\n },\n ColumnAxisType.AGE,\n ),\n };\n }),\n bestPixelScale: pkg.scaleInfo.pixelScale,\n t_age,\n b_age,\n };\n}\n\nexport function columnGeoJSONRecordToColumnIdentifier(\n col: ColumnGeoJSONRecord,\n): ColumnIdentifier {\n return {\n col_id: col.properties.col_id,\n col_name: col.properties.col_name,\n project_id: col.properties.project_id,\n };\n}\n"],"names":[],"mappings":";;;;;AA0CO,SAAS,0BACd,SACA,UACsB;AACtB,QAAM;AAAA,IACJ,gBAAgB,kBAAkB;AAAA,IAClC;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,OAA6B;AAAA,IACjC,UAAU,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAA;AAE3C,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE/C,QAAM,gBAAgB,mBAAmB,QAAQ,IAAI;AAErD,QAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,QAAM,YAA6C;AAAA,IACjD,UAAU,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM;AACnC,WAAO,gBAAgB,GAAG,SAAS;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,WAAW,UAAU,UAAU,UAAU,OAAA;AACpD;AAkGA,SAAS,gBACP,KACA,WACwB;AAExB,QAAM,EAAE,OAAO,OAAO,MAAA,IAAU;AAEhC,SAAO;AAAA,IACL,YAAY,UAAU,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAClD,SAAG,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,aAAO;AAAA,QACL,UAAU;AAAA;AAAA,QAEV,OAAO;AAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,UAAA;AAAA,UAET,eAAe;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAgB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA;AAEJ;"}
@@ -33,6 +33,15 @@ function MacrostratColumnStateProvider({
33
33
  }
34
34
  return selectedUnit != null || onUnitSelected != null;
35
35
  }, []);
36
+ const existingUnits = scope.useAtomValueIfExists(columnUnitsAtom);
37
+ if (existingUnits != null) {
38
+ if (allowUnitSelection || onUnitSelected || selectedUnit != null) {
39
+ console.warn(
40
+ "MacrostratColumnStateProvider: unit selection props are ignored because a provider already exists in the tree"
41
+ );
42
+ }
43
+ return children;
44
+ }
36
45
  const atomMap = [
37
46
  [columnUnitsAtom, units],
38
47
  [unitSelection.allowUnitSelectionAtom, _allowSelection],
@@ -46,8 +55,7 @@ function MacrostratColumnStateProvider({
46
55
  scope.Provider,
47
56
  {
48
57
  atoms: atomMap,
49
- keepUpdated: true,
50
- inherit: true
58
+ keepUpdated: true
51
59
  },
52
60
  [selectionHandlers, children]
53
61
  );