@macrostrat/column-views 3.0.1 → 3.0.2

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 (82) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/age-axis.cjs +3 -1
  3. package/dist/age-axis.cjs.map +1 -1
  4. package/dist/age-model-overlay.cjs +3 -1
  5. package/dist/age-model-overlay.cjs.map +1 -1
  6. package/dist/age-model-overlay.module.sass.cjs +1 -2
  7. package/dist/age-model-overlay.module.sass.cjs.map +1 -1
  8. package/dist/column.cjs +3 -1
  9. package/dist/column.cjs.map +1 -1
  10. package/dist/correlation-chart/main.cjs +5 -2
  11. package/dist/correlation-chart/main.cjs.map +1 -1
  12. package/dist/data-provider/base.cjs +8 -5
  13. package/dist/data-provider/base.cjs.map +1 -1
  14. package/dist/data-provider/column-nav.cjs +3 -1
  15. package/dist/data-provider/column-nav.cjs.map +1 -1
  16. package/dist/data-provider/core.cjs +4 -2
  17. package/dist/data-provider/core.cjs.map +1 -1
  18. package/dist/data-provider/fetch.cjs +4 -2
  19. package/dist/data-provider/fetch.cjs.map +1 -1
  20. package/dist/data-provider/store.cjs +7 -5
  21. package/dist/data-provider/store.cjs.map +1 -1
  22. package/dist/facets/carbon-isotopes/data-area.cjs +4 -2
  23. package/dist/facets/carbon-isotopes/data-area.cjs.map +1 -1
  24. package/dist/facets/carbon-isotopes/data-provider.cjs +3 -1
  25. package/dist/facets/carbon-isotopes/data-provider.cjs.map +1 -1
  26. package/dist/facets/carbon-isotopes/isotopes-column.cjs +5 -2
  27. package/dist/facets/carbon-isotopes/isotopes-column.cjs.map +1 -1
  28. package/dist/facets/detrital-zircon/index.cjs +5 -2
  29. package/dist/facets/detrital-zircon/index.cjs.map +1 -1
  30. package/dist/facets/detrital-zircon/index.module.sass.cjs +1 -2
  31. package/dist/facets/detrital-zircon/index.module.sass.cjs.map +1 -1
  32. package/dist/facets/fossils/index.cjs +3 -1
  33. package/dist/facets/fossils/index.cjs.map +1 -1
  34. package/dist/facets/fossils/taxon-ranges.cjs +3 -1
  35. package/dist/facets/fossils/taxon-ranges.cjs.map +1 -1
  36. package/dist/facets/fossils/taxon-ranges.module.sass.cjs +1 -2
  37. package/dist/facets/fossils/taxon-ranges.module.sass.cjs.map +1 -1
  38. package/dist/facets/measurements/base.cjs +3 -1
  39. package/dist/facets/measurements/base.cjs.map +1 -1
  40. package/dist/facets/measurements/base.module.sass.cjs +1 -2
  41. package/dist/facets/measurements/base.module.sass.cjs.map +1 -1
  42. package/dist/facets/measurements/sgp.cjs +5 -3
  43. package/dist/facets/measurements/sgp.cjs.map +1 -1
  44. package/dist/maps/_shared/inset-map.cjs +5 -3
  45. package/dist/maps/_shared/inset-map.cjs.map +1 -1
  46. package/dist/maps/column-correlation/core.cjs +7 -5
  47. package/dist/maps/column-correlation/core.cjs.map +1 -1
  48. package/dist/maps/column-correlation/state.cjs +5 -2
  49. package/dist/maps/column-correlation/state.cjs.map +1 -1
  50. package/dist/maps/column-navigation/mapbox/index.cjs +7 -5
  51. package/dist/maps/column-navigation/mapbox/index.cjs.map +1 -1
  52. package/dist/maps/column-navigation/mapbox/state.cjs +3 -1
  53. package/dist/maps/column-navigation/mapbox/state.cjs.map +1 -1
  54. package/dist/maps/column-navigation/svg/index.cjs +9 -7
  55. package/dist/maps/column-navigation/svg/index.cjs.map +1 -1
  56. package/dist/maps/column-navigation/svg/layers.cjs +16 -13
  57. package/dist/maps/column-navigation/svg/layers.cjs.map +1 -1
  58. package/dist/notes.cjs +5 -3
  59. package/dist/notes.cjs.map +1 -1
  60. package/dist/section.cjs +3 -1
  61. package/dist/section.cjs.map +1 -1
  62. package/dist/unit-details/modal-panel.cjs +6 -4
  63. package/dist/unit-details/modal-panel.cjs.map +1 -1
  64. package/dist/unit-details/panel.cjs +8 -5
  65. package/dist/unit-details/panel.cjs.map +1 -1
  66. package/dist/unit-details/popover.cjs +5 -2
  67. package/dist/unit-details/popover.cjs.map +1 -1
  68. package/dist/unit-details/popover.module.sass.cjs +1 -2
  69. package/dist/unit-details/popover.module.sass.cjs.map +1 -1
  70. package/dist/units/boxes.cjs +5 -2
  71. package/dist/units/boxes.cjs.map +1 -1
  72. package/dist/units/colors.cjs +3 -1
  73. package/dist/units/colors.cjs.map +1 -1
  74. package/dist/units/composite.cjs +1 -1
  75. package/dist/units/composite.cjs.map +1 -1
  76. package/dist/units/composite.module.sass.cjs +1 -2
  77. package/dist/units/composite.module.sass.cjs.map +1 -1
  78. package/dist/units/index.cjs +10 -8
  79. package/dist/units/index.cjs.map +1 -1
  80. package/dist/units/names.cjs +7 -4
  81. package/dist/units/names.cjs.map +1 -1
  82. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.cjs","sources":["../../src/data-provider/fetch.ts"],"sourcesContent":["import {\n ColumnGeoJSONRecord,\n ColumnGeoJSONRecordWithID,\n MacrostratRef,\n StratName,\n UnitLong,\n} from \"@macrostrat/api-types\";\nimport {\n addQueryString,\n joinURL,\n useAPIResult,\n} from \"@macrostrat/ui-components\";\nimport crossFetch from \"cross-fetch\";\nimport { feature } from \"topojson-client\";\nimport { geoArea } from \"d3-geo\";\n\nfunction createScopedFetch(baseURL: string) {\n return function (url: string, options: RequestInit | undefined = undefined) {\n return crossFetch(baseURL + url, options);\n };\n}\n\nconst defaultFetch = createScopedFetch(\"https://macrostrat.org/api/v2\");\n\nexport type ColumnStatusCode = \"in process\" | \"active\" | \"obsolete\";\n\nexport interface ColumnFetchOptions {\n apiBaseURL?: string;\n projectID?: number;\n statusCode?: ColumnStatusCode | ColumnStatusCode[];\n format?: \"geojson\" | \"topojson\" | \"geojson_bare\";\n fetch?: any;\n}\n\nexport async function fetchAllColumns(\n options: ColumnFetchOptions = {},\n): Promise<ColumnGeoJSONRecord[]> {\n const {\n apiBaseURL,\n projectID,\n format = \"topojson\",\n statusCode,\n fetch = crossFetch,\n } = options;\n\n let args: any = { format };\n if (projectID != null) {\n args = { ...args, project_id: projectID };\n }\n let _statusCode: string | undefined = undefined;\n if (Array.isArray(statusCode)) {\n _statusCode = statusCode.join(\",\");\n } else if (statusCode != null) {\n _statusCode = statusCode;\n }\n args.statusCode = _statusCode;\n\n if (projectID == null) {\n args = { ...args, all: true };\n }\n\n let url = \"/columns\";\n if (apiBaseURL != null) {\n url = joinURL(apiBaseURL, url);\n }\n\n // Try with fetch\n url = addQueryString(url, args);\n\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (res == null) {\n return null;\n }\n\n // Get JSON\n const data = await res.json();\n return postProcessColumns(columnProcessors[format](data));\n}\n\nexport function useColumnFeatures({\n apiRoute = \"/columns\",\n status_code,\n project_id,\n format = \"geojson\",\n}) {\n let all: boolean = undefined;\n if (status_code == null && project_id == null) {\n all = true;\n }\n\n const processor = columnProcessors[format];\n\n return useAPIResult(\n apiRoute,\n { format, all, status_code, project_id },\n processor,\n );\n}\n\nfunction processGeoJSON(res) {\n return processGeoJSONBare(res?.success?.data);\n}\n\nfunction processGeoJSONBare(res) {\n return res?.features;\n}\n\nfunction processTopoJSON(res) {\n try {\n const { data } = res.success;\n const { features: f } = feature(data, data.objects.output) as any;\n return f;\n } catch (err) {\n console.error(err);\n return [];\n }\n}\n\nfunction postProcessColumns(columns) {\n return promoteColumnIDs(\n convertSmallAreasToPoints(removeFeaturesWithoutGeometry(columns)),\n );\n}\n\nfunction promoteColumnIDs(\n features: ColumnGeoJSONRecord[],\n): ColumnGeoJSONRecordWithID[] {\n return features.map((f, i) => {\n return {\n id: f.properties?.col_id,\n ...f,\n };\n });\n}\n\nfunction removeFeaturesWithoutGeometry(features) {\n return features.filter((f) => f.geometry != null);\n}\n\nfunction convertSmallAreasToPoints(features) {\n return features.map((f) => {\n // GeoArea takes a long time to run. We are really more worried about points that are zero-area\n if (geoArea(f.geometry) < 1e-8) {\n const centroid = f.geometry.coordinates[0][0];\n f.geometry = {\n type: \"Point\",\n coordinates: centroid,\n };\n }\n return f;\n });\n}\n\nconst columnProcessors = {\n topojson: processTopoJSON,\n geojson: processGeoJSON,\n geojson_bare: processGeoJSONBare,\n};\n\nasync function unwrapResponse(res) {\n if (res == null) {\n return null;\n }\n const resData = await res.json();\n return resData[\"success\"][\"data\"];\n}\n\nexport async function fetchLithologies(fetch = defaultFetch) {\n const res = await fetch(\"/defs/lithologies?all\");\n return await unwrapResponse(res);\n}\n\nexport async function fetchIntervals(\n timescaleID: number | null,\n fetch = defaultFetch,\n) {\n let url = `/defs/intervals`;\n if (timescaleID != null) {\n url += `?timescale_id=${timescaleID}`;\n } else {\n url += \"?all\";\n }\n const res = await fetch(url);\n return await unwrapResponse(res);\n}\n\nexport async function fetchEnvironments(fetch = defaultFetch) {\n const res = await fetch(\"/defs/environments?all\");\n return await unwrapResponse(res);\n}\n\nexport async function fetchRefs(\n refs: number[],\n fetch = defaultFetch,\n): Promise<MacrostratRef[]> {\n let url = `/defs/refs`;\n if (refs.length == 0) {\n return [];\n }\n url += \"?ref_id=\" + refs.join(\",\");\n const res = await fetch(url);\n return await unwrapResponse(res);\n}\n\nexport async function fetchStratNames(\n names: number[],\n fetch = defaultFetch,\n): Promise<StratName[]> {\n let url = `/defs/strat_names`;\n if (names.length == 0) {\n return [];\n }\n url += \"?strat_name_id=\" + names.join(\",\");\n const res = await fetch(url);\n return await unwrapResponse(res);\n}\n\nexport type ColumnData = {\n units: UnitLong[];\n columnID: number;\n};\n\nexport async function fetchUnits(\n columns: number[],\n fetch = defaultFetch,\n): Promise<ColumnData[]> {\n const params = new URLSearchParams();\n params.append(\"response\", \"long\");\n\n if (columns.length == 0) {\n return [];\n }\n\n const col_string = columns.map((column) => column.toString()).join(\",\");\n params.append(\"col_id\", col_string);\n\n const res = await fetch(\"/units\" + \"?\" + params.toString());\n const data = await res.json();\n if (!data.success) {\n throw new Error(\"Failed to fetch column units\");\n }\n const units = data.success.data;\n const unitsMap = new Map<number, UnitLong[]>();\n for (const unit of units) {\n const colID = unit.col_id;\n if (!unitsMap.has(colID)) {\n unitsMap.set(colID, []);\n }\n unitsMap.get(colID).push(unit);\n }\n const result: ColumnData[] = [];\n for (const colID of columns) {\n result.push({ columnID: colID, units: unitsMap.get(colID) || [] });\n }\n return result;\n}\n\nexport async function fetchColumnUnits(\n col_id: number,\n fetch = defaultFetch,\n): Promise<ColumnData> {\n const params = new URLSearchParams();\n params.append(\"response\", \"long\");\n params.append(\"col_id\", col_id.toString());\n const res = await fetch(\"/units\" + \"?\" + params.toString());\n const data = await res.json();\n if (!data.success) {\n throw new Error(\"Failed to fetch column units\");\n }\n const units = data.success.data;\n return { columnID: col_id, units };\n}\n"],"names":["joinURL","addQueryString","useAPIResult","feature","geoArea"],"mappings":"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"}
1
+ {"version":3,"file":"fetch.cjs","sources":["../../src/data-provider/fetch.ts"],"sourcesContent":["import {\n ColumnGeoJSONRecord,\n ColumnGeoJSONRecordWithID,\n MacrostratRef,\n StratName,\n UnitLong,\n} from \"@macrostrat/api-types\";\nimport {\n addQueryString,\n joinURL,\n useAPIResult,\n} from \"@macrostrat/ui-components\";\nimport crossFetch from \"cross-fetch\";\nimport { feature } from \"topojson-client\";\nimport { geoArea } from \"d3-geo\";\n\nfunction createScopedFetch(baseURL: string) {\n return function (url: string, options: RequestInit | undefined = undefined) {\n return crossFetch(baseURL + url, options);\n };\n}\n\nconst defaultFetch = createScopedFetch(\"https://macrostrat.org/api/v2\");\n\nexport type ColumnStatusCode = \"in process\" | \"active\" | \"obsolete\";\n\nexport interface ColumnFetchOptions {\n apiBaseURL?: string;\n projectID?: number;\n statusCode?: ColumnStatusCode | ColumnStatusCode[];\n format?: \"geojson\" | \"topojson\" | \"geojson_bare\";\n fetch?: any;\n}\n\nexport async function fetchAllColumns(\n options: ColumnFetchOptions = {},\n): Promise<ColumnGeoJSONRecord[]> {\n const {\n apiBaseURL,\n projectID,\n format = \"topojson\",\n statusCode,\n fetch = crossFetch,\n } = options;\n\n let args: any = { format };\n if (projectID != null) {\n args = { ...args, project_id: projectID };\n }\n let _statusCode: string | undefined = undefined;\n if (Array.isArray(statusCode)) {\n _statusCode = statusCode.join(\",\");\n } else if (statusCode != null) {\n _statusCode = statusCode;\n }\n args.statusCode = _statusCode;\n\n if (projectID == null) {\n args = { ...args, all: true };\n }\n\n let url = \"/columns\";\n if (apiBaseURL != null) {\n url = joinURL(apiBaseURL, url);\n }\n\n // Try with fetch\n url = addQueryString(url, args);\n\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (res == null) {\n return null;\n }\n\n // Get JSON\n const data = await res.json();\n return postProcessColumns(columnProcessors[format](data));\n}\n\nexport function useColumnFeatures({\n apiRoute = \"/columns\",\n status_code,\n project_id,\n format = \"geojson\",\n}) {\n let all: boolean = undefined;\n if (status_code == null && project_id == null) {\n all = true;\n }\n\n const processor = columnProcessors[format];\n\n return useAPIResult(\n apiRoute,\n { format, all, status_code, project_id },\n processor,\n );\n}\n\nfunction processGeoJSON(res) {\n return processGeoJSONBare(res?.success?.data);\n}\n\nfunction processGeoJSONBare(res) {\n return res?.features;\n}\n\nfunction processTopoJSON(res) {\n try {\n const { data } = res.success;\n const { features: f } = feature(data, data.objects.output) as any;\n return f;\n } catch (err) {\n console.error(err);\n return [];\n }\n}\n\nfunction postProcessColumns(columns) {\n return promoteColumnIDs(\n convertSmallAreasToPoints(removeFeaturesWithoutGeometry(columns)),\n );\n}\n\nfunction promoteColumnIDs(\n features: ColumnGeoJSONRecord[],\n): ColumnGeoJSONRecordWithID[] {\n return features.map((f, i) => {\n return {\n id: f.properties?.col_id,\n ...f,\n };\n });\n}\n\nfunction removeFeaturesWithoutGeometry(features) {\n return features.filter((f) => f.geometry != null);\n}\n\nfunction convertSmallAreasToPoints(features) {\n return features.map((f) => {\n // GeoArea takes a long time to run. We are really more worried about points that are zero-area\n if (geoArea(f.geometry) < 1e-8) {\n const centroid = f.geometry.coordinates[0][0];\n f.geometry = {\n type: \"Point\",\n coordinates: centroid,\n };\n }\n return f;\n });\n}\n\nconst columnProcessors = {\n topojson: processTopoJSON,\n geojson: processGeoJSON,\n geojson_bare: processGeoJSONBare,\n};\n\nasync function unwrapResponse(res) {\n if (res == null) {\n return null;\n }\n const resData = await res.json();\n return resData[\"success\"][\"data\"];\n}\n\nexport async function fetchLithologies(fetch = defaultFetch) {\n const res = await fetch(\"/defs/lithologies?all\");\n return await unwrapResponse(res);\n}\n\nexport async function fetchIntervals(\n timescaleID: number | null,\n fetch = defaultFetch,\n) {\n let url = `/defs/intervals`;\n if (timescaleID != null) {\n url += `?timescale_id=${timescaleID}`;\n } else {\n url += \"?all\";\n }\n const res = await fetch(url);\n return await unwrapResponse(res);\n}\n\nexport async function fetchEnvironments(fetch = defaultFetch) {\n const res = await fetch(\"/defs/environments?all\");\n return await unwrapResponse(res);\n}\n\nexport async function fetchRefs(\n refs: number[],\n fetch = defaultFetch,\n): Promise<MacrostratRef[]> {\n let url = `/defs/refs`;\n if (refs.length == 0) {\n return [];\n }\n url += \"?ref_id=\" + refs.join(\",\");\n const res = await fetch(url);\n return await unwrapResponse(res);\n}\n\nexport async function fetchStratNames(\n names: number[],\n fetch = defaultFetch,\n): Promise<StratName[]> {\n let url = `/defs/strat_names`;\n if (names.length == 0) {\n return [];\n }\n url += \"?strat_name_id=\" + names.join(\",\");\n const res = await fetch(url);\n return await unwrapResponse(res);\n}\n\nexport type ColumnData = {\n units: UnitLong[];\n columnID: number;\n};\n\nexport async function fetchUnits(\n columns: number[],\n fetch = defaultFetch,\n): Promise<ColumnData[]> {\n const params = new URLSearchParams();\n params.append(\"response\", \"long\");\n\n if (columns.length == 0) {\n return [];\n }\n\n const col_string = columns.map((column) => column.toString()).join(\",\");\n params.append(\"col_id\", col_string);\n\n const res = await fetch(\"/units\" + \"?\" + params.toString());\n const data = await res.json();\n if (!data.success) {\n throw new Error(\"Failed to fetch column units\");\n }\n const units = data.success.data;\n const unitsMap = new Map<number, UnitLong[]>();\n for (const unit of units) {\n const colID = unit.col_id;\n if (!unitsMap.has(colID)) {\n unitsMap.set(colID, []);\n }\n unitsMap.get(colID).push(unit);\n }\n const result: ColumnData[] = [];\n for (const colID of columns) {\n result.push({ columnID: colID, units: unitsMap.get(colID) || [] });\n }\n return result;\n}\n\nexport async function fetchColumnUnits(\n col_id: number,\n fetch = defaultFetch,\n): Promise<ColumnData> {\n const params = new URLSearchParams();\n params.append(\"response\", \"long\");\n params.append(\"col_id\", col_id.toString());\n const res = await fetch(\"/units\" + \"?\" + params.toString());\n const data = await res.json();\n if (!data.success) {\n throw new Error(\"Failed to fetch column units\");\n }\n const units = data.success.data;\n return { columnID: col_id, units };\n}\n"],"names":["crossFetch","joinURL","addQueryString","useAPIResult","feature","geoArea"],"mappings":"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"}
@@ -5,6 +5,8 @@ const h = require("@macrostrat/hyper");
5
5
  const compositeScale = require("../prepare-units/composite-scale.cjs");
6
6
  const unitSelection = require("./unit-selection.cjs");
7
7
  const core = require("./core.cjs");
8
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
9
+ const h__default = /* @__PURE__ */ _interopDefault(h);
8
10
  function MacrostratColumnStateProvider({
9
11
  children,
10
12
  units,
@@ -25,9 +27,9 @@ function MacrostratColumnStateProvider({
25
27
  ];
26
28
  let selectionHandlers = null;
27
29
  if (_allowSelection) {
28
- selectionHandlers = h(unitSelection.UnitSelectionCallbackManager, { onUnitSelected });
30
+ selectionHandlers = h__default.default(unitSelection.UnitSelectionCallbackManager, { onUnitSelected });
29
31
  }
30
- return h(
32
+ return h__default.default(
31
33
  core.ScopedProvider,
32
34
  {
33
35
  atoms: atomMap
@@ -54,7 +56,7 @@ function MacrostratColumnDataProvider({
54
56
  axisType
55
57
  };
56
58
  }, [units, sections, totalHeight, axisType]);
57
- return h(
59
+ return h__default.default(
58
60
  MacrostratColumnStateProvider,
59
61
  {
60
62
  units,
@@ -62,11 +64,11 @@ function MacrostratColumnDataProvider({
62
64
  onUnitSelected,
63
65
  selectedUnit
64
66
  },
65
- h(MacrostratColumnDataContext.Provider, { value }, children)
67
+ h__default.default(MacrostratColumnDataContext.Provider, { value }, children)
66
68
  );
67
69
  }
68
70
  function UnitSelectionProvider(props) {
69
- return h(MacrostratColumnStateProvider, {
71
+ return h__default.default(MacrostratColumnStateProvider, {
70
72
  ...props,
71
73
  allowUnitSelection: true
72
74
  });
@@ -1 +1 @@
1
- {"version":3,"file":"store.cjs","sources":["../../src/data-provider/store.ts"],"sourcesContent":["import { createContext, ReactNode, useContext, useMemo } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n CompositeColumnScale,\n createCompositeScale,\n} from \"../prepare-units/composite-scale\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport type { ExtUnit, PackageLayoutData } from \"../prepare-units\";\nimport {\n allowUnitSelectionAtom,\n selectedUnitIDAtom,\n UnitSelectionCallbacks,\n UnitSelectionCallbackManager,\n} from \"./unit-selection\";\nimport { BaseUnit } from \"@macrostrat/api-types\";\nimport {\n AtomMap,\n columnUnitsAtom,\n columnUnitsMapAtom,\n scope,\n ScopedProvider,\n} from \"./core\";\n\nexport interface ColumnStateProviderProps<\n T extends BaseUnit,\n> extends Partial<UnitSelectionCallbacks> {\n children: ReactNode;\n units: T[];\n selectedUnit: number | null;\n allowUnitSelection?: boolean;\n}\n\nexport function MacrostratColumnStateProvider<T extends BaseUnit>({\n children,\n units,\n allowUnitSelection = false,\n onUnitSelected,\n selectedUnit,\n}: ColumnStateProviderProps<T>) {\n /** Top-level provider for Macrostrat column data.\n * It is either provided by the Column component itself, or\n * can be hoisted higher in the tree to provide a common data context\n */\n\n /* By default, unit selection is disabled. However, if any related props are passed,\n we enable it.\n */\n const _allowSelection = useMemo(() => {\n if (allowUnitSelection) {\n return true;\n }\n return selectedUnit != null || onUnitSelected != null;\n }, []);\n\n const atomMap: AtomMap = [\n [columnUnitsAtom, units],\n [allowUnitSelectionAtom, _allowSelection],\n [selectedUnitIDAtom, selectedUnit],\n ];\n\n let selectionHandlers: ReactNode = null;\n if (_allowSelection) {\n selectionHandlers = h(UnitSelectionCallbackManager, { onUnitSelected });\n }\n\n return h(\n ScopedProvider,\n {\n atoms: atomMap,\n },\n [selectionHandlers, children],\n );\n}\n\nexport interface MacrostratColumnDataContext<T extends BaseUnit> {\n units: T[];\n sections: PackageLayoutData[];\n totalHeight?: number;\n axisType?: ColumnAxisType;\n allowUnitSelection?: boolean;\n}\n\nexport interface ColumnDataProviderProps<T extends BaseUnit>\n extends MacrostratColumnDataContext<T>, ColumnStateProviderProps<T> {\n children: ReactNode;\n}\n\nconst MacrostratColumnDataContext =\n createContext<MacrostratColumnDataContext<any>>(null);\n\nexport function MacrostratColumnDataProvider<T extends BaseUnit>({\n children,\n units,\n sections,\n totalHeight,\n axisType,\n allowUnitSelection,\n onUnitSelected,\n selectedUnit,\n}: ColumnDataProviderProps<T>) {\n /** Internal provider for Macrostrat column data.\n * As a general rule, we want to provide data and column-axis\n * height calculations through the context, since these need to\n * be accessed by any component that lays out information on the\n * column.\n *\n * Cross-axis layout and view configuration (e.g., showing and hiding\n * of different components or labels) should be handled through passing\n * props to the components themselves.\n * */\n\n const value = useMemo(() => {\n // For now, change ordinal axis types to age axis types\n return {\n units,\n sections,\n totalHeight,\n axisType,\n };\n }, [units, sections, totalHeight, axisType]);\n\n return h(\n MacrostratColumnStateProvider,\n {\n units,\n allowUnitSelection,\n onUnitSelected,\n selectedUnit,\n },\n h(MacrostratColumnDataContext.Provider, { value }, children),\n );\n}\n\nexport function UnitSelectionProvider(props: ColumnStateProviderProps<any>) {\n /* A basic unit selection provider without column data context.\n Mostly for use with the CorrelationChart component.\n */\n return h(MacrostratColumnStateProvider, {\n ...props,\n allowUnitSelection: true,\n });\n}\n\nexport function useMacrostratColumnData() {\n const ctx = useContext(MacrostratColumnDataContext);\n if (!ctx) {\n throw new Error(\n \"useMacrostratColumnData must be used within a MacrostratColumnDataProvider\",\n );\n }\n return ctx;\n}\n\nexport function useMacrostratUnits() {\n return scope.useAtomValue(columnUnitsAtom);\n}\n\nexport function useColumnUnitsMap(): Map<number, ExtUnit> | null {\n try {\n return scope.useAtomValue(columnUnitsMapAtom) as Map<number, ExtUnit>;\n } catch {\n return null;\n }\n}\n\nexport function useCompositeScale(): CompositeColumnScale {\n const ctx = useMacrostratColumnData();\n return useMemo(\n () => createCompositeScale(ctx.sections, true),\n [ctx.sections],\n );\n}\n"],"names":["useMemo","columnUnitsAtom","allowUnitSelectionAtom","selectedUnitIDAtom","UnitSelectionCallbackManager","ScopedProvider","createContext","useContext","scope","columnUnitsMapAtom","createCompositeScale"],"mappings":";;;;;;;AAgCO,SAAS,8BAAkD;AAAA,EAChE;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AACF,GAAgC;AAS9B,QAAM,kBAAkBA,MAAAA,QAAQ,MAAM;AACpC,QAAI,oBAAoB;AACtB,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,QAAQ,kBAAkB;AAAA,EACnD,GAAG,CAAA,CAAE;AAEL,QAAM,UAAmB;AAAA,IACvB,CAACC,KAAAA,iBAAiB,KAAK;AAAA,IACvB,CAACC,cAAAA,wBAAwB,eAAe;AAAA,IACxC,CAACC,cAAAA,oBAAoB,YAAY;AAAA,EAAA;AAGnC,MAAI,oBAA+B;AACnC,MAAI,iBAAiB;AACnB,wBAAoB,EAAEC,4CAA8B,EAAE,eAAA,CAAgB;AAAA,EACxE;AAEA,SAAO;AAAA,IACLC,KAAAA;AAAAA,IACA;AAAA,MACE,OAAO;AAAA,IAAA;AAAA,IAET,CAAC,mBAAmB,QAAQ;AAAA,EAAA;AAEhC;AAeA,MAAM,8BACJC,MAAAA,cAAgD,IAAI;AAE/C,SAAS,6BAAiD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAY7B,QAAM,QAAQN,MAAAA,QAAQ,MAAM;AAE1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ,GAAG,CAAC,OAAO,UAAU,aAAa,QAAQ,CAAC;AAE3C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,EAAE,4BAA4B,UAAU,EAAE,MAAA,GAAS,QAAQ;AAAA,EAAA;AAE/D;AAEO,SAAS,sBAAsB,OAAsC;AAI1E,SAAO,EAAE,+BAA+B;AAAA,IACtC,GAAG;AAAA,IACH,oBAAoB;AAAA,EAAA,CACrB;AACH;AAEO,SAAS,0BAA0B;AACxC,QAAM,MAAMO,MAAAA,WAAW,2BAA2B;AAClD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB;AACnC,SAAOC,KAAAA,MAAM,aAAaP,oBAAe;AAC3C;AAEO,SAAS,oBAAiD;AAC/D,MAAI;AACF,WAAOO,KAAAA,MAAM,aAAaC,uBAAkB;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAA0C;AACxD,QAAM,MAAM,wBAAA;AACZ,SAAOT,MAAAA;AAAAA,IACL,MAAMU,oCAAqB,IAAI,UAAU,IAAI;AAAA,IAC7C,CAAC,IAAI,QAAQ;AAAA,EAAA;AAEjB;;;;;;;;"}
1
+ {"version":3,"file":"store.cjs","sources":["../../src/data-provider/store.ts"],"sourcesContent":["import { createContext, ReactNode, useContext, useMemo } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n CompositeColumnScale,\n createCompositeScale,\n} from \"../prepare-units/composite-scale\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport type { ExtUnit, PackageLayoutData } from \"../prepare-units\";\nimport {\n allowUnitSelectionAtom,\n selectedUnitIDAtom,\n UnitSelectionCallbacks,\n UnitSelectionCallbackManager,\n} from \"./unit-selection\";\nimport { BaseUnit } from \"@macrostrat/api-types\";\nimport {\n AtomMap,\n columnUnitsAtom,\n columnUnitsMapAtom,\n scope,\n ScopedProvider,\n} from \"./core\";\n\nexport interface ColumnStateProviderProps<\n T extends BaseUnit,\n> extends Partial<UnitSelectionCallbacks> {\n children: ReactNode;\n units: T[];\n selectedUnit: number | null;\n allowUnitSelection?: boolean;\n}\n\nexport function MacrostratColumnStateProvider<T extends BaseUnit>({\n children,\n units,\n allowUnitSelection = false,\n onUnitSelected,\n selectedUnit,\n}: ColumnStateProviderProps<T>) {\n /** Top-level provider for Macrostrat column data.\n * It is either provided by the Column component itself, or\n * can be hoisted higher in the tree to provide a common data context\n */\n\n /* By default, unit selection is disabled. However, if any related props are passed,\n we enable it.\n */\n const _allowSelection = useMemo(() => {\n if (allowUnitSelection) {\n return true;\n }\n return selectedUnit != null || onUnitSelected != null;\n }, []);\n\n const atomMap: AtomMap = [\n [columnUnitsAtom, units],\n [allowUnitSelectionAtom, _allowSelection],\n [selectedUnitIDAtom, selectedUnit],\n ];\n\n let selectionHandlers: ReactNode = null;\n if (_allowSelection) {\n selectionHandlers = h(UnitSelectionCallbackManager, { onUnitSelected });\n }\n\n return h(\n ScopedProvider,\n {\n atoms: atomMap,\n },\n [selectionHandlers, children],\n );\n}\n\nexport interface MacrostratColumnDataContext<T extends BaseUnit> {\n units: T[];\n sections: PackageLayoutData[];\n totalHeight?: number;\n axisType?: ColumnAxisType;\n allowUnitSelection?: boolean;\n}\n\nexport interface ColumnDataProviderProps<T extends BaseUnit>\n extends MacrostratColumnDataContext<T>, ColumnStateProviderProps<T> {\n children: ReactNode;\n}\n\nconst MacrostratColumnDataContext =\n createContext<MacrostratColumnDataContext<any>>(null);\n\nexport function MacrostratColumnDataProvider<T extends BaseUnit>({\n children,\n units,\n sections,\n totalHeight,\n axisType,\n allowUnitSelection,\n onUnitSelected,\n selectedUnit,\n}: ColumnDataProviderProps<T>) {\n /** Internal provider for Macrostrat column data.\n * As a general rule, we want to provide data and column-axis\n * height calculations through the context, since these need to\n * be accessed by any component that lays out information on the\n * column.\n *\n * Cross-axis layout and view configuration (e.g., showing and hiding\n * of different components or labels) should be handled through passing\n * props to the components themselves.\n * */\n\n const value = useMemo(() => {\n // For now, change ordinal axis types to age axis types\n return {\n units,\n sections,\n totalHeight,\n axisType,\n };\n }, [units, sections, totalHeight, axisType]);\n\n return h(\n MacrostratColumnStateProvider,\n {\n units,\n allowUnitSelection,\n onUnitSelected,\n selectedUnit,\n },\n h(MacrostratColumnDataContext.Provider, { value }, children),\n );\n}\n\nexport function UnitSelectionProvider(props: ColumnStateProviderProps<any>) {\n /* A basic unit selection provider without column data context.\n Mostly for use with the CorrelationChart component.\n */\n return h(MacrostratColumnStateProvider, {\n ...props,\n allowUnitSelection: true,\n });\n}\n\nexport function useMacrostratColumnData() {\n const ctx = useContext(MacrostratColumnDataContext);\n if (!ctx) {\n throw new Error(\n \"useMacrostratColumnData must be used within a MacrostratColumnDataProvider\",\n );\n }\n return ctx;\n}\n\nexport function useMacrostratUnits() {\n return scope.useAtomValue(columnUnitsAtom);\n}\n\nexport function useColumnUnitsMap(): Map<number, ExtUnit> | null {\n try {\n return scope.useAtomValue(columnUnitsMapAtom) as Map<number, ExtUnit>;\n } catch {\n return null;\n }\n}\n\nexport function useCompositeScale(): CompositeColumnScale {\n const ctx = useMacrostratColumnData();\n return useMemo(\n () => createCompositeScale(ctx.sections, true),\n [ctx.sections],\n );\n}\n"],"names":["useMemo","columnUnitsAtom","allowUnitSelectionAtom","selectedUnitIDAtom","h","UnitSelectionCallbackManager","ScopedProvider","createContext","useContext","scope","columnUnitsMapAtom","createCompositeScale"],"mappings":";;;;;;;;;AAgCO,SAAS,8BAAkD;AAAA,EAChE;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AACF,GAAgC;AAS9B,QAAM,kBAAkBA,MAAAA,QAAQ,MAAM;AACpC,QAAI,oBAAoB;AACtB,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,QAAQ,kBAAkB;AAAA,EACnD,GAAG,CAAA,CAAE;AAEL,QAAM,UAAmB;AAAA,IACvB,CAACC,KAAAA,iBAAiB,KAAK;AAAA,IACvB,CAACC,cAAAA,wBAAwB,eAAe;AAAA,IACxC,CAACC,cAAAA,oBAAoB,YAAY;AAAA,EAAA;AAGnC,MAAI,oBAA+B;AACnC,MAAI,iBAAiB;AACnB,wBAAoBC,WAAAA,QAAEC,4CAA8B,EAAE,eAAA,CAAgB;AAAA,EACxE;AAEA,SAAOD,WAAAA;AAAAA,IACLE,KAAAA;AAAAA,IACA;AAAA,MACE,OAAO;AAAA,IAAA;AAAA,IAET,CAAC,mBAAmB,QAAQ;AAAA,EAAA;AAEhC;AAeA,MAAM,8BACJC,MAAAA,cAAgD,IAAI;AAE/C,SAAS,6BAAiD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAY7B,QAAM,QAAQP,MAAAA,QAAQ,MAAM;AAE1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ,GAAG,CAAC,OAAO,UAAU,aAAa,QAAQ,CAAC;AAE3C,SAAOI,WAAAA;AAAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEFA,WAAAA,QAAE,4BAA4B,UAAU,EAAE,MAAA,GAAS,QAAQ;AAAA,EAAA;AAE/D;AAEO,SAAS,sBAAsB,OAAsC;AAI1E,SAAOA,WAAAA,QAAE,+BAA+B;AAAA,IACtC,GAAG;AAAA,IACH,oBAAoB;AAAA,EAAA,CACrB;AACH;AAEO,SAAS,0BAA0B;AACxC,QAAM,MAAMI,MAAAA,WAAW,2BAA2B;AAClD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB;AACnC,SAAOC,KAAAA,MAAM,aAAaR,oBAAe;AAC3C;AAEO,SAAS,oBAAiD;AAC/D,MAAI;AACF,WAAOQ,KAAAA,MAAM,aAAaC,uBAAkB;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAA0C;AACxD,QAAM,MAAM,wBAAA;AACZ,SAAOV,MAAAA;AAAAA,IACL,MAAMW,oCAAqB,IAAI,UAAU,IAAI;AAAA,IAC7C,CAAC,IAAI,QAAQ;AAAA,EAAA;AAEjB;;;;;;;;"}
@@ -5,6 +5,8 @@ const React = require("react");
5
5
  const h = require("@macrostrat/hyper");
6
6
  const columnComponents = require("@macrostrat/column-components");
7
7
  const store = require("../../data-provider/store.cjs");
8
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
9
+ const h__default = /* @__PURE__ */ _interopDefault(h);
8
10
  const inDomain = (scale, num) => {
9
11
  const domain = scale.domain();
10
12
  return domain[0] < num < domain[1];
@@ -43,7 +45,7 @@ const IsotopesDataArea = function(props) {
43
45
  }
44
46
  const lineLocator = d3Shape.line().x((d) => xScale(d[column])).y((d) => scale(d.height));
45
47
  const value = { pointLocator, lineLocator, corrected, system, clipY };
46
- return h(IsotopesDataContext.Provider, { value }, h("g.data", children));
48
+ return h__default.default(IsotopesDataContext.Provider, { value }, h__default.default("g.data", children));
47
49
  };
48
50
  const IsotopeDataPoint = function(props) {
49
51
  const { pointLocator } = React.useContext(IsotopesDataContext);
@@ -51,7 +53,7 @@ const IsotopeDataPoint = function(props) {
51
53
  const loc = pointLocator(datum);
52
54
  if (loc == null) return null;
53
55
  const [cx, cy] = loc;
54
- return h("circle", {
56
+ return h__default.default("circle", {
55
57
  key: datum.sample_id,
56
58
  cx,
57
59
  cy,
@@ -1 +1 @@
1
- {"version":3,"file":"data-area.cjs","sources":["../../../src/facets/carbon-isotopes/data-area.ts"],"sourcesContent":["import { line } from \"d3-shape\";\nimport { createContext, useContext } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { ColumnLayoutContext } from \"@macrostrat/column-components\";\nimport { useCompositeScale } from \"../../data-provider\";\n\nconst inDomain = (scale, num) => {\n const domain = scale.domain();\n return domain[0] < num < domain[1];\n};\n\nconst createPointLocator = function (opts) {\n const { xScale, scale, getHeight, ...rest } = opts;\n return function (d, s = 0) {\n const height = getHeight(d);\n if (!inDomain(scale, height)) return null;\n return [xScale(d.value), scale(height)];\n };\n};\n\nconst IsotopesDataContext = createContext(null);\n\nexport interface DataAreaProps {\n clipY: boolean;\n parameter: string;\n corrected: boolean;\n system: string;\n children: React.ReactNode;\n getHeight?: Function;\n}\n\nconst IsotopesDataArea = function (props: DataAreaProps) {\n const xScale = useContext(ColumnLayoutContext)?.xScale;\n\n const scale = useCompositeScale();\n\n let { corrected, system, children, getHeight, clipY = false } = props;\n if (getHeight == null) {\n getHeight = function (d) {\n if (d.height == null) {\n console.log(d);\n }\n return d.height;\n };\n }\n\n // Handlers for creating points and lines\n const pointLocator = createPointLocator({\n xScale,\n scale,\n corrected,\n system,\n getHeight,\n });\n\n let column = \"avg_\" + system;\n if (corrected) {\n column += \"_corr\";\n }\n const lineLocator = line()\n .x((d) => xScale(d[column]))\n // @ts-ignore\n .y((d) => scale(d.height));\n\n const value = { pointLocator, lineLocator, corrected, system, clipY };\n return h(IsotopesDataContext.Provider, { value }, h(\"g.data\", children));\n};\n\nconst IsotopeDataPoint = function (props) {\n const { pointLocator } = useContext(IsotopesDataContext);\n const { datum, strokeWidth, ...rest } = props;\n const loc = pointLocator(datum);\n if (loc == null) return null;\n const [cx, cy] = loc;\n\n return h(\"circle\", {\n key: datum.sample_id,\n cx,\n cy,\n r: 2,\n ...rest,\n });\n};\n\nconst IsotopeDataLine = function (props) {\n const { values: lineValues, ...rest } = props;\n const { lineLocator } = useContext(IsotopesDataContext);\n return h(\"path\", {\n d: lineLocator(lineValues),\n fill: \"transparent\",\n ...rest,\n });\n};\n\nconst useDataLocator = () => useContext(IsotopesDataContext);\n\nexport { IsotopesDataArea, IsotopeDataPoint, IsotopeDataLine, useDataLocator };\n"],"names":["createContext","useContext","ColumnLayoutContext","useCompositeScale","line"],"mappings":";;;;;;;AAMA,MAAM,WAAW,CAAC,OAAO,QAAQ;AAC/B,QAAM,SAAS,MAAM,OAAA;AACrB,SAAO,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC;AACnC;AAEA,MAAM,qBAAqB,SAAU,MAAM;AACzC,QAAM,EAAE,QAAQ,OAAO,WAAW,GAAG,SAAS;AAC9C,SAAO,SAAU,GAAG,IAAI,GAAG;AACzB,UAAM,SAAS,UAAU,CAAC;AAC1B,QAAI,CAAC,SAAS,OAAO,MAAM,EAAG,QAAO;AACrC,WAAO,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,MAAM,CAAC;AAAA,EACxC;AACF;AAEA,MAAM,sBAAsBA,MAAAA,cAAc,IAAI;AAW9C,MAAM,mBAAmB,SAAU,OAAsB;AACvD,QAAM,SAASC,MAAAA,WAAWC,iBAAAA,mBAAmB,GAAG;AAEhD,QAAM,QAAQC,MAAAA,kBAAA;AAEd,MAAI,EAAE,WAAW,QAAQ,UAAU,WAAW,QAAQ,UAAU;AAChE,MAAI,aAAa,MAAM;AACrB,gBAAY,SAAU,GAAG;AACvB,UAAI,EAAE,UAAU,MAAM;AACpB,gBAAQ,IAAI,CAAC;AAAA,MACf;AACA,aAAO,EAAE;AAAA,IACX;AAAA,EACF;AAGA,QAAM,eAAe,mBAAmB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,MAAI,SAAS,SAAS;AACtB,MAAI,WAAW;AACb,cAAU;AAAA,EACZ;AACA,QAAM,cAAcC,QAAAA,KAAA,EACjB,EAAE,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC,EAE1B,EAAE,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC;AAE3B,QAAM,QAAQ,EAAE,cAAc,aAAa,WAAW,QAAQ,MAAA;AAC9D,SAAO,EAAE,oBAAoB,UAAU,EAAE,SAAS,EAAE,UAAU,QAAQ,CAAC;AACzE;AAEA,MAAM,mBAAmB,SAAU,OAAO;AACxC,QAAM,EAAE,aAAA,IAAiBH,MAAAA,WAAW,mBAAmB;AACvD,QAAM,EAAE,OAAO,aAAa,GAAG,SAAS;AACxC,QAAM,MAAM,aAAa,KAAK;AAC9B,MAAI,OAAO,KAAM,QAAO;AACxB,QAAM,CAAC,IAAI,EAAE,IAAI;AAEjB,SAAO,EAAE,UAAU;AAAA,IACjB,KAAK,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,EAAA,CACJ;AACH;;;"}
1
+ {"version":3,"file":"data-area.cjs","sources":["../../../src/facets/carbon-isotopes/data-area.ts"],"sourcesContent":["import { line } from \"d3-shape\";\nimport { createContext, useContext } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { ColumnLayoutContext } from \"@macrostrat/column-components\";\nimport { useCompositeScale } from \"../../data-provider\";\n\nconst inDomain = (scale, num) => {\n const domain = scale.domain();\n return domain[0] < num < domain[1];\n};\n\nconst createPointLocator = function (opts) {\n const { xScale, scale, getHeight, ...rest } = opts;\n return function (d, s = 0) {\n const height = getHeight(d);\n if (!inDomain(scale, height)) return null;\n return [xScale(d.value), scale(height)];\n };\n};\n\nconst IsotopesDataContext = createContext(null);\n\nexport interface DataAreaProps {\n clipY: boolean;\n parameter: string;\n corrected: boolean;\n system: string;\n children: React.ReactNode;\n getHeight?: Function;\n}\n\nconst IsotopesDataArea = function (props: DataAreaProps) {\n const xScale = useContext(ColumnLayoutContext)?.xScale;\n\n const scale = useCompositeScale();\n\n let { corrected, system, children, getHeight, clipY = false } = props;\n if (getHeight == null) {\n getHeight = function (d) {\n if (d.height == null) {\n console.log(d);\n }\n return d.height;\n };\n }\n\n // Handlers for creating points and lines\n const pointLocator = createPointLocator({\n xScale,\n scale,\n corrected,\n system,\n getHeight,\n });\n\n let column = \"avg_\" + system;\n if (corrected) {\n column += \"_corr\";\n }\n const lineLocator = line()\n .x((d) => xScale(d[column]))\n // @ts-ignore\n .y((d) => scale(d.height));\n\n const value = { pointLocator, lineLocator, corrected, system, clipY };\n return h(IsotopesDataContext.Provider, { value }, h(\"g.data\", children));\n};\n\nconst IsotopeDataPoint = function (props) {\n const { pointLocator } = useContext(IsotopesDataContext);\n const { datum, strokeWidth, ...rest } = props;\n const loc = pointLocator(datum);\n if (loc == null) return null;\n const [cx, cy] = loc;\n\n return h(\"circle\", {\n key: datum.sample_id,\n cx,\n cy,\n r: 2,\n ...rest,\n });\n};\n\nconst IsotopeDataLine = function (props) {\n const { values: lineValues, ...rest } = props;\n const { lineLocator } = useContext(IsotopesDataContext);\n return h(\"path\", {\n d: lineLocator(lineValues),\n fill: \"transparent\",\n ...rest,\n });\n};\n\nconst useDataLocator = () => useContext(IsotopesDataContext);\n\nexport { IsotopesDataArea, IsotopeDataPoint, IsotopeDataLine, useDataLocator };\n"],"names":["createContext","useContext","ColumnLayoutContext","useCompositeScale","line","h"],"mappings":";;;;;;;;;AAMA,MAAM,WAAW,CAAC,OAAO,QAAQ;AAC/B,QAAM,SAAS,MAAM,OAAA;AACrB,SAAO,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC;AACnC;AAEA,MAAM,qBAAqB,SAAU,MAAM;AACzC,QAAM,EAAE,QAAQ,OAAO,WAAW,GAAG,SAAS;AAC9C,SAAO,SAAU,GAAG,IAAI,GAAG;AACzB,UAAM,SAAS,UAAU,CAAC;AAC1B,QAAI,CAAC,SAAS,OAAO,MAAM,EAAG,QAAO;AACrC,WAAO,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,MAAM,CAAC;AAAA,EACxC;AACF;AAEA,MAAM,sBAAsBA,MAAAA,cAAc,IAAI;AAW9C,MAAM,mBAAmB,SAAU,OAAsB;AACvD,QAAM,SAASC,MAAAA,WAAWC,iBAAAA,mBAAmB,GAAG;AAEhD,QAAM,QAAQC,MAAAA,kBAAA;AAEd,MAAI,EAAE,WAAW,QAAQ,UAAU,WAAW,QAAQ,UAAU;AAChE,MAAI,aAAa,MAAM;AACrB,gBAAY,SAAU,GAAG;AACvB,UAAI,EAAE,UAAU,MAAM;AACpB,gBAAQ,IAAI,CAAC;AAAA,MACf;AACA,aAAO,EAAE;AAAA,IACX;AAAA,EACF;AAGA,QAAM,eAAe,mBAAmB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,MAAI,SAAS,SAAS;AACtB,MAAI,WAAW;AACb,cAAU;AAAA,EACZ;AACA,QAAM,cAAcC,QAAAA,KAAA,EACjB,EAAE,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC,EAE1B,EAAE,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC;AAE3B,QAAM,QAAQ,EAAE,cAAc,aAAa,WAAW,QAAQ,MAAA;AAC9D,SAAOC,WAAAA,QAAE,oBAAoB,UAAU,EAAE,SAASA,WAAAA,QAAE,UAAU,QAAQ,CAAC;AACzE;AAEA,MAAM,mBAAmB,SAAU,OAAO;AACxC,QAAM,EAAE,aAAA,IAAiBJ,MAAAA,WAAW,mBAAmB;AACvD,QAAM,EAAE,OAAO,aAAa,GAAG,SAAS;AACxC,QAAM,MAAM,aAAa,KAAK;AAC9B,MAAI,OAAO,KAAM,QAAO;AACxB,QAAM,CAAC,IAAI,EAAE,IAAI;AAEjB,SAAOI,WAAAA,QAAE,UAAU;AAAA,IACjB,KAAK,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,EAAA,CACJ;AACH;;;"}
@@ -3,6 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const h = require("@macrostrat/hyper");
4
4
  const React = require("react");
5
5
  const uiComponents = require("@macrostrat/ui-components");
6
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
7
+ const h__default = /* @__PURE__ */ _interopDefault(h);
6
8
  const MeasurementDataContext = React.createContext(null);
7
9
  function MeasurementDataProvider(props) {
8
10
  const { children, ...params } = props;
@@ -11,7 +13,7 @@ function MeasurementDataProvider(props) {
11
13
  show_values: true,
12
14
  response: "long"
13
15
  });
14
- return h(MeasurementDataContext.Provider, { value: res, children });
16
+ return h__default.default(MeasurementDataContext.Provider, { value: res, children });
15
17
  }
16
18
  const useMeasurementData = () => React.useContext(MeasurementDataContext);
17
19
  exports.MeasurementDataContext = MeasurementDataContext;
@@ -1 +1 @@
1
- {"version":3,"file":"data-provider.cjs","sources":["../../../src/facets/carbon-isotopes/data-provider.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport { useContext, createContext } from \"react\";\nimport { useAPIResult } from \"@macrostrat/ui-components\";\n\nconst MeasurementDataContext = createContext(null);\n\nexport function MeasurementDataProvider(props) {\n const { children, ...params } = props;\n const res = useAPIResult(\"/measurements\", {\n ...params,\n show_values: true,\n response: \"long\",\n });\n return h(MeasurementDataContext.Provider, { value: res, children });\n}\n\nconst useMeasurementData = () => useContext(MeasurementDataContext);\n\nexport { useMeasurementData, MeasurementDataContext };\n"],"names":["createContext","useAPIResult","useContext"],"mappings":";;;;;AAIA,MAAM,yBAAyBA,MAAAA,cAAc,IAAI;AAE1C,SAAS,wBAAwB,OAAO;AAC7C,QAAM,EAAE,UAAU,GAAG,OAAA,IAAW;AAChC,QAAM,MAAMC,aAAAA,aAAa,iBAAiB;AAAA,IACxC,GAAG;AAAA,IACH,aAAa;AAAA,IACb,UAAU;AAAA,EAAA,CACX;AACD,SAAO,EAAE,uBAAuB,UAAU,EAAE,OAAO,KAAK,UAAU;AACpE;AAEA,MAAM,qBAAqB,MAAMC,MAAAA,WAAW,sBAAsB;;;;"}
1
+ {"version":3,"file":"data-provider.cjs","sources":["../../../src/facets/carbon-isotopes/data-provider.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport { useContext, createContext } from \"react\";\nimport { useAPIResult } from \"@macrostrat/ui-components\";\n\nconst MeasurementDataContext = createContext(null);\n\nexport function MeasurementDataProvider(props) {\n const { children, ...params } = props;\n const res = useAPIResult(\"/measurements\", {\n ...params,\n show_values: true,\n response: \"long\",\n });\n return h(MeasurementDataContext.Provider, { value: res, children });\n}\n\nconst useMeasurementData = () => useContext(MeasurementDataContext);\n\nexport { useMeasurementData, MeasurementDataContext };\n"],"names":["createContext","useAPIResult","h","useContext"],"mappings":";;;;;;;AAIA,MAAM,yBAAyBA,MAAAA,cAAc,IAAI;AAE1C,SAAS,wBAAwB,OAAO;AAC7C,QAAM,EAAE,UAAU,GAAG,OAAA,IAAW;AAChC,QAAM,MAAMC,aAAAA,aAAa,iBAAiB;AAAA,IACxC,GAAG;AAAA,IACH,aAAa;AAAA,IACb,UAAU;AAAA,EAAA,CACX;AACD,SAAOC,WAAAA,QAAE,uBAAuB,UAAU,EAAE,OAAO,KAAK,UAAU;AACpE;AAEA,MAAM,qBAAqB,MAAMC,MAAAA,WAAW,sBAAsB;;;;"}
@@ -11,14 +11,17 @@ const columnComponents = require("@macrostrat/column-components");
11
11
  const isotopesColumn_module = require("./isotopes-column.module.sass.cjs");
12
12
  const d3Scale = require("d3-scale");
13
13
  const store = require("../../data-provider/store.cjs");
14
- const h = h$1.styled(isotopesColumn_module.default);
14
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
15
+ const h__default = /* @__PURE__ */ _interopDefault(h$1);
16
+ const classNames__default = /* @__PURE__ */ _interopDefault(classNames);
17
+ const h = h__default.default.styled(isotopesColumn_module.default);
15
18
  function ScaleLine(props) {
16
19
  let { value, className, labelBottom, labelOffset, ...rest } = props;
17
20
  const { sections } = store.useMacrostratColumnData();
18
21
  const { xScale } = columnComponents.useColumnLayout();
19
22
  const x = xScale(value);
20
23
  const transform = `translate(${x})`;
21
- className = classNames(className, { zero: value === 0 });
24
+ className = classNames__default.default(className, { zero: value === 0 });
22
25
  return h("g.tick", { transform, className, key: value }, [
23
26
  h(
24
27
  "g.tick-lines",
@@ -1 +1 @@
1
- {"version":3,"file":"isotopes-column.cjs","sources":["../../../src/facets/carbon-isotopes/isotopes-column.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport hyper from \"@macrostrat/hyper\";\nimport classNames from \"classnames\";\nimport { AxisBottom } from \"@visx/axis\";\nimport { useMeasurementData } from \"./data-provider\";\n\nimport {\n IsotopesDataArea,\n useDataLocator,\n IsotopeDataPoint,\n} from \"./data-area\";\nimport { referenceMeasuresToColumn } from \"@macrostrat/stratigraphy-utils\";\nimport {\n SVG,\n ColumnLayoutProvider,\n useColumnLayout,\n} from \"@macrostrat/column-components\";\nimport {\n useMacrostratColumnData,\n useMacrostratUnits,\n} from \"../../data-provider\";\nimport styles from \"./isotopes-column.module.sass\";\nimport { scaleLinear } from \"d3-scale\";\n\nconst h = hyper.styled(styles);\n\ntype IsotopesTextProps = {\n datum: any;\n text: string;\n};\n\nfunction IsotopeText({ datum, text, ...rest }: IsotopesTextProps) {\n const { pointLocator } = useDataLocator();\n const [x, y] = pointLocator(datum);\n return h(\n \"text\",\n {\n x,\n y,\n ...rest,\n },\n text,\n );\n}\n\ninterface ScaleLineProps {\n value: number;\n className?: string;\n labelBottom?: boolean;\n labelOffset?: number;\n strokeDasharray?: string;\n stroke?: string | number;\n}\n\nfunction ScaleLine(props: ScaleLineProps) {\n let { value, className, labelBottom, labelOffset, ...rest } = props;\n const { sections } = useMacrostratColumnData();\n\n const { xScale } = useColumnLayout();\n const x = xScale(value);\n const transform = `translate(${x})`;\n className = classNames(className, { zero: value === 0 });\n return h(\"g.tick\", { transform, className, key: value }, [\n h(\n \"g.tick-lines\",\n sections.map((d) => {\n const { scaleInfo } = d;\n const y1 = scaleInfo.offset;\n const y2 = y1 + scaleInfo.pixelHeight;\n return h(\"line\", {\n y1,\n y2,\n strokeDasharray: props.strokeDasharray,\n strokeWidth: 1,\n });\n }),\n ),\n ]);\n}\n\nfunction unnestPoints(measures) {\n let points = [];\n for (const meas of measures) {\n const vals = meas.measure_value.map((d, i) => {\n return {\n value: d,\n age: meas.measure_age[i],\n position: meas.measure_position[i],\n unit_id: meas.unit_id,\n sample_id: meas.sample_no[i],\n measurement: meas.measurement,\n };\n });\n Array.prototype.push.apply(points, vals);\n }\n return points;\n}\n\ninterface IsotopesDatasetProps {\n color?: string;\n parameter: string;\n}\n\ninterface IsotopeColumnProps extends IsotopesDatasetProps {\n width: number;\n tickValues?: number[];\n label: string;\n domain?: [number, number];\n transform?: string;\n getHeight?: Function;\n nTicks?: number;\n showAxis?: boolean;\n}\n\nfunction IsotopesDataset(props) {\n const { parameter, color = \"dodgerblue\" } = props;\n const units = useMacrostratUnits();\n const measures = useMeasurementData() ?? [];\n\n const points = useMemo(() => {\n const data = measures.filter((d) => d.measurement === parameter);\n const refMeasures = referenceMeasuresToColumn(units, data);\n return unnestPoints(refMeasures);\n }, [measures, parameter, units]);\n\n return h(\n IsotopesDataArea,\n {\n getHeight(d) {\n return d.age;\n },\n } as any,\n h(\n \"g.data-points\",\n points.map((d) => {\n return h(IsotopeDataPoint, {\n datum: d,\n fill: color,\n });\n }),\n ),\n );\n}\n\nfunction IsotopesColumn(\n props: IsotopeColumnProps & { children?: React.ReactNode },\n) {\n const {\n width = 120,\n domain = [-14, 6],\n parameter,\n label,\n color = \"dodgerblue\",\n children = null,\n transform,\n getHeight,\n showAxis = true,\n tickValues: _tickVals,\n nTicks = 6,\n ...rest\n } = props;\n\n const { totalHeight } = useMacrostratColumnData();\n\n let _children: any = children;\n if (children == null && parameter != null) {\n _children = h(IsotopesDataset, { parameter, color, getHeight });\n }\n\n const xScale = useMemo(\n () => scaleLinear().domain(domain).range([0, width]),\n [domain, width],\n );\n\n const tickValues = _tickVals ?? xScale.ticks(nTicks);\n\n return h(\"div.isotopes-column\", [\n h(\n SVG,\n {\n height: totalHeight,\n innerWidth: width,\n paddingH: 15,\n },\n h(\n ColumnLayoutProvider,\n { width, xScale },\n h(\"g.isotopes-column\", { className: parameter, transform }, [\n h(ColumnScaleLines, {\n xScale,\n tickValues,\n width,\n ...rest,\n }),\n _children,\n ]),\n ),\n ),\n h.if(showAxis)(ColumnScaleAxis, {\n width,\n label: label ?? parameter,\n xScale,\n tickValues,\n ...rest,\n }),\n ]);\n}\n\nfunction ColumnScaleAxis(props) {\n const { label, xScale, width, showAxis = true, tickValues, ...rest } = props;\n\n return h(\"div.isotopes-scale-axis\", [\n h(\n SVG,\n {\n innerWidth: width,\n height: 45,\n paddingH: 15,\n },\n [\n h(AxisBottom, {\n scale: xScale,\n tickLength: 5,\n tickValues,\n stroke: \"var(--column-stroke-color)\",\n tickStroke: \"var(--column-stroke-color)\",\n ...rest,\n label,\n }),\n ],\n ),\n ]);\n}\n\nfunction ColumnScaleLines(props) {\n const { tickValues, xScale } = props;\n\n return h(\n \"g.scale-lines\",\n tickValues.map((value) => {\n return h(ScaleLine, { value });\n }),\n );\n}\n\nexport { IsotopesColumn, IsotopesDataset };\n"],"names":["hyper","styles","useMacrostratColumnData","useColumnLayout","useMacrostratUnits","useMeasurementData","useMemo","referenceMeasuresToColumn","IsotopesDataArea","IsotopeDataPoint","scaleLinear","SVG","ColumnLayoutProvider","AxisBottom"],"mappings":"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"}
1
+ {"version":3,"file":"isotopes-column.cjs","sources":["../../../src/facets/carbon-isotopes/isotopes-column.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport hyper from \"@macrostrat/hyper\";\nimport classNames from \"classnames\";\nimport { AxisBottom } from \"@visx/axis\";\nimport { useMeasurementData } from \"./data-provider\";\n\nimport {\n IsotopesDataArea,\n useDataLocator,\n IsotopeDataPoint,\n} from \"./data-area\";\nimport { referenceMeasuresToColumn } from \"@macrostrat/stratigraphy-utils\";\nimport {\n SVG,\n ColumnLayoutProvider,\n useColumnLayout,\n} from \"@macrostrat/column-components\";\nimport {\n useMacrostratColumnData,\n useMacrostratUnits,\n} from \"../../data-provider\";\nimport styles from \"./isotopes-column.module.sass\";\nimport { scaleLinear } from \"d3-scale\";\n\nconst h = hyper.styled(styles);\n\ntype IsotopesTextProps = {\n datum: any;\n text: string;\n};\n\nfunction IsotopeText({ datum, text, ...rest }: IsotopesTextProps) {\n const { pointLocator } = useDataLocator();\n const [x, y] = pointLocator(datum);\n return h(\n \"text\",\n {\n x,\n y,\n ...rest,\n },\n text,\n );\n}\n\ninterface ScaleLineProps {\n value: number;\n className?: string;\n labelBottom?: boolean;\n labelOffset?: number;\n strokeDasharray?: string;\n stroke?: string | number;\n}\n\nfunction ScaleLine(props: ScaleLineProps) {\n let { value, className, labelBottom, labelOffset, ...rest } = props;\n const { sections } = useMacrostratColumnData();\n\n const { xScale } = useColumnLayout();\n const x = xScale(value);\n const transform = `translate(${x})`;\n className = classNames(className, { zero: value === 0 });\n return h(\"g.tick\", { transform, className, key: value }, [\n h(\n \"g.tick-lines\",\n sections.map((d) => {\n const { scaleInfo } = d;\n const y1 = scaleInfo.offset;\n const y2 = y1 + scaleInfo.pixelHeight;\n return h(\"line\", {\n y1,\n y2,\n strokeDasharray: props.strokeDasharray,\n strokeWidth: 1,\n });\n }),\n ),\n ]);\n}\n\nfunction unnestPoints(measures) {\n let points = [];\n for (const meas of measures) {\n const vals = meas.measure_value.map((d, i) => {\n return {\n value: d,\n age: meas.measure_age[i],\n position: meas.measure_position[i],\n unit_id: meas.unit_id,\n sample_id: meas.sample_no[i],\n measurement: meas.measurement,\n };\n });\n Array.prototype.push.apply(points, vals);\n }\n return points;\n}\n\ninterface IsotopesDatasetProps {\n color?: string;\n parameter: string;\n}\n\ninterface IsotopeColumnProps extends IsotopesDatasetProps {\n width: number;\n tickValues?: number[];\n label: string;\n domain?: [number, number];\n transform?: string;\n getHeight?: Function;\n nTicks?: number;\n showAxis?: boolean;\n}\n\nfunction IsotopesDataset(props) {\n const { parameter, color = \"dodgerblue\" } = props;\n const units = useMacrostratUnits();\n const measures = useMeasurementData() ?? [];\n\n const points = useMemo(() => {\n const data = measures.filter((d) => d.measurement === parameter);\n const refMeasures = referenceMeasuresToColumn(units, data);\n return unnestPoints(refMeasures);\n }, [measures, parameter, units]);\n\n return h(\n IsotopesDataArea,\n {\n getHeight(d) {\n return d.age;\n },\n } as any,\n h(\n \"g.data-points\",\n points.map((d) => {\n return h(IsotopeDataPoint, {\n datum: d,\n fill: color,\n });\n }),\n ),\n );\n}\n\nfunction IsotopesColumn(\n props: IsotopeColumnProps & { children?: React.ReactNode },\n) {\n const {\n width = 120,\n domain = [-14, 6],\n parameter,\n label,\n color = \"dodgerblue\",\n children = null,\n transform,\n getHeight,\n showAxis = true,\n tickValues: _tickVals,\n nTicks = 6,\n ...rest\n } = props;\n\n const { totalHeight } = useMacrostratColumnData();\n\n let _children: any = children;\n if (children == null && parameter != null) {\n _children = h(IsotopesDataset, { parameter, color, getHeight });\n }\n\n const xScale = useMemo(\n () => scaleLinear().domain(domain).range([0, width]),\n [domain, width],\n );\n\n const tickValues = _tickVals ?? xScale.ticks(nTicks);\n\n return h(\"div.isotopes-column\", [\n h(\n SVG,\n {\n height: totalHeight,\n innerWidth: width,\n paddingH: 15,\n },\n h(\n ColumnLayoutProvider,\n { width, xScale },\n h(\"g.isotopes-column\", { className: parameter, transform }, [\n h(ColumnScaleLines, {\n xScale,\n tickValues,\n width,\n ...rest,\n }),\n _children,\n ]),\n ),\n ),\n h.if(showAxis)(ColumnScaleAxis, {\n width,\n label: label ?? parameter,\n xScale,\n tickValues,\n ...rest,\n }),\n ]);\n}\n\nfunction ColumnScaleAxis(props) {\n const { label, xScale, width, showAxis = true, tickValues, ...rest } = props;\n\n return h(\"div.isotopes-scale-axis\", [\n h(\n SVG,\n {\n innerWidth: width,\n height: 45,\n paddingH: 15,\n },\n [\n h(AxisBottom, {\n scale: xScale,\n tickLength: 5,\n tickValues,\n stroke: \"var(--column-stroke-color)\",\n tickStroke: \"var(--column-stroke-color)\",\n ...rest,\n label,\n }),\n ],\n ),\n ]);\n}\n\nfunction ColumnScaleLines(props) {\n const { tickValues, xScale } = props;\n\n return h(\n \"g.scale-lines\",\n tickValues.map((value) => {\n return h(ScaleLine, { value });\n }),\n );\n}\n\nexport { IsotopesColumn, IsotopesDataset };\n"],"names":["hyper","styles","useMacrostratColumnData","useColumnLayout","classNames","useMacrostratUnits","useMeasurementData","useMemo","referenceMeasuresToColumn","IsotopesDataArea","IsotopeDataPoint","scaleLinear","SVG","ColumnLayoutProvider","AxisBottom"],"mappings":";;;;;;;;;;;;;;;;AAwBA,MAAM,IAAIA,WAAAA,QAAM,OAAOC,6BAAM;AA8B7B,SAAS,UAAU,OAAuB;AACxC,MAAI,EAAE,OAAO,WAAW,aAAa,aAAa,GAAG,SAAS;AAC9D,QAAM,EAAE,SAAA,IAAaC,8BAAA;AAErB,QAAM,EAAE,OAAA,IAAWC,iCAAA;AACnB,QAAM,IAAI,OAAO,KAAK;AACtB,QAAM,YAAY,aAAa,CAAC;AAChC,cAAYC,oBAAAA,QAAW,WAAW,EAAE,MAAM,UAAU,GAAG;AACvD,SAAO,EAAE,UAAU,EAAE,WAAW,WAAW,KAAK,SAAS;AAAA,IACvD;AAAA,MACE;AAAA,MACA,SAAS,IAAI,CAAC,MAAM;AAClB,cAAM,EAAE,cAAc;AACtB,cAAM,KAAK,UAAU;AACrB,cAAM,KAAK,KAAK,UAAU;AAC1B,eAAO,EAAE,QAAQ;AAAA,UACf;AAAA,UACA;AAAA,UACA,iBAAiB,MAAM;AAAA,UACvB,aAAa;AAAA,QAAA,CACd;AAAA,MACH,CAAC;AAAA,IAAA;AAAA,EACH,CACD;AACH;AAEA,SAAS,aAAa,UAAU;AAC9B,MAAI,SAAS,CAAA;AACb,aAAW,QAAQ,UAAU;AAC3B,UAAM,OAAO,KAAK,cAAc,IAAI,CAAC,GAAG,MAAM;AAC5C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,KAAK,KAAK,YAAY,CAAC;AAAA,QACvB,UAAU,KAAK,iBAAiB,CAAC;AAAA,QACjC,SAAS,KAAK;AAAA,QACd,WAAW,KAAK,UAAU,CAAC;AAAA,QAC3B,aAAa,KAAK;AAAA,MAAA;AAAA,IAEtB,CAAC;AACD,UAAM,UAAU,KAAK,MAAM,QAAQ,IAAI;AAAA,EACzC;AACA,SAAO;AACT;AAkBA,SAAS,gBAAgB,OAAO;AAC9B,QAAM,EAAE,WAAW,QAAQ,aAAA,IAAiB;AAC5C,QAAM,QAAQC,MAAAA,mBAAA;AACd,QAAM,WAAWC,aAAAA,mBAAA,KAAwB,CAAA;AAEzC,QAAM,SAASC,MAAAA,QAAQ,MAAM;AAC3B,UAAM,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,gBAAgB,SAAS;AAC/D,UAAM,cAAcC,kBAAAA,0BAA0B,OAAO,IAAI;AACzD,WAAO,aAAa,WAAW;AAAA,EACjC,GAAG,CAAC,UAAU,WAAW,KAAK,CAAC;AAE/B,SAAO;AAAA,IACLC,SAAAA;AAAAA,IACA;AAAA,MACE,UAAU,GAAG;AACX,eAAO,EAAE;AAAA,MACX;AAAA,IAAA;AAAA,IAEF;AAAA,MACE;AAAA,MACA,OAAO,IAAI,CAAC,MAAM;AAChB,eAAO,EAAEC,SAAAA,kBAAkB;AAAA,UACzB,OAAO;AAAA,UACP,MAAM;AAAA,QAAA,CACP;AAAA,MACH,CAAC;AAAA,IAAA;AAAA,EACH;AAEJ;AAEA,SAAS,eACP,OACA;AACA,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS,CAAC,KAAK,CAAC;AAAA,IAChB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,EAAE,YAAA,IAAgBR,8BAAA;AAExB,MAAI,YAAiB;AACrB,MAAI,YAAY,QAAQ,aAAa,MAAM;AACzC,gBAAY,EAAE,iBAAiB,EAAE,WAAW,OAAO,WAAW;AAAA,EAChE;AAEA,QAAM,SAASK,MAAAA;AAAAA,IACb,MAAMI,QAAAA,YAAA,EAAc,OAAO,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,IACnD,CAAC,QAAQ,KAAK;AAAA,EAAA;AAGhB,QAAM,aAAa,aAAa,OAAO,MAAM,MAAM;AAEnD,SAAO,EAAE,uBAAuB;AAAA,IAC9B;AAAA,MACEC,iBAAAA;AAAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACEC,iBAAAA;AAAAA,QACA,EAAE,OAAO,OAAA;AAAA,QACT,EAAE,qBAAqB,EAAE,WAAW,WAAW,aAAa;AAAA,UAC1D,EAAE,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UAAA,CACJ;AAAA,UACD;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH;AAAA,IAEF,EAAE,GAAG,QAAQ,EAAE,iBAAiB;AAAA,MAC9B;AAAA,MACA,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AAAA,EAAA,CACF;AACH;AAEA,SAAS,gBAAgB,OAAO;AAC9B,QAAM,EAAE,OAAO,QAAQ,OAAO,WAAW,MAAM,YAAY,GAAG,KAAA,IAAS;AAEvE,SAAO,EAAE,2BAA2B;AAAA,IAClC;AAAA,MACED,iBAAAA;AAAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,EAAEE,KAAAA,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,UACZ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG;AAAA,UACH;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH;AAAA,EACF,CACD;AACH;AAEA,SAAS,iBAAiB,OAAO;AAC/B,QAAM,EAAE,YAAY,OAAA,IAAW;AAE/B,SAAO;AAAA,IACL;AAAA,IACA,WAAW,IAAI,CAAC,UAAU;AACxB,aAAO,EAAE,WAAW,EAAE,OAAO;AAAA,IAC/B,CAAC;AAAA,EAAA;AAEL;;;"}
@@ -11,7 +11,10 @@ const core = require("@blueprintjs/core");
11
11
  const base = require("../measurements/base.cjs");
12
12
  const store = require("../../data-provider/store.cjs");
13
13
  const utils = require("../../prepare-units/utils.cjs");
14
- const h = h$1.styled(index_module.default);
14
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
15
+ const h__default = /* @__PURE__ */ _interopDefault(h$1);
16
+ const classNames__default = /* @__PURE__ */ _interopDefault(classNames);
17
+ const h = h__default.default.styled(index_module);
15
18
  function prepareDetritalData(data, units, axisType) {
16
19
  const measurementsGrouped = d3Array.group(data, (d) => d.measuremeta_id);
17
20
  const resMap = /* @__PURE__ */ new Map();
@@ -82,7 +85,7 @@ function DetritalGroup(props) {
82
85
  const hideAxisLabels = spaceBelow < 60;
83
86
  return h(
84
87
  "div.detrital-group",
85
- { className: classNames({ "hide-axis": hideAxisLabels }) },
88
+ { className: classNames__default.default({ "hide-axis": hideAxisLabels }) },
86
89
  [
87
90
  h(
88
91
  dataComponents.DetritalSpectrumPlot,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/facets/detrital-zircon/index.ts"],"sourcesContent":["import {\n DetritalSpectrumPlot,\n DetritalSeries,\n usePlotArea,\n} from \"@macrostrat/data-components\";\nimport type { IUnit } from \"../../units/types\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDetritalMeasurements, MeasurementInfo } from \"./provider\";\nimport { useMemo } from \"react\";\nimport styles from \"./index.module.sass\";\nimport classNames from \"classnames\";\nimport {\n BaseMeasurementsColumn,\n mergeHeightRanges,\n ColumnMeasurementData,\n} from \"../measurements\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { useMacrostratColumnData } from \"../../data-provider\";\nimport { getUnitHeightRange } from \"../../prepare-units\";\nimport { NonIdealState, Spinner } from \"@blueprintjs/core\";\n\nconst h = hyper.styled(styles);\n\ninterface DetritalItemProps {\n note: DZMeasurementInfo;\n spacing?: {\n below?: number;\n above?: number;\n };\n width?: number;\n height?: number;\n color?: string;\n}\n\ninterface DZMeasurementInfo extends ColumnMeasurementData<MeasurementInfo[]> {\n units: IUnit[];\n}\n\nfunction prepareDetritalData(\n data: MeasurementInfo[],\n units: IUnit[],\n axisType: ColumnAxisType,\n) {\n /** Right now measurement data could be duplicated if there are multiple units linked to the same\n * measuremeta_id. THis happens because matches to units might be at a lower rank (e.g, if the column\n * contains Formations but the measurements are linked to a Group). To handle this, we group by measuremeta_id\n * and then create unique keys based on the set of units linked to each measurement.\n */\n\n // Group data by measuremeta_id\n const measurementsGrouped = group(data, (d) => d.measuremeta_id);\n\n const resMap = new Map<string, DZMeasurementInfo>();\n\n for (const measurements of measurementsGrouped.values()) {\n // Get a list of unique unit_ids for this measurement\n const unitIDs = new Set(measurements.map((m) => m.unit_id));\n const ids = Array.from(unitIDs);\n ids.sort();\n // Key is unique to the set of units\n const key = ids.join(\"-\");\n\n if (!resMap.has(key)) {\n const unitData = ids\n .map((id) => {\n return units.find((u) => u.unit_id === id);\n })\n .filter(Boolean);\n\n const positions = unitData.map((unit) => {\n const [height, top_height] = getUnitHeightRange(unit, axisType);\n return { height, top_height };\n });\n\n // merge positions (note: we could also have multiple separate notes per measurement)\n const pos = mergeHeightRanges(positions, axisType);\n\n resMap.set(key, {\n id: key,\n data: [],\n units: unitData as IUnit[],\n ...pos,\n });\n }\n resMap.get(key)!.data.push(measurements[0]);\n }\n\n return Array.from(resMap.values());\n}\n\nfunction DetritalColumn({ columnID, color = \"magenta\" }) {\n const data = useDetritalMeasurements({ col_id: columnID });\n\n const width = 400;\n const paddingLeft = 40;\n\n const spectrumWidth = width - paddingLeft;\n\n const noteComponent = useMemo(() => {\n return (props) => {\n return h(DetritalGroup, {\n width: spectrumWidth,\n height: 40,\n color,\n ...props,\n });\n };\n }, [width, color]);\n\n const { axisType, units } = useMacrostratColumnData();\n\n const data1 = useMemo(() => {\n if (data == null || units == null) return null;\n return prepareDetritalData(data, units, axisType);\n }, [data, units, axisType]);\n\n if (data1 == null) return h(NonIdealState, h(Spinner));\n\n return h(BaseMeasurementsColumn, {\n data: data1,\n noteComponent,\n deltaConnectorAttachment: 20,\n });\n}\n\nfunction DepositionalAge({ unit }) {\n const { xScale, height } = usePlotArea();\n\n const { t_age, b_age } = unit;\n const x = xScale(t_age);\n const x1 = xScale(b_age);\n\n return h(\"rect.depositional-age\", { x, width: x1 - x, y: 0, height });\n}\n\nfunction DetritalGroup(props: DetritalItemProps) {\n const { note, width, height, color, spacing } = props;\n const { data, units } = note;\n\n const _color = color;\n\n const spaceBelow = spacing?.below ?? 100;\n const hideAxisLabels = spaceBelow < 60;\n\n return h(\n \"div.detrital-group\",\n { className: classNames({ \"hide-axis\": hideAxisLabels }) },\n [\n h(\n DetritalSpectrumPlot,\n { width, innerHeight: height, showAxisLabels: true, paddingBottom: 40 },\n [\n units.map((unit) => {\n return h(DepositionalAge, { unit });\n }),\n data.map((d) => {\n return h(DetritalSeries, {\n bandwidth: 20,\n data: d.measure_value,\n color: _color,\n });\n }),\n ],\n ),\n ],\n );\n}\n\nexport { DetritalColumn, DetritalGroup };\n"],"names":["hyper","styles","group","getUnitHeightRange","mergeHeightRanges","useDetritalMeasurements","useMemo","useMacrostratColumnData","NonIdealState","Spinner","BaseMeasurementsColumn","usePlotArea","DetritalSpectrumPlot","DetritalSeries"],"mappings":";;;;;;;;;;;;;AAsBA,MAAM,IAAIA,IAAM,OAAOC,oBAAM;AAiB7B,SAAS,oBACP,MACA,OACA,UACA;AAQA,QAAM,sBAAsBC,QAAAA,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc;AAE/D,QAAM,6BAAa,IAAA;AAEnB,aAAW,gBAAgB,oBAAoB,UAAU;AAEvD,UAAM,UAAU,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAC1D,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,QAAI,KAAA;AAEJ,UAAM,MAAM,IAAI,KAAK,GAAG;AAExB,QAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,YAAM,WAAW,IACd,IAAI,CAAC,OAAO;AACX,eAAO,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE;AAAA,MAC3C,CAAC,EACA,OAAO,OAAO;AAEjB,YAAM,YAAY,SAAS,IAAI,CAAC,SAAS;AACvC,cAAM,CAAC,QAAQ,UAAU,IAAIC,MAAAA,mBAAmB,MAAM,QAAQ;AAC9D,eAAO,EAAE,QAAQ,WAAA;AAAA,MACnB,CAAC;AAGD,YAAM,MAAMC,KAAAA,kBAAkB,WAAW,QAAQ;AAEjD,aAAO,IAAI,KAAK;AAAA,QACd,IAAI;AAAA,QACJ,MAAM,CAAA;AAAA,QACN,OAAO;AAAA,QACP,GAAG;AAAA,MAAA,CACJ;AAAA,IACH;AACA,WAAO,IAAI,GAAG,EAAG,KAAK,KAAK,aAAa,CAAC,CAAC;AAAA,EAC5C;AAEA,SAAO,MAAM,KAAK,OAAO,OAAA,CAAQ;AACnC;AAEA,SAAS,eAAe,EAAE,UAAU,QAAQ,aAAa;AACvD,QAAM,OAAOC,SAAAA,wBAAwB,EAAE,QAAQ,UAAU;AAEzD,QAAM,QAAQ;AACd,QAAM,cAAc;AAEpB,QAAM,gBAAgB,QAAQ;AAE9B,QAAM,gBAAgBC,MAAAA,QAAQ,MAAM;AAClC,WAAO,CAAC,UAAU;AAChB,aAAO,EAAE,eAAe;AAAA,QACtB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA,GAAG;AAAA,MAAA,CACJ;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,QAAM,EAAE,UAAU,MAAA,IAAUC,8BAAA;AAE5B,QAAM,QAAQD,MAAAA,QAAQ,MAAM;AAC1B,QAAI,QAAQ,QAAQ,SAAS,KAAM,QAAO;AAC1C,WAAO,oBAAoB,MAAM,OAAO,QAAQ;AAAA,EAClD,GAAG,CAAC,MAAM,OAAO,QAAQ,CAAC;AAE1B,MAAI,SAAS,KAAM,QAAO,EAAEE,KAAAA,eAAe,EAAEC,KAAAA,OAAO,CAAC;AAErD,SAAO,EAAEC,KAAAA,wBAAwB;AAAA,IAC/B,MAAM;AAAA,IACN;AAAA,IACA,0BAA0B;AAAA,EAAA,CAC3B;AACH;AAEA,SAAS,gBAAgB,EAAE,QAAQ;AACjC,QAAM,EAAE,QAAQ,OAAA,IAAWC,2BAAA;AAE3B,QAAM,EAAE,OAAO,MAAA,IAAU;AACzB,QAAM,IAAI,OAAO,KAAK;AACtB,QAAM,KAAK,OAAO,KAAK;AAEvB,SAAO,EAAE,yBAAyB,EAAE,GAAG,OAAO,KAAK,GAAG,GAAG,GAAG,QAAQ;AACtE;AAEA,SAAS,cAAc,OAA0B;AAC/C,QAAM,EAAE,MAAM,OAAO,QAAQ,OAAO,YAAY;AAChD,QAAM,EAAE,MAAM,MAAA,IAAU;AAExB,QAAM,SAAS;AAEf,QAAM,aAAa,SAAS,SAAS;AACrC,QAAM,iBAAiB,aAAa;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,EAAE,WAAW,WAAW,EAAE,aAAa,eAAA,CAAgB,EAAA;AAAA,IACvD;AAAA,MACE;AAAA,QACEC,eAAAA;AAAAA,QACA,EAAE,OAAO,aAAa,QAAQ,gBAAgB,MAAM,eAAe,GAAA;AAAA,QACnE;AAAA,UACE,MAAM,IAAI,CAAC,SAAS;AAClB,mBAAO,EAAE,iBAAiB,EAAE,MAAM;AAAA,UACpC,CAAC;AAAA,UACD,KAAK,IAAI,CAAC,MAAM;AACd,mBAAO,EAAEC,eAAAA,gBAAgB;AAAA,cACvB,WAAW;AAAA,cACX,MAAM,EAAE;AAAA,cACR,OAAO;AAAA,YAAA,CACR;AAAA,UACH,CAAC;AAAA,QAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEJ;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/facets/detrital-zircon/index.ts"],"sourcesContent":["import {\n DetritalSpectrumPlot,\n DetritalSeries,\n usePlotArea,\n} from \"@macrostrat/data-components\";\nimport type { IUnit } from \"../../units/types\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDetritalMeasurements, MeasurementInfo } from \"./provider\";\nimport { useMemo } from \"react\";\nimport styles from \"./index.module.sass\";\nimport classNames from \"classnames\";\nimport {\n BaseMeasurementsColumn,\n mergeHeightRanges,\n ColumnMeasurementData,\n} from \"../measurements\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { useMacrostratColumnData } from \"../../data-provider\";\nimport { getUnitHeightRange } from \"../../prepare-units\";\nimport { NonIdealState, Spinner } from \"@blueprintjs/core\";\n\nconst h = hyper.styled(styles);\n\ninterface DetritalItemProps {\n note: DZMeasurementInfo;\n spacing?: {\n below?: number;\n above?: number;\n };\n width?: number;\n height?: number;\n color?: string;\n}\n\ninterface DZMeasurementInfo extends ColumnMeasurementData<MeasurementInfo[]> {\n units: IUnit[];\n}\n\nfunction prepareDetritalData(\n data: MeasurementInfo[],\n units: IUnit[],\n axisType: ColumnAxisType,\n) {\n /** Right now measurement data could be duplicated if there are multiple units linked to the same\n * measuremeta_id. THis happens because matches to units might be at a lower rank (e.g, if the column\n * contains Formations but the measurements are linked to a Group). To handle this, we group by measuremeta_id\n * and then create unique keys based on the set of units linked to each measurement.\n */\n\n // Group data by measuremeta_id\n const measurementsGrouped = group(data, (d) => d.measuremeta_id);\n\n const resMap = new Map<string, DZMeasurementInfo>();\n\n for (const measurements of measurementsGrouped.values()) {\n // Get a list of unique unit_ids for this measurement\n const unitIDs = new Set(measurements.map((m) => m.unit_id));\n const ids = Array.from(unitIDs);\n ids.sort();\n // Key is unique to the set of units\n const key = ids.join(\"-\");\n\n if (!resMap.has(key)) {\n const unitData = ids\n .map((id) => {\n return units.find((u) => u.unit_id === id);\n })\n .filter(Boolean);\n\n const positions = unitData.map((unit) => {\n const [height, top_height] = getUnitHeightRange(unit, axisType);\n return { height, top_height };\n });\n\n // merge positions (note: we could also have multiple separate notes per measurement)\n const pos = mergeHeightRanges(positions, axisType);\n\n resMap.set(key, {\n id: key,\n data: [],\n units: unitData as IUnit[],\n ...pos,\n });\n }\n resMap.get(key)!.data.push(measurements[0]);\n }\n\n return Array.from(resMap.values());\n}\n\nfunction DetritalColumn({ columnID, color = \"magenta\" }) {\n const data = useDetritalMeasurements({ col_id: columnID });\n\n const width = 400;\n const paddingLeft = 40;\n\n const spectrumWidth = width - paddingLeft;\n\n const noteComponent = useMemo(() => {\n return (props) => {\n return h(DetritalGroup, {\n width: spectrumWidth,\n height: 40,\n color,\n ...props,\n });\n };\n }, [width, color]);\n\n const { axisType, units } = useMacrostratColumnData();\n\n const data1 = useMemo(() => {\n if (data == null || units == null) return null;\n return prepareDetritalData(data, units, axisType);\n }, [data, units, axisType]);\n\n if (data1 == null) return h(NonIdealState, h(Spinner));\n\n return h(BaseMeasurementsColumn, {\n data: data1,\n noteComponent,\n deltaConnectorAttachment: 20,\n });\n}\n\nfunction DepositionalAge({ unit }) {\n const { xScale, height } = usePlotArea();\n\n const { t_age, b_age } = unit;\n const x = xScale(t_age);\n const x1 = xScale(b_age);\n\n return h(\"rect.depositional-age\", { x, width: x1 - x, y: 0, height });\n}\n\nfunction DetritalGroup(props: DetritalItemProps) {\n const { note, width, height, color, spacing } = props;\n const { data, units } = note;\n\n const _color = color;\n\n const spaceBelow = spacing?.below ?? 100;\n const hideAxisLabels = spaceBelow < 60;\n\n return h(\n \"div.detrital-group\",\n { className: classNames({ \"hide-axis\": hideAxisLabels }) },\n [\n h(\n DetritalSpectrumPlot,\n { width, innerHeight: height, showAxisLabels: true, paddingBottom: 40 },\n [\n units.map((unit) => {\n return h(DepositionalAge, { unit });\n }),\n data.map((d) => {\n return h(DetritalSeries, {\n bandwidth: 20,\n data: d.measure_value,\n color: _color,\n });\n }),\n ],\n ),\n ],\n );\n}\n\nexport { DetritalColumn, DetritalGroup };\n"],"names":["hyper","styles","group","getUnitHeightRange","mergeHeightRanges","useDetritalMeasurements","useMemo","useMacrostratColumnData","NonIdealState","Spinner","BaseMeasurementsColumn","usePlotArea","classNames","DetritalSpectrumPlot","DetritalSeries"],"mappings":";;;;;;;;;;;;;;;;AAsBA,MAAM,IAAIA,WAAAA,QAAM,OAAOC,YAAM;AAiB7B,SAAS,oBACP,MACA,OACA,UACA;AAQA,QAAM,sBAAsBC,QAAAA,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc;AAE/D,QAAM,6BAAa,IAAA;AAEnB,aAAW,gBAAgB,oBAAoB,UAAU;AAEvD,UAAM,UAAU,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAC1D,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,QAAI,KAAA;AAEJ,UAAM,MAAM,IAAI,KAAK,GAAG;AAExB,QAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,YAAM,WAAW,IACd,IAAI,CAAC,OAAO;AACX,eAAO,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE;AAAA,MAC3C,CAAC,EACA,OAAO,OAAO;AAEjB,YAAM,YAAY,SAAS,IAAI,CAAC,SAAS;AACvC,cAAM,CAAC,QAAQ,UAAU,IAAIC,MAAAA,mBAAmB,MAAM,QAAQ;AAC9D,eAAO,EAAE,QAAQ,WAAA;AAAA,MACnB,CAAC;AAGD,YAAM,MAAMC,KAAAA,kBAAkB,WAAW,QAAQ;AAEjD,aAAO,IAAI,KAAK;AAAA,QACd,IAAI;AAAA,QACJ,MAAM,CAAA;AAAA,QACN,OAAO;AAAA,QACP,GAAG;AAAA,MAAA,CACJ;AAAA,IACH;AACA,WAAO,IAAI,GAAG,EAAG,KAAK,KAAK,aAAa,CAAC,CAAC;AAAA,EAC5C;AAEA,SAAO,MAAM,KAAK,OAAO,OAAA,CAAQ;AACnC;AAEA,SAAS,eAAe,EAAE,UAAU,QAAQ,aAAa;AACvD,QAAM,OAAOC,SAAAA,wBAAwB,EAAE,QAAQ,UAAU;AAEzD,QAAM,QAAQ;AACd,QAAM,cAAc;AAEpB,QAAM,gBAAgB,QAAQ;AAE9B,QAAM,gBAAgBC,MAAAA,QAAQ,MAAM;AAClC,WAAO,CAAC,UAAU;AAChB,aAAO,EAAE,eAAe;AAAA,QACtB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA,GAAG;AAAA,MAAA,CACJ;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,QAAM,EAAE,UAAU,MAAA,IAAUC,8BAAA;AAE5B,QAAM,QAAQD,MAAAA,QAAQ,MAAM;AAC1B,QAAI,QAAQ,QAAQ,SAAS,KAAM,QAAO;AAC1C,WAAO,oBAAoB,MAAM,OAAO,QAAQ;AAAA,EAClD,GAAG,CAAC,MAAM,OAAO,QAAQ,CAAC;AAE1B,MAAI,SAAS,KAAM,QAAO,EAAEE,KAAAA,eAAe,EAAEC,KAAAA,OAAO,CAAC;AAErD,SAAO,EAAEC,KAAAA,wBAAwB;AAAA,IAC/B,MAAM;AAAA,IACN;AAAA,IACA,0BAA0B;AAAA,EAAA,CAC3B;AACH;AAEA,SAAS,gBAAgB,EAAE,QAAQ;AACjC,QAAM,EAAE,QAAQ,OAAA,IAAWC,2BAAA;AAE3B,QAAM,EAAE,OAAO,MAAA,IAAU;AACzB,QAAM,IAAI,OAAO,KAAK;AACtB,QAAM,KAAK,OAAO,KAAK;AAEvB,SAAO,EAAE,yBAAyB,EAAE,GAAG,OAAO,KAAK,GAAG,GAAG,GAAG,QAAQ;AACtE;AAEA,SAAS,cAAc,OAA0B;AAC/C,QAAM,EAAE,MAAM,OAAO,QAAQ,OAAO,YAAY;AAChD,QAAM,EAAE,MAAM,MAAA,IAAU;AAExB,QAAM,SAAS;AAEf,QAAM,aAAa,SAAS,SAAS;AACrC,QAAM,iBAAiB,aAAa;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,EAAE,WAAWC,oBAAAA,QAAW,EAAE,aAAa,eAAA,CAAgB,EAAA;AAAA,IACvD;AAAA,MACE;AAAA,QACEC,eAAAA;AAAAA,QACA,EAAE,OAAO,aAAa,QAAQ,gBAAgB,MAAM,eAAe,GAAA;AAAA,QACnE;AAAA,UACE,MAAM,IAAI,CAAC,SAAS;AAClB,mBAAO,EAAE,iBAAiB,EAAE,MAAM;AAAA,UACpC,CAAC;AAAA,UACD,KAAK,IAAI,CAAC,MAAM;AACd,mBAAO,EAAEC,eAAAA,gBAAgB;AAAA,cACvB,WAAW;AAAA,cACX,MAAM,EAAE;AAAA,cACR,OAAO;AAAA,YAAA,CACR;AAAA,UACH,CAAC;AAAA,QAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEJ;;;"}
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
2
  const styles = {
4
3
  "depositional-age": "_depositional-age_ngsgr_1",
5
4
  "detrital-group": "_detrital-group_ngsgr_8",
@@ -7,5 +6,5 @@ const styles = {
7
6
  "dz-spectra": "_dz-spectra_ngsgr_16",
8
7
  "floating-axis": "_floating-axis_ngsgr_20"
9
8
  };
10
- exports.default = styles;
9
+ module.exports = styles;
11
10
  //# sourceMappingURL=index.module.sass.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"index.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -8,7 +8,9 @@ const d3Scale = require("d3-scale");
8
8
  const base = require("../measurements/base.cjs");
9
9
  const store = require("../../data-provider/store.cjs");
10
10
  const utils = require("../../prepare-units/utils.cjs");
11
- const h = h$1.styled(taxonRanges_module.default);
11
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
12
+ const h__default = /* @__PURE__ */ _interopDefault(h$1);
13
+ const h = h__default.default.styled(taxonRanges_module);
12
14
  function PBDBFossilsColumn({
13
15
  columnID,
14
16
  type = provider.FossilDataType.Collections
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/facets/fossils/index.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport {\n FossilDataType,\n type PBDBCollection,\n type PBDBEntity,\n type PBDBOccurrence,\n useFossilData,\n} from \"./provider\";\nimport type { IUnit } from \"../../units\";\nimport {\n BaseMeasurementsColumn,\n ColumnMeasurementData,\n MeasurementHeightData,\n standardizeMeasurementHeight,\n groupNotesByPixelDistance,\n TruncatedList,\n} from \"../measurements\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport {\n useCompositeScale,\n useMacrostratColumnData,\n} from \"../../data-provider\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport styles from \"./taxon-ranges.module.sass\";\nimport {\n CompositeColumnScale,\n getPositionWithinUnit,\n getUnitHeightRange,\n} from \"../../prepare-units\";\nimport { scaleLinear } from \"d3-scale\";\n\nexport {\n FossilDataType,\n type PBDBCollection,\n type PBDBEntity,\n type PBDBOccurrence,\n useFossilData,\n};\nexport * from \"./taxon-ranges\";\n\nconst h = hyper.styled(styles);\n\nexport function PBDBFossilsColumn({\n columnID,\n type = FossilDataType.Collections,\n}: {\n columnID: number;\n type: FossilDataType;\n}) {\n const data = useFossilData(columnID, type);\n const { axisType, units } = useMacrostratColumnData();\n const scale = useCompositeScale();\n\n if (data == null || units == null || scale == null) return null;\n\n const data1 = preparePBDBData(data, units, scale, axisType);\n\n return h(BaseMeasurementsColumn, {\n data: data1,\n noteComponent: FossilInfo,\n focusedNoteComponent: FossilInfo,\n className: \"fossil-collections\",\n });\n}\n\ninterface FossilItemProps {\n note: {\n data: PBDBCollection[];\n unit?: IUnit;\n };\n spacing?: {\n below?: number;\n above?: number;\n };\n width?: number;\n height?: number;\n color?: string;\n focused?: boolean;\n maxItems?: number;\n}\n\nfunction FossilInfo(props: FossilItemProps) {\n const { note, maxItems, focused = false } = props;\n const { data } = note;\n // Sort collections by name\n data.sort((a, b) => {\n const nameA = a.best_name ?? a.cltn_name ?? \"\";\n const nameB = b.best_name ?? b.cltn_name ?? \"\";\n return nameA.localeCompare(nameB);\n });\n\n return h(TruncatedList, {\n data,\n className: \"fossil-collections\",\n itemRenderer: PBDBCollectionLink,\n maxItems: focused ? Infinity : (maxItems ?? 5),\n });\n}\n\nfunction PBDBCollectionLink({\n data,\n}: {\n data: PBDBCollection | PBDBOccurrence;\n}) {\n /** A link to a PBDB collection that handles either an occurrence or collection object */\n return h(\n \"a.link-id\",\n {\n href: `https://paleobiodb.org/app/collections#display=col:${data.cltn_id}`,\n target: \"_blank\",\n onClick(e) {\n e.stopPropagation();\n },\n },\n data.best_name ?? data.cltn_name,\n );\n}\n\ninterface PreparePBDBDataOptions {\n /** If set, group close notes within this distance (in pixels in display space)\n * into a single note. If a number is provided, that number is used as the distance,\n * otherwise a default of 5 pixels is used.\n */\n groupCloseNotes?: boolean | number;\n}\n\nfunction preparePBDBData<T extends PBDBEntity>(\n data: T[],\n units: UnitLong[],\n scale: CompositeColumnScale,\n axisType: ColumnAxisType,\n options?: PreparePBDBDataOptions,\n) {\n /** Prepare PBDB fossil data for display in a measurements column */\n const { groupCloseNotes = true } = options ?? {};\n const groupDistance =\n typeof groupCloseNotes === \"number\" ? groupCloseNotes : 10;\n\n // Map of data to its defined height ranges\n const dataMap = new Map<string, ColumnMeasurementData<T[]>>();\n\n // Todo: if we wanted, we could add a step where we group notes that are too close together here...\n\n for (const d of data) {\n const range = getHeightRangeForPBDBEntity(d, units, axisType);\n\n if (range == null) continue;\n const { height, top_height } = range;\n // compose the key based on height info\n let key = `${height}`;\n if (top_height != null) {\n key += `-${top_height}`;\n }\n\n // Group by height key\n if (!dataMap.has(key)) {\n dataMap.set(key, {\n height,\n top_height: top_height ?? height,\n data: [],\n id: key,\n });\n }\n dataMap.get(key)!.data.push(d);\n }\n\n return groupNotesByPixelDistance(\n Array.from(dataMap.values()),\n scale,\n axisType,\n groupDistance,\n );\n}\n\nfunction getHeightRangeForPBDBEntity<T extends PBDBEntity>(\n d: T,\n units: UnitLong[],\n axisType: ColumnAxisType,\n): MeasurementHeightData | null {\n let height: number | null = null;\n if (d.slb != null && d.slu == \"mbsf\") {\n // Meters below sea floor - special case for eODP where we have\n // specific depth data referenced\n height = Number(d.slb);\n if (axisType === ColumnAxisType.DEPTH) {\n // Data is already in depth units\n return { height };\n }\n }\n if (d.unit_id == null) return null;\n if (height != null) {\n // If we have both height and unit info, we need to adjust the height\n // to fit whatever scale type we're using.\n // TODO: we could improve how this works by having concurrent age and\n // height scales, which would allow us to do this without having to\n // reference to a specific unit.\n const unit = units.find((u) => u.unit_id === d.unit_id);\n if (unit == null) return null;\n const relHeight = getRelativePositionInUnit(\n height,\n unit,\n ColumnAxisType.DEPTH,\n );\n if (relHeight == null) return null;\n height = getPositionWithinUnit(relHeight, unit, axisType);\n return { height };\n }\n // We can just get the height within the unit, clipped to the unit boundaries\n return standardizeMeasurementHeight({ unit_id: d.unit_id }, units, axisType);\n}\n\nfunction getRelativePositionInUnit(\n pos: number,\n unit: UnitLong,\n axisType: ColumnAxisType,\n): number | null {\n // This is the inverse of getPositionWithinUnit\n const heights = getUnitHeightRange(unit, axisType, false);\n const scale = scaleLinear(heights).domain([0, 1]);\n const relPos = scale.invert(pos);\n if (relPos < 0 || relPos > 1) return null;\n return relPos;\n}\n"],"names":["hyper","styles","FossilDataType","useFossilData","useMacrostratColumnData","useCompositeScale","BaseMeasurementsColumn","TruncatedList","groupNotesByPixelDistance","ColumnAxisType","getPositionWithinUnit","standardizeMeasurementHeight","getUnitHeightRange","scaleLinear"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/facets/fossils/index.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport {\n FossilDataType,\n type PBDBCollection,\n type PBDBEntity,\n type PBDBOccurrence,\n useFossilData,\n} from \"./provider\";\nimport type { IUnit } from \"../../units\";\nimport {\n BaseMeasurementsColumn,\n ColumnMeasurementData,\n MeasurementHeightData,\n standardizeMeasurementHeight,\n groupNotesByPixelDistance,\n TruncatedList,\n} from \"../measurements\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport {\n useCompositeScale,\n useMacrostratColumnData,\n} from \"../../data-provider\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport styles from \"./taxon-ranges.module.sass\";\nimport {\n CompositeColumnScale,\n getPositionWithinUnit,\n getUnitHeightRange,\n} from \"../../prepare-units\";\nimport { scaleLinear } from \"d3-scale\";\n\nexport {\n FossilDataType,\n type PBDBCollection,\n type PBDBEntity,\n type PBDBOccurrence,\n useFossilData,\n};\nexport * from \"./taxon-ranges\";\n\nconst h = hyper.styled(styles);\n\nexport function PBDBFossilsColumn({\n columnID,\n type = FossilDataType.Collections,\n}: {\n columnID: number;\n type: FossilDataType;\n}) {\n const data = useFossilData(columnID, type);\n const { axisType, units } = useMacrostratColumnData();\n const scale = useCompositeScale();\n\n if (data == null || units == null || scale == null) return null;\n\n const data1 = preparePBDBData(data, units, scale, axisType);\n\n return h(BaseMeasurementsColumn, {\n data: data1,\n noteComponent: FossilInfo,\n focusedNoteComponent: FossilInfo,\n className: \"fossil-collections\",\n });\n}\n\ninterface FossilItemProps {\n note: {\n data: PBDBCollection[];\n unit?: IUnit;\n };\n spacing?: {\n below?: number;\n above?: number;\n };\n width?: number;\n height?: number;\n color?: string;\n focused?: boolean;\n maxItems?: number;\n}\n\nfunction FossilInfo(props: FossilItemProps) {\n const { note, maxItems, focused = false } = props;\n const { data } = note;\n // Sort collections by name\n data.sort((a, b) => {\n const nameA = a.best_name ?? a.cltn_name ?? \"\";\n const nameB = b.best_name ?? b.cltn_name ?? \"\";\n return nameA.localeCompare(nameB);\n });\n\n return h(TruncatedList, {\n data,\n className: \"fossil-collections\",\n itemRenderer: PBDBCollectionLink,\n maxItems: focused ? Infinity : (maxItems ?? 5),\n });\n}\n\nfunction PBDBCollectionLink({\n data,\n}: {\n data: PBDBCollection | PBDBOccurrence;\n}) {\n /** A link to a PBDB collection that handles either an occurrence or collection object */\n return h(\n \"a.link-id\",\n {\n href: `https://paleobiodb.org/app/collections#display=col:${data.cltn_id}`,\n target: \"_blank\",\n onClick(e) {\n e.stopPropagation();\n },\n },\n data.best_name ?? data.cltn_name,\n );\n}\n\ninterface PreparePBDBDataOptions {\n /** If set, group close notes within this distance (in pixels in display space)\n * into a single note. If a number is provided, that number is used as the distance,\n * otherwise a default of 5 pixels is used.\n */\n groupCloseNotes?: boolean | number;\n}\n\nfunction preparePBDBData<T extends PBDBEntity>(\n data: T[],\n units: UnitLong[],\n scale: CompositeColumnScale,\n axisType: ColumnAxisType,\n options?: PreparePBDBDataOptions,\n) {\n /** Prepare PBDB fossil data for display in a measurements column */\n const { groupCloseNotes = true } = options ?? {};\n const groupDistance =\n typeof groupCloseNotes === \"number\" ? groupCloseNotes : 10;\n\n // Map of data to its defined height ranges\n const dataMap = new Map<string, ColumnMeasurementData<T[]>>();\n\n // Todo: if we wanted, we could add a step where we group notes that are too close together here...\n\n for (const d of data) {\n const range = getHeightRangeForPBDBEntity(d, units, axisType);\n\n if (range == null) continue;\n const { height, top_height } = range;\n // compose the key based on height info\n let key = `${height}`;\n if (top_height != null) {\n key += `-${top_height}`;\n }\n\n // Group by height key\n if (!dataMap.has(key)) {\n dataMap.set(key, {\n height,\n top_height: top_height ?? height,\n data: [],\n id: key,\n });\n }\n dataMap.get(key)!.data.push(d);\n }\n\n return groupNotesByPixelDistance(\n Array.from(dataMap.values()),\n scale,\n axisType,\n groupDistance,\n );\n}\n\nfunction getHeightRangeForPBDBEntity<T extends PBDBEntity>(\n d: T,\n units: UnitLong[],\n axisType: ColumnAxisType,\n): MeasurementHeightData | null {\n let height: number | null = null;\n if (d.slb != null && d.slu == \"mbsf\") {\n // Meters below sea floor - special case for eODP where we have\n // specific depth data referenced\n height = Number(d.slb);\n if (axisType === ColumnAxisType.DEPTH) {\n // Data is already in depth units\n return { height };\n }\n }\n if (d.unit_id == null) return null;\n if (height != null) {\n // If we have both height and unit info, we need to adjust the height\n // to fit whatever scale type we're using.\n // TODO: we could improve how this works by having concurrent age and\n // height scales, which would allow us to do this without having to\n // reference to a specific unit.\n const unit = units.find((u) => u.unit_id === d.unit_id);\n if (unit == null) return null;\n const relHeight = getRelativePositionInUnit(\n height,\n unit,\n ColumnAxisType.DEPTH,\n );\n if (relHeight == null) return null;\n height = getPositionWithinUnit(relHeight, unit, axisType);\n return { height };\n }\n // We can just get the height within the unit, clipped to the unit boundaries\n return standardizeMeasurementHeight({ unit_id: d.unit_id }, units, axisType);\n}\n\nfunction getRelativePositionInUnit(\n pos: number,\n unit: UnitLong,\n axisType: ColumnAxisType,\n): number | null {\n // This is the inverse of getPositionWithinUnit\n const heights = getUnitHeightRange(unit, axisType, false);\n const scale = scaleLinear(heights).domain([0, 1]);\n const relPos = scale.invert(pos);\n if (relPos < 0 || relPos > 1) return null;\n return relPos;\n}\n"],"names":["hyper","styles","FossilDataType","useFossilData","useMacrostratColumnData","useCompositeScale","BaseMeasurementsColumn","TruncatedList","groupNotesByPixelDistance","ColumnAxisType","getPositionWithinUnit","standardizeMeasurementHeight","getUnitHeightRange","scaleLinear"],"mappings":"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"}
@@ -8,7 +8,9 @@ const columnComponents = require("@macrostrat/column-components");
8
8
  const taxonRanges_module = require("./taxon-ranges.module.sass.cjs");
9
9
  const React = require("react");
10
10
  const store = require("../../data-provider/store.cjs");
11
- const h = h$1.styled(taxonRanges_module.default);
11
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
12
+ const h__default = /* @__PURE__ */ _interopDefault(h$1);
13
+ const h = h__default.default.styled(taxonRanges_module);
12
14
  function PBDBOccurrencesMatrix({ columnID }) {
13
15
  const data = provider.useFossilData(columnID, provider.FossilDataType.Occurrences);
14
16
  const col = store.useMacrostratColumnData();
@@ -1 +1 @@
1
- {"version":3,"file":"taxon-ranges.cjs","sources":["../../../src/facets/fossils/taxon-ranges.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport {\n FossilDataType,\n PBDBEntity,\n PBDBOccurrence,\n useFossilData,\n} from \"./provider\";\nimport { Box, useElementSize } from \"@macrostrat/ui-components\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType, ColumnSVG } from \"@macrostrat/column-components\";\nimport {\n useMacrostratColumnData,\n useCompositeScale,\n} from \"../../data-provider\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport styles from \"./taxon-ranges.module.sass\";\nimport { useRef } from \"react\";\n\nconst h = hyper.styled(styles);\n\nexport function PBDBOccurrencesMatrix({ columnID }) {\n /* A column for a matrix of taxon occurrences displayed as a table beside the main column. This will\n eventually be extended with first/last occurrence markers and range bars.\n */\n const data = useFossilData(columnID, FossilDataType.Occurrences);\n const col = useMacrostratColumnData();\n const scale = useCompositeScale();\n\n if (data == null) return null;\n\n // convert the data to a map\n const occurrenceMap = new Map(group(data, (d) => d.unit_id)) as Map<\n number,\n PBDBOccurrence[]\n >;\n\n const matrix = createOccurrenceMatrix(col.units, occurrenceMap, col.axisType);\n\n const { taxonRanges } = matrix;\n\n const padding = 16;\n const spacing = 16;\n\n const taxonEntries = Array.from(taxonRanges.entries());\n //const taxon = taxonEntries.slice(0, 50); // limit to top 50 taxa\n\n const width = padding * 2 + spacing * taxonEntries.length;\n\n return h(Box, { className: \"taxon-ranges\", width, height: col.totalHeight }, [\n h(TaxonOccurrenceLabels, {\n taxonEntries,\n padding,\n spacing,\n scale,\n }),\n h(\n ColumnSVG,\n {\n width: padding * 2 + spacing * taxonEntries.length,\n },\n h(\n \"g.taxa-occurrences-matrix\",\n taxonEntries.map(([taxonName, ranges], rowIndex) => {\n const xPosition = padding + rowIndex * spacing;\n return h(\"g\", { transform: `translate(${xPosition})` }, [\n ranges.map(([top, bottom]) => {\n return h(\"line\", {\n y1: scale(top),\n y2: scale(bottom),\n });\n }),\n ]);\n }),\n ),\n ),\n ]);\n}\n\nfunction TaxonOccurrenceLabels({ taxonEntries, padding, spacing, scale }) {\n return h(\"div.taxon-labels\", [\n taxonEntries.map(([taxonName, ranges], rowIndex) => {\n const top = ranges[0]?.[0] ?? 0;\n let topPx = scale(top) - 20;\n if (topPx < 200) topPx = 0;\n\n return h(TaxonLabel, {\n top: topPx,\n left: padding + rowIndex * spacing,\n taxonName,\n });\n }),\n ]);\n}\n\nfunction TaxonLabel({ top, left, taxonName }) {\n const ref = useRef();\n const textSize = useElementSize(ref);\n const labelWidth = textSize?.height ?? 200;\n return h(\n \"div.taxon-label\",\n {\n style: {\n top: `${top}px`,\n marginLeft: `${left}px`,\n \"--label-width\": `${labelWidth}px`,\n },\n },\n h(\"div.taxon-label-inner\", h(\"div.taxon-label-text\", { ref }, taxonName)),\n );\n}\n\ntype TaxonUnitMap = Map<string, Set<number>>;\n\ninterface OccurrenceMatrixData {\n occurrenceMap: Map<number, PBDBEntity[]>; // Map of unit IDs to occurrences (original data)\n taxonUnitMap: TaxonUnitMap; // Map of taxon names to sets of unit IDs\n taxonOccurrenceMap: Map<string, PBDBOccurrence[]>; // Map of taxon names to occurrences\n taxonRanges: Map<string, [number, number][]>; // Map of taxon names to [top, bottom] pixel ranges\n}\n\nfunction TaxonOccurrenceEntry({\n xPosition,\n ranges,\n scale,\n name,\n}: {\n xPosition: number;\n units: Set<number>;\n ranges: any;\n scale: any;\n name: string;\n}) {\n return h(\"g\", { transform: `translate(${xPosition})` }, [\n ranges.map(([top, bottom]) => {\n return h(\"line\", {\n y1: scale(top),\n y2: scale(bottom),\n });\n }),\n ]);\n}\n\nfunction createOccurrenceMatrix(\n units: UnitLong[],\n data: Map<number, PBDBOccurrence[]>,\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): OccurrenceMatrixData {\n const taxonUnitMap = new Map<string, Set<number>>();\n const taxonOccurrenceMap = new Map<string, PBDBOccurrence[]>();\n\n for (const [unit_id, occurrences] of data.entries()) {\n for (const occ of occurrences) {\n const taxonName = occ.best_name ?? occ.taxon_name;\n if (!taxonUnitMap.has(taxonName)) {\n taxonUnitMap.set(taxonName, new Set());\n taxonOccurrenceMap.set(taxonName, []);\n }\n taxonUnitMap.get(taxonName).add(unit_id);\n taxonOccurrenceMap.get(taxonName).push(occ);\n }\n }\n\n // sort the taxon occurrence map by number of occurrences\n const sortedTaxa = Array.from(taxonUnitMap.entries()).sort((a, b) => {\n // Sort alphabetically by taxon name\n return b[0].localeCompare(a[0]);\n });\n\n const taxonRanges = new Map<string, [number, number][]>();\n for (const [taxonName, unitSet] of taxonUnitMap.entries()) {\n taxonRanges.set(\n taxonName,\n accumulatePresenceDomains(units, unitSet, axisType),\n );\n }\n\n return {\n occurrenceMap: data,\n taxonUnitMap: new Map(sortedTaxa),\n taxonOccurrenceMap: taxonOccurrenceMap,\n taxonRanges,\n };\n}\n\nfunction accumulatePresenceDomains(\n unit: UnitLong[],\n presenceUnits: Set<number>,\n axisType: ColumnAxisType,\n): Array<[number, number]> {\n const domains: Array<[number, number]> = [];\n let currentDomain: [number, number] | null = null;\n\n for (const u of unit) {\n if (presenceUnits.has(u.unit_id)) {\n if (currentDomain == null) {\n if (\n axisType == ColumnAxisType.DEPTH ||\n axisType == ColumnAxisType.HEIGHT\n ) {\n currentDomain = [u.t_pos, u.b_pos];\n } else {\n currentDomain = [u.t_age, u.b_age];\n }\n } else {\n if (\n axisType == ColumnAxisType.DEPTH ||\n axisType == ColumnAxisType.HEIGHT\n ) {\n currentDomain[1] = u.b_pos;\n } else {\n currentDomain[1] = u.b_age;\n }\n }\n } else {\n if (currentDomain != null) {\n domains.push(currentDomain);\n currentDomain = null;\n }\n }\n }\n\n if (currentDomain != null) {\n domains.push(currentDomain);\n }\n\n return domains;\n}\n"],"names":["hyper","styles","useFossilData","FossilDataType","useMacrostratColumnData","useCompositeScale","group","Box","ColumnSVG","useRef","useElementSize","ColumnAxisType"],"mappings":"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"}
1
+ {"version":3,"file":"taxon-ranges.cjs","sources":["../../../src/facets/fossils/taxon-ranges.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport {\n FossilDataType,\n PBDBEntity,\n PBDBOccurrence,\n useFossilData,\n} from \"./provider\";\nimport { Box, useElementSize } from \"@macrostrat/ui-components\";\nimport { group } from \"d3-array\";\nimport { ColumnAxisType, ColumnSVG } from \"@macrostrat/column-components\";\nimport {\n useMacrostratColumnData,\n useCompositeScale,\n} from \"../../data-provider\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport styles from \"./taxon-ranges.module.sass\";\nimport { useRef } from \"react\";\n\nconst h = hyper.styled(styles);\n\nexport function PBDBOccurrencesMatrix({ columnID }) {\n /* A column for a matrix of taxon occurrences displayed as a table beside the main column. This will\n eventually be extended with first/last occurrence markers and range bars.\n */\n const data = useFossilData(columnID, FossilDataType.Occurrences);\n const col = useMacrostratColumnData();\n const scale = useCompositeScale();\n\n if (data == null) return null;\n\n // convert the data to a map\n const occurrenceMap = new Map(group(data, (d) => d.unit_id)) as Map<\n number,\n PBDBOccurrence[]\n >;\n\n const matrix = createOccurrenceMatrix(col.units, occurrenceMap, col.axisType);\n\n const { taxonRanges } = matrix;\n\n const padding = 16;\n const spacing = 16;\n\n const taxonEntries = Array.from(taxonRanges.entries());\n //const taxon = taxonEntries.slice(0, 50); // limit to top 50 taxa\n\n const width = padding * 2 + spacing * taxonEntries.length;\n\n return h(Box, { className: \"taxon-ranges\", width, height: col.totalHeight }, [\n h(TaxonOccurrenceLabels, {\n taxonEntries,\n padding,\n spacing,\n scale,\n }),\n h(\n ColumnSVG,\n {\n width: padding * 2 + spacing * taxonEntries.length,\n },\n h(\n \"g.taxa-occurrences-matrix\",\n taxonEntries.map(([taxonName, ranges], rowIndex) => {\n const xPosition = padding + rowIndex * spacing;\n return h(\"g\", { transform: `translate(${xPosition})` }, [\n ranges.map(([top, bottom]) => {\n return h(\"line\", {\n y1: scale(top),\n y2: scale(bottom),\n });\n }),\n ]);\n }),\n ),\n ),\n ]);\n}\n\nfunction TaxonOccurrenceLabels({ taxonEntries, padding, spacing, scale }) {\n return h(\"div.taxon-labels\", [\n taxonEntries.map(([taxonName, ranges], rowIndex) => {\n const top = ranges[0]?.[0] ?? 0;\n let topPx = scale(top) - 20;\n if (topPx < 200) topPx = 0;\n\n return h(TaxonLabel, {\n top: topPx,\n left: padding + rowIndex * spacing,\n taxonName,\n });\n }),\n ]);\n}\n\nfunction TaxonLabel({ top, left, taxonName }) {\n const ref = useRef();\n const textSize = useElementSize(ref);\n const labelWidth = textSize?.height ?? 200;\n return h(\n \"div.taxon-label\",\n {\n style: {\n top: `${top}px`,\n marginLeft: `${left}px`,\n \"--label-width\": `${labelWidth}px`,\n },\n },\n h(\"div.taxon-label-inner\", h(\"div.taxon-label-text\", { ref }, taxonName)),\n );\n}\n\ntype TaxonUnitMap = Map<string, Set<number>>;\n\ninterface OccurrenceMatrixData {\n occurrenceMap: Map<number, PBDBEntity[]>; // Map of unit IDs to occurrences (original data)\n taxonUnitMap: TaxonUnitMap; // Map of taxon names to sets of unit IDs\n taxonOccurrenceMap: Map<string, PBDBOccurrence[]>; // Map of taxon names to occurrences\n taxonRanges: Map<string, [number, number][]>; // Map of taxon names to [top, bottom] pixel ranges\n}\n\nfunction TaxonOccurrenceEntry({\n xPosition,\n ranges,\n scale,\n name,\n}: {\n xPosition: number;\n units: Set<number>;\n ranges: any;\n scale: any;\n name: string;\n}) {\n return h(\"g\", { transform: `translate(${xPosition})` }, [\n ranges.map(([top, bottom]) => {\n return h(\"line\", {\n y1: scale(top),\n y2: scale(bottom),\n });\n }),\n ]);\n}\n\nfunction createOccurrenceMatrix(\n units: UnitLong[],\n data: Map<number, PBDBOccurrence[]>,\n axisType: ColumnAxisType = ColumnAxisType.AGE,\n): OccurrenceMatrixData {\n const taxonUnitMap = new Map<string, Set<number>>();\n const taxonOccurrenceMap = new Map<string, PBDBOccurrence[]>();\n\n for (const [unit_id, occurrences] of data.entries()) {\n for (const occ of occurrences) {\n const taxonName = occ.best_name ?? occ.taxon_name;\n if (!taxonUnitMap.has(taxonName)) {\n taxonUnitMap.set(taxonName, new Set());\n taxonOccurrenceMap.set(taxonName, []);\n }\n taxonUnitMap.get(taxonName).add(unit_id);\n taxonOccurrenceMap.get(taxonName).push(occ);\n }\n }\n\n // sort the taxon occurrence map by number of occurrences\n const sortedTaxa = Array.from(taxonUnitMap.entries()).sort((a, b) => {\n // Sort alphabetically by taxon name\n return b[0].localeCompare(a[0]);\n });\n\n const taxonRanges = new Map<string, [number, number][]>();\n for (const [taxonName, unitSet] of taxonUnitMap.entries()) {\n taxonRanges.set(\n taxonName,\n accumulatePresenceDomains(units, unitSet, axisType),\n );\n }\n\n return {\n occurrenceMap: data,\n taxonUnitMap: new Map(sortedTaxa),\n taxonOccurrenceMap: taxonOccurrenceMap,\n taxonRanges,\n };\n}\n\nfunction accumulatePresenceDomains(\n unit: UnitLong[],\n presenceUnits: Set<number>,\n axisType: ColumnAxisType,\n): Array<[number, number]> {\n const domains: Array<[number, number]> = [];\n let currentDomain: [number, number] | null = null;\n\n for (const u of unit) {\n if (presenceUnits.has(u.unit_id)) {\n if (currentDomain == null) {\n if (\n axisType == ColumnAxisType.DEPTH ||\n axisType == ColumnAxisType.HEIGHT\n ) {\n currentDomain = [u.t_pos, u.b_pos];\n } else {\n currentDomain = [u.t_age, u.b_age];\n }\n } else {\n if (\n axisType == ColumnAxisType.DEPTH ||\n axisType == ColumnAxisType.HEIGHT\n ) {\n currentDomain[1] = u.b_pos;\n } else {\n currentDomain[1] = u.b_age;\n }\n }\n } else {\n if (currentDomain != null) {\n domains.push(currentDomain);\n currentDomain = null;\n }\n }\n }\n\n if (currentDomain != null) {\n domains.push(currentDomain);\n }\n\n return domains;\n}\n"],"names":["hyper","styles","useFossilData","FossilDataType","useMacrostratColumnData","useCompositeScale","group","Box","ColumnSVG","useRef","useElementSize","ColumnAxisType"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
2
  const styles = {
4
3
  "taxa-occurrences-matrix": "_taxa-occurrences-matrix_14h8h_1",
5
4
  "taxon-name": "_taxon-name_14h8h_8",
@@ -9,5 +8,5 @@ const styles = {
9
8
  "taxon-label-inner": "_taxon-label-inner_14h8h_35",
10
9
  "taxon-label-text": "_taxon-label-text_14h8h_42"
11
10
  };
12
- exports.default = styles;
11
+ module.exports = styles;
13
12
  //# sourceMappingURL=taxon-ranges.module.sass.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taxon-ranges.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"taxon-ranges.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -5,7 +5,9 @@ const base_module = require("./base.module.sass.cjs");
5
5
  const notes = require("../../notes.cjs");
6
6
  const columnComponents = require("@macrostrat/column-components");
7
7
  const utils = require("../../prepare-units/utils.cjs");
8
- const h = h$1.styled(base_module.default);
8
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
9
+ const h__default = /* @__PURE__ */ _interopDefault(h$1);
10
+ const h = h__default.default.styled(base_module);
9
11
  function standardizeMeasurementHeight(pos, units, axisType) {
10
12
  if ("height" in pos) {
11
13
  return pos;
@@ -1 +1 @@
1
- {"version":3,"file":"base.cjs","sources":["../../../src/facets/measurements/base.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport styles from \"./base.module.sass\";\nimport {\n type CompositeColumnScale,\n getPositionWithinUnit,\n getUnitHeightRange,\n} from \"../../prepare-units\";\nimport { ColumnNotes } from \"../../notes\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nconst h = hyper.styled(styles);\n\ntype GetHeightRangeFn<T> = (\n data: T,\n unit: UnitLong | null,\n axisType: ColumnAxisType,\n) => MeasurementHeightData;\n\nexport interface BaseMeasurementsColumnProps<T> {\n data: T[];\n noteComponent?: any;\n width?: number;\n paddingLeft?: number;\n className?: string;\n // TODO: these props are confusing\n getUnitID?: (d: T) => number | string;\n isMatchingUnit?: (d: T, unit: UnitLong) => boolean;\n getHeightRange?: GetHeightRangeFn<T>;\n deltaConnectorAttachment?: number;\n focusedNoteComponent?: any;\n}\n\nexport interface ColumnMeasurementData<T = any> extends MeasurementHeightData {\n data: T;\n id: string | number;\n}\n\ntype MeasurementPositionInformation =\n | MeasurementHeightData\n | {\n unit_id: number;\n unit_rel_pos?: number;\n };\n\nexport function standardizeMeasurementHeight(\n pos: MeasurementPositionInformation,\n units: UnitLong[],\n axisType: ColumnAxisType,\n): MeasurementHeightData | null {\n /** Get a standardized height representation from position information for\n * a measurement\n */\n if (\"height\" in pos) {\n return pos;\n }\n const unit = units.find((u) => u.unit_id === pos.unit_id);\n if (unit == null) {\n return null;\n }\n if (pos.unit_rel_pos != null) {\n const res = getPositionWithinUnit(pos.unit_rel_pos, unit, axisType);\n if (res == null) return null;\n return { height: res };\n } else {\n const [height, top_height] = getUnitHeightRange(unit, axisType);\n return { height, top_height };\n }\n}\n\nexport function mergeHeightRanges(\n data: MeasurementHeightData[],\n axisType: ColumnAxisType,\n): MeasurementHeightData {\n /** Merge multiple height ranges into a single range */\n const heights = [];\n\n for (const d of data) {\n heights.push(d.height);\n if (d.top_height != null) {\n heights.push(d.top_height);\n }\n }\n\n let height: number;\n let top_height: number;\n if (axisType === ColumnAxisType.AGE || axisType === ColumnAxisType.DEPTH) {\n height = Math.max(...heights);\n top_height = Math.min(...heights);\n } else {\n height = Math.min(...heights);\n top_height = Math.max(...heights);\n }\n\n if (top_height === height) {\n return { height };\n }\n return { height, top_height };\n}\n\nexport type MeasurementHeightData = {\n height: number;\n top_height?: number | null;\n};\n\nexport function BaseMeasurementsColumn({\n data,\n noteComponent,\n width = 500,\n paddingLeft = 40,\n className,\n deltaConnectorAttachment,\n focusedNoteComponent,\n}: BaseMeasurementsColumnProps<any>) {\n if (data == null) return null;\n\n return h(\n \"div.measurements-column\",\n { className },\n h(ColumnNotes, {\n width,\n paddingLeft,\n notes: data,\n noteComponent,\n deltaConnectorAttachment,\n focusedNoteComponent,\n }),\n );\n}\n\ninterface TruncatedListProps {\n data: any[];\n className?: string;\n maxItems?: number;\n itemRenderer?: (props: { data: any }) => any;\n}\n\nexport function TruncatedList({\n data,\n className,\n maxItems = 5,\n itemRenderer = (p) => h(\"span\", p.data),\n}: TruncatedListProps) {\n let tooMany = null;\n let d1 = data;\n if (data.length > maxItems) {\n const n = data.length - maxItems;\n d1 = data.slice(0, maxItems);\n tooMany = h(\"li.too-many\", `and ${n} more`);\n }\n\n return h(\"ul.truncated-list\", { className }, [\n d1.map((d, i) => {\n return h(\"li.element\", { key: i }, h(itemRenderer, { data: d }));\n }),\n tooMany,\n ]);\n}\n\nexport function groupNotesByPixelDistance<T = any>(\n data: ColumnMeasurementData<T[]>[],\n scale: CompositeColumnScale,\n axisType: ColumnAxisType,\n groupDistance: number,\n) {\n /** Group notes that are within a certain pixel distance of each other\n * in display space\n */\n if (data.length === 0 || groupDistance <= 0) return data;\n if (axisType === ColumnAxisType.AGE || axisType === ColumnAxisType.DEPTH) {\n data.sort((a, b) => b.height - a.height);\n } else {\n // Sort data by height (ascending up the column)\n data.sort((a, b) => a.height - b.height);\n }\n\n const groupedData: ColumnMeasurementData<T[]>[] = [];\n let currentGroup: ColumnMeasurementData<T[]> | null = null;\n let currentGroupPosition: number = Infinity;\n\n for (const d of data) {\n // Check distance from current max position\n // Pixels go up as we go down in the section\n\n // The _top_ of the next group must be within groupDistance of the\n // _bottom_ of the current group. This makes sure that we don't collapse\n // groups that are separated by a large distance\n const distance = currentGroupPosition - scale(d.top_height ?? d.height);\n\n if (distance <= groupDistance) {\n if (currentGroup == null) {\n throw new Error(\"Current group is null when it shouldn't be\");\n }\n // Merge into current group\n currentGroup.data.push(...d.data);\n // Update height range\n const top_height = d.top_height ?? d.height;\n if (\n axisType === ColumnAxisType.AGE ||\n axisType === ColumnAxisType.DEPTH\n ) {\n // Inverted axis\n currentGroup.top_height = Math.min(currentGroup.top_height, top_height);\n } else {\n currentGroup.top_height = Math.max(currentGroup.top_height, top_height);\n }\n currentGroup.id = `${currentGroup.height}-${currentGroup.top_height}`;\n } else {\n // Start a new group\n currentGroup = { ...d, data: [...d.data] };\n currentGroupPosition =\n scale(currentGroup.height) ??\n scale(currentGroup.top_height) ??\n Infinity;\n groupedData.push(currentGroup);\n }\n }\n\n return groupedData;\n}\n"],"names":["hyper","styles","getPositionWithinUnit","getUnitHeightRange","ColumnAxisType","ColumnNotes"],"mappings":"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"}
1
+ {"version":3,"file":"base.cjs","sources":["../../../src/facets/measurements/base.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport styles from \"./base.module.sass\";\nimport {\n type CompositeColumnScale,\n getPositionWithinUnit,\n getUnitHeightRange,\n} from \"../../prepare-units\";\nimport { ColumnNotes } from \"../../notes\";\nimport { UnitLong } from \"@macrostrat/api-types\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nconst h = hyper.styled(styles);\n\ntype GetHeightRangeFn<T> = (\n data: T,\n unit: UnitLong | null,\n axisType: ColumnAxisType,\n) => MeasurementHeightData;\n\nexport interface BaseMeasurementsColumnProps<T> {\n data: T[];\n noteComponent?: any;\n width?: number;\n paddingLeft?: number;\n className?: string;\n // TODO: these props are confusing\n getUnitID?: (d: T) => number | string;\n isMatchingUnit?: (d: T, unit: UnitLong) => boolean;\n getHeightRange?: GetHeightRangeFn<T>;\n deltaConnectorAttachment?: number;\n focusedNoteComponent?: any;\n}\n\nexport interface ColumnMeasurementData<T = any> extends MeasurementHeightData {\n data: T;\n id: string | number;\n}\n\ntype MeasurementPositionInformation =\n | MeasurementHeightData\n | {\n unit_id: number;\n unit_rel_pos?: number;\n };\n\nexport function standardizeMeasurementHeight(\n pos: MeasurementPositionInformation,\n units: UnitLong[],\n axisType: ColumnAxisType,\n): MeasurementHeightData | null {\n /** Get a standardized height representation from position information for\n * a measurement\n */\n if (\"height\" in pos) {\n return pos;\n }\n const unit = units.find((u) => u.unit_id === pos.unit_id);\n if (unit == null) {\n return null;\n }\n if (pos.unit_rel_pos != null) {\n const res = getPositionWithinUnit(pos.unit_rel_pos, unit, axisType);\n if (res == null) return null;\n return { height: res };\n } else {\n const [height, top_height] = getUnitHeightRange(unit, axisType);\n return { height, top_height };\n }\n}\n\nexport function mergeHeightRanges(\n data: MeasurementHeightData[],\n axisType: ColumnAxisType,\n): MeasurementHeightData {\n /** Merge multiple height ranges into a single range */\n const heights = [];\n\n for (const d of data) {\n heights.push(d.height);\n if (d.top_height != null) {\n heights.push(d.top_height);\n }\n }\n\n let height: number;\n let top_height: number;\n if (axisType === ColumnAxisType.AGE || axisType === ColumnAxisType.DEPTH) {\n height = Math.max(...heights);\n top_height = Math.min(...heights);\n } else {\n height = Math.min(...heights);\n top_height = Math.max(...heights);\n }\n\n if (top_height === height) {\n return { height };\n }\n return { height, top_height };\n}\n\nexport type MeasurementHeightData = {\n height: number;\n top_height?: number | null;\n};\n\nexport function BaseMeasurementsColumn({\n data,\n noteComponent,\n width = 500,\n paddingLeft = 40,\n className,\n deltaConnectorAttachment,\n focusedNoteComponent,\n}: BaseMeasurementsColumnProps<any>) {\n if (data == null) return null;\n\n return h(\n \"div.measurements-column\",\n { className },\n h(ColumnNotes, {\n width,\n paddingLeft,\n notes: data,\n noteComponent,\n deltaConnectorAttachment,\n focusedNoteComponent,\n }),\n );\n}\n\ninterface TruncatedListProps {\n data: any[];\n className?: string;\n maxItems?: number;\n itemRenderer?: (props: { data: any }) => any;\n}\n\nexport function TruncatedList({\n data,\n className,\n maxItems = 5,\n itemRenderer = (p) => h(\"span\", p.data),\n}: TruncatedListProps) {\n let tooMany = null;\n let d1 = data;\n if (data.length > maxItems) {\n const n = data.length - maxItems;\n d1 = data.slice(0, maxItems);\n tooMany = h(\"li.too-many\", `and ${n} more`);\n }\n\n return h(\"ul.truncated-list\", { className }, [\n d1.map((d, i) => {\n return h(\"li.element\", { key: i }, h(itemRenderer, { data: d }));\n }),\n tooMany,\n ]);\n}\n\nexport function groupNotesByPixelDistance<T = any>(\n data: ColumnMeasurementData<T[]>[],\n scale: CompositeColumnScale,\n axisType: ColumnAxisType,\n groupDistance: number,\n) {\n /** Group notes that are within a certain pixel distance of each other\n * in display space\n */\n if (data.length === 0 || groupDistance <= 0) return data;\n if (axisType === ColumnAxisType.AGE || axisType === ColumnAxisType.DEPTH) {\n data.sort((a, b) => b.height - a.height);\n } else {\n // Sort data by height (ascending up the column)\n data.sort((a, b) => a.height - b.height);\n }\n\n const groupedData: ColumnMeasurementData<T[]>[] = [];\n let currentGroup: ColumnMeasurementData<T[]> | null = null;\n let currentGroupPosition: number = Infinity;\n\n for (const d of data) {\n // Check distance from current max position\n // Pixels go up as we go down in the section\n\n // The _top_ of the next group must be within groupDistance of the\n // _bottom_ of the current group. This makes sure that we don't collapse\n // groups that are separated by a large distance\n const distance = currentGroupPosition - scale(d.top_height ?? d.height);\n\n if (distance <= groupDistance) {\n if (currentGroup == null) {\n throw new Error(\"Current group is null when it shouldn't be\");\n }\n // Merge into current group\n currentGroup.data.push(...d.data);\n // Update height range\n const top_height = d.top_height ?? d.height;\n if (\n axisType === ColumnAxisType.AGE ||\n axisType === ColumnAxisType.DEPTH\n ) {\n // Inverted axis\n currentGroup.top_height = Math.min(currentGroup.top_height, top_height);\n } else {\n currentGroup.top_height = Math.max(currentGroup.top_height, top_height);\n }\n currentGroup.id = `${currentGroup.height}-${currentGroup.top_height}`;\n } else {\n // Start a new group\n currentGroup = { ...d, data: [...d.data] };\n currentGroupPosition =\n scale(currentGroup.height) ??\n scale(currentGroup.top_height) ??\n Infinity;\n groupedData.push(currentGroup);\n }\n }\n\n return groupedData;\n}\n"],"names":["hyper","styles","getPositionWithinUnit","getUnitHeightRange","ColumnAxisType","ColumnNotes"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
2
  const styles = {
4
3
  "truncated-list": "_truncated-list_120po_1",
5
4
  "too-many": "_too-many_120po_16"
6
5
  };
7
- exports.default = styles;
6
+ module.exports = styles;
8
7
  //# sourceMappingURL=base.module.sass.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"base.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}