@macrostrat/column-views 3.3.4 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/age-axis.d.ts +3 -3
  3. package/dist/column.cjs +2 -1
  4. package/dist/column.cjs.map +1 -1
  5. package/dist/column.d.ts +3 -3
  6. package/dist/column.js +2 -1
  7. package/dist/column.js.map +1 -1
  8. package/dist/correlation-chart/main.d.ts +1 -1
  9. package/dist/correlation-chart/prepare-data.d.ts +1 -1
  10. package/dist/data-provider/unit-selection.cjs +7 -3
  11. package/dist/data-provider/unit-selection.cjs.map +1 -1
  12. package/dist/data-provider/unit-selection.d.ts +3 -2
  13. package/dist/data-provider/unit-selection.js +7 -3
  14. package/dist/data-provider/unit-selection.js.map +1 -1
  15. package/dist/facets/carbon-isotopes/data-area.d.ts +1 -1
  16. package/dist/facets/carbon-isotopes/data-provider.d.ts +1 -1
  17. package/dist/facets/measurements/base.d.ts +2 -2
  18. package/dist/index.cjs +13 -8
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +7 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/maps/column-correlation/state.d.ts +1 -1
  23. package/dist/maps/column-navigation/mapbox/state.d.ts +1 -1
  24. package/dist/maps/column-navigation/svg/data-fetcher.d.ts +1 -1
  25. package/dist/maps/column-navigation/svg/layers.d.ts +3 -3
  26. package/dist/maps/inset-map/index.d.ts +1 -1
  27. package/dist/maps/layers/columns.d.ts +1 -1
  28. package/dist/maps/layers/units.d.ts +1 -1
  29. package/dist/prepare-units/composite-scale.d.ts +1 -1
  30. package/dist/prepare-units/dynamic-scales.d.ts +1 -1
  31. package/dist/prepare-units/helpers.cjs +83 -49
  32. package/dist/prepare-units/helpers.cjs.map +1 -1
  33. package/dist/prepare-units/helpers.d.ts +21 -4
  34. package/dist/prepare-units/helpers.js +84 -50
  35. package/dist/prepare-units/helpers.js.map +1 -1
  36. package/dist/prepare-units/index.cjs.map +1 -1
  37. package/dist/prepare-units/index.d.ts +1 -1
  38. package/dist/prepare-units/index.js.map +1 -1
  39. package/dist/prepare-units/types.d.ts +2 -2
  40. package/dist/prepare-units/utils.d.ts +2 -2
  41. package/dist/section.cjs +1 -2
  42. package/dist/section.cjs.map +1 -1
  43. package/dist/section.d.ts +1 -1
  44. package/dist/section.js +1 -2
  45. package/dist/section.js.map +1 -1
  46. package/dist/unit-details/age-range.cjs.map +1 -1
  47. package/dist/unit-details/age-range.d.ts +2 -1
  48. package/dist/unit-details/age-range.js.map +1 -1
  49. package/dist/unit-details/identifiers.cjs +56 -0
  50. package/dist/unit-details/identifiers.cjs.map +1 -0
  51. package/dist/unit-details/identifiers.d.ts +31 -0
  52. package/dist/unit-details/identifiers.js +54 -0
  53. package/dist/unit-details/identifiers.js.map +1 -0
  54. package/dist/unit-details/index.d.ts +2 -0
  55. package/dist/unit-details/panel.cjs +73 -147
  56. package/dist/unit-details/panel.cjs.map +1 -1
  57. package/dist/unit-details/panel.d.ts +67 -0
  58. package/dist/unit-details/panel.js +19 -92
  59. package/dist/unit-details/panel.js.map +1 -1
  60. package/dist/unit-details/popover.cjs +1 -2
  61. package/dist/unit-details/popover.cjs.map +1 -1
  62. package/dist/unit-details/popover.js +2 -3
  63. package/dist/unit-details/popover.js.map +1 -1
  64. package/dist/unit-details/strat-names.cjs +44 -0
  65. package/dist/unit-details/strat-names.cjs.map +1 -0
  66. package/dist/unit-details/strat-names.d.ts +14 -0
  67. package/dist/unit-details/strat-names.js +42 -0
  68. package/dist/unit-details/strat-names.js.map +1 -0
  69. package/dist/units/boxes.d.ts +2 -2
  70. package/dist/units/colors.d.ts +1 -1
  71. package/dist/units/composite.d.ts +4 -4
  72. package/dist/units/index.cjs +20 -6
  73. package/dist/units/index.cjs.map +1 -1
  74. package/dist/units/index.d.ts +12 -21
  75. package/dist/units/index.js +20 -6
  76. package/dist/units/index.js.map +1 -1
  77. package/dist/units/names.d.ts +3 -3
  78. package/dist/units/resolvers.d.ts +2 -2
  79. package/package.json +19 -19
  80. package/src/column.ts +1 -1
  81. package/src/data-provider/unit-selection.ts +8 -4
  82. package/src/prepare-units/helpers.ts +121 -72
  83. package/src/prepare-units/index.ts +1 -1
  84. package/src/section.ts +0 -1
  85. package/src/unit-details/age-range.ts +1 -0
  86. package/src/unit-details/identifiers.ts +67 -0
  87. package/src/unit-details/index.ts +2 -0
  88. package/src/unit-details/panel.ts +27 -131
  89. package/src/unit-details/popover.ts +2 -7
  90. package/src/unit-details/strat-names.ts +57 -0
  91. package/src/units/index.ts +31 -8
@@ -0,0 +1,42 @@
1
+ import { useInteractionProps, isClickable, DataField } from "@macrostrat/data-components";
2
+ import h from "./panel.module.sass.js";
3
+ import classNames from "classnames";
4
+ import { useStratNames } from "@macrostrat/data-provider";
5
+ import { Identifier } from "./identifiers.js";
6
+ function useStratNameData(strat_name_id) {
7
+ const stratNames = useStratNames([strat_name_id]);
8
+ return stratNames?.[0];
9
+ }
10
+ function StratNameField(props) {
11
+ const { strat_name_id, className, ...rest } = props;
12
+ const data = useStratNameData(strat_name_id);
13
+ const baseInteractionProps = useInteractionProps({ strat_name_id });
14
+ const coreProps = {
15
+ ...baseInteractionProps,
16
+ ...rest
17
+ };
18
+ let inner = h(Identifier, { id: strat_name_id });
19
+ const name = data?.strat_name_long;
20
+ if (name != null) {
21
+ inner = h("span.strat-name", name);
22
+ }
23
+ const clickable = isClickable(coreProps);
24
+ return h(
25
+ DataField,
26
+ {
27
+ label: "Stratigraphic name"
28
+ },
29
+ h(
30
+ clickable ? "a" : "span",
31
+ {
32
+ className: classNames({ clickable }, className),
33
+ ...coreProps
34
+ },
35
+ inner
36
+ )
37
+ );
38
+ }
39
+ export {
40
+ StratNameField
41
+ };
42
+ //# sourceMappingURL=strat-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strat-names.js","sources":["../../src/unit-details/strat-names.ts"],"sourcesContent":["import {\n DataField,\n isClickable,\n ItemInteractionProps,\n useInteractionProps,\n} from \"@macrostrat/data-components\";\nimport h from \"./panel.module.sass\";\nimport classNames from \"classnames\";\nimport { useStratNames } from \"@macrostrat/data-provider\";\nimport { Identifier } from \"./identifiers.ts\";\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nexport function StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\n ),\n );\n}\n"],"names":[],"mappings":";;;;;AAWA,SAAS,iBAAiB,eAAuB;AAC/C,QAAM,aAAa,cAAc,CAAC,aAAa,CAAC;AAChD,SAAO,aAAa,CAAC;AACvB;AAEO,SAAS,eACd,OAIA;AAEA,QAAM,EAAE,eAAe,WAAW,GAAG,SAAS;AAE9C,QAAM,OAAO,iBAAiB,aAAa;AAE3C,QAAM,uBAAuB,oBAAoB,EAAE,eAAe;AAElE,QAAM,YAAY;AAAA,IAChB,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAGL,MAAI,QAAa,EAAE,YAAY,EAAE,IAAI,eAAe;AACpD,QAAM,OAAO,MAAM;AACnB,MAAI,QAAQ,MAAM;AAChB,YAAQ,EAAE,mBAAmB,IAAI;AAAA,EACnC;AAEA,QAAM,YAAY,YAAY,SAAS;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACE,YAAY,MAAM;AAAA,MAClB;AAAA,QACE,WAAW,WAAW,EAAE,UAAA,GAAa,SAAS;AAAA,QAC9C,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,IAAA;AAAA,EACF;AAEJ;"}
@@ -1,5 +1,5 @@
1
- import { ColumnAxisType } from '../../../column-components/src/index.ts';
2
- import { Clickable } from '../../../ui-components/src/index.ts';
1
+ import { ColumnAxisType } from '@macrostrat/column-components';
2
+ import { Clickable } from '@macrostrat/ui-components';
3
3
  import { ReactNode } from 'react';
4
4
  import { IUnit, RectBounds } from './types';
5
5
  interface UnitRectOptions {
@@ -1,4 +1,4 @@
1
- import { Environment, Lithology, UnitLithology, UnitLong } from '../../../api-types/src/index.ts';
1
+ import { Environment, Lithology, UnitLithology, UnitLong } from '@macrostrat/api-types';
2
2
  interface KeyOptions {
3
3
  key?: "lith" | "environ";
4
4
  id_key?: "lith_id" | "environ_id";
@@ -1,5 +1,5 @@
1
- import { BaseUnit } from '../../../api-types/src/index.ts';
2
- export declare function LabelTrackerProvider(props: any): import('react').DetailedReactHTMLElement<import('react').InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>;
1
+ import { BaseUnit } from '@macrostrat/api-types';
2
+ export declare function LabelTrackerProvider(props: any): import('react').FunctionComponentElement<import('react').ProviderProps<null>>;
3
3
  declare function TrackedLabeledUnit({ division, nameForDivision, ...rest }: {
4
4
  [x: string]: any;
5
5
  division: any;
@@ -32,8 +32,8 @@ interface CompositeUnitProps {
32
32
  showLabels?: boolean;
33
33
  clipToFrame?: boolean;
34
34
  }
35
- export declare function CompositeUnitsColumn(props: CompositeUnitProps): import('react').FunctionComponentElement<import('../../../column-components/src/index.ts').LithologyColumnProps>;
35
+ export declare function CompositeUnitsColumn(props: CompositeUnitProps): import('react').FunctionComponentElement<import('@macrostrat/column-components').LithologyColumnProps>;
36
36
  export declare function AnnotatedUnitsColumn(props: ICompositeUnitProps): null;
37
37
  export declare function SectionLabelsColumn(props: ICompositeUnitProps): import('react').DOMElement<import('react').DOMAttributes<Element>, Element>;
38
- export declare function ColumnNotesProvider(props: any): import('react').FunctionComponentElement<import('react').ProviderProps<import('../../../column-components/src/index.ts').ColumnCtx<import('../../../column-components/src/index.ts').ColumnDivision>>>;
38
+ export declare function ColumnNotesProvider(props: any): import('react').FunctionComponentElement<import('react').ProviderProps<import('@macrostrat/column-components').ColumnCtx<import('@macrostrat/column-components').ColumnDivision>>>;
39
39
  export { TrackedLabeledUnit, ICompositeUnitProps };
@@ -36,13 +36,27 @@ function BasicUnitComponent({ division, ...rest }) {
36
36
  patternID: division.patternID
37
37
  });
38
38
  }
39
- function UnitComponent({ division, nColumns = 2, ...rest }) {
39
+ function UnitComponent({
40
+ division,
41
+ nColumns = 2,
42
+ ...rest
43
+ }) {
40
44
  const width = rest.width ?? columnComponents.useColumnLayout()?.width;
41
- const nOverlappingUnits = division.overlappingUnits?.length ?? 0;
42
- const _nColumns = nOverlappingUnits == 0 ? 1 : nColumns;
43
- const columnIx = (division.column ?? 0) % _nColumns;
44
- const reducedWidth = width / _nColumns;
45
- const x = columnIx * width / _nColumns;
45
+ let _nColumns = nColumns;
46
+ if (isNaN(_nColumns)) {
47
+ _nColumns = 2;
48
+ }
49
+ let columnIx = 0;
50
+ let x = 0;
51
+ console.log(rest, _nColumns, width);
52
+ let reducedWidth = _nColumns;
53
+ if ("overlap" in division) {
54
+ const overlap = division.overlap;
55
+ _nColumns = Math.min(_nColumns, overlap.nColumns);
56
+ columnIx = overlap.column;
57
+ reducedWidth = width / _nColumns;
58
+ x = columnIx * width / _nColumns;
59
+ }
46
60
  return h__default.default(composite.TrackedLabeledUnit, {
47
61
  division,
48
62
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/units/index.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n LithologyColumn,\n useGeologicPattern,\n} from \"@macrostrat/column-components\";\nimport { UnitNamesColumn } from \"./names\";\nimport { ICompositeUnitProps } from \"./composite\";\nimport { UnitBoxes, UnitProps } from \"./boxes\";\nimport { useColumnLayout } from \"@macrostrat/column-components\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { getMixedUnitColor } from \"./colors\";\nimport { TrackedLabeledUnit } from \"./composite\";\nimport { useEnvironments, useLithologies } from \"@macrostrat/data-provider\";\nimport { useMemo } from \"react\";\nimport { resolveID } from \"./resolvers\";\nimport { Lithology } from \"@macrostrat/api-types\";\n\nexport * from \"./composite\";\nexport * from \"./types\";\nexport * from \"./colors\";\n\nexport function UnitsColumn({ width = 100 }) {\n /*\n A column showing units with USGS color fill\n */\n return h(LithologyColumn, { width }, h(UnitBoxes));\n}\n\nexport function SimpleUnitsColumn(props: ICompositeUnitProps) {\n /*\n A column with units and names either\n overlapping or offset to the right\n */\n const { columnWidth, width, gutterWidth = 0, labelOffset = 30 } = props;\n\n return h([\n h(UnitsColumn, {\n width: columnWidth,\n }),\n h(UnitNamesColumn, {\n transform: `translate(${columnWidth + gutterWidth})`,\n paddingLeft: labelOffset,\n width: width - columnWidth - gutterWidth,\n }),\n ]);\n}\n\nexport function BasicUnitComponent({ division, ...rest }) {\n /** A unit that allows directly setting colors and patterns. */\n\n return h(UnitComponent, {\n division,\n ...rest,\n backgroundColor: division.color,\n patternID: division.patternID,\n });\n}\n\nexport function UnitComponent({ division, nColumns = 2, ...rest }) {\n const width = rest.width ?? useColumnLayout()?.width;\n\n const nOverlappingUnits = division.overlappingUnits?.length ?? 0;\n const _nColumns = nOverlappingUnits == 0 ? 1 : nColumns;\n const columnIx = (division.column ?? 0) % _nColumns;\n const reducedWidth = width / _nColumns;\n const x = (columnIx * width) / _nColumns;\n\n return h(TrackedLabeledUnit, {\n division,\n ...rest,\n width: reducedWidth,\n x,\n });\n}\n\ninterface UnitColorOptions {\n asBackground?: boolean;\n}\n\nexport function useUnitColor(unit, opts: UnitColorOptions = {}): string | null {\n /** Get the color for a unit based on its lithology */\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || lithMap == null) return null;\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, lithMap, inDarkMode, asBackground]);\n}\n\nexport function ColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColor(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nexport function useUnitColorByEnvironment(\n unit,\n opts: UnitColorOptions = {},\n): string | null {\n /** Get the color for a unit based on its lithology */\n const environmentMap = useEnvironments();\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || environmentMap == null) return null;\n let c = getMixedUnitColor(unit, environmentMap, inDarkMode, asBackground, {\n key: \"environ\",\n id_key: \"environ_id\",\n });\n if (c != null) {\n return c;\n }\n // Fallback to lithology color if no environment color is found\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, environmentMap, lithMap, inDarkMode, asBackground]);\n}\n\nexport function EnvironmentColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColorByEnvironment(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nfunction getPatternID(\n liths: Array<Lithology>,\n lithMap: Map<number, Lithology>,\n): string | null {\n if (lithMap == null || liths == null || liths.length == 0) {\n return null;\n }\n const patternIDs = new Set<string>();\n for (const lith of liths) {\n const lithData = lithMap.get(lith.lith_id);\n if (lithData) {\n patternIDs.add(`${lithData.fill}`);\n }\n }\n let id = patternIDs.values()[0];\n if (id == \"0\") return null;\n return id;\n}\n"],"names":["h","LithologyColumn","UnitBoxes","UnitNamesColumn","useColumnLayout","TrackedLabeledUnit","useLithologies","useInDarkMode","useMemo","getMixedUnitColor","resolveID","useGeologicPattern","useEnvironments"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/units/index.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n LithologyColumn,\n useGeologicPattern,\n} from \"@macrostrat/column-components\";\nimport { UnitNamesColumn } from \"./names\";\nimport { ICompositeUnitProps } from \"./composite\";\nimport { UnitBoxes, UnitProps } from \"./boxes\";\nimport { useColumnLayout } from \"@macrostrat/column-components\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { getMixedUnitColor } from \"./colors\";\nimport { TrackedLabeledUnit } from \"./composite\";\nimport { useEnvironments, useLithologies } from \"@macrostrat/data-provider\";\nimport { useMemo } from \"react\";\nimport { resolveID } from \"./resolvers\";\nimport { BaseUnit, Lithology } from \"@macrostrat/api-types\";\nimport { UnitWithDefinedOverlap } from \"../prepare-units/helpers.ts\";\n\nexport * from \"./composite\";\nexport * from \"./types\";\nexport * from \"./colors\";\n\nexport function UnitsColumn({ width = 100 }) {\n /*\n A column showing units with USGS color fill\n */\n return h(LithologyColumn, { width }, h(UnitBoxes));\n}\n\nexport function SimpleUnitsColumn(props: ICompositeUnitProps) {\n /*\n A column with units and names either\n overlapping or offset to the right\n */\n const { columnWidth, width, gutterWidth = 0, labelOffset = 30 } = props;\n\n return h([\n h(UnitsColumn, {\n width: columnWidth,\n }),\n h(UnitNamesColumn, {\n transform: `translate(${columnWidth + gutterWidth})`,\n paddingLeft: labelOffset,\n width: width - columnWidth - gutterWidth,\n }),\n ]);\n}\n\nexport function BasicUnitComponent({ division, ...rest }) {\n /** A unit that allows directly setting colors and patterns. */\n\n return h(UnitComponent, {\n division,\n ...rest,\n backgroundColor: division.color,\n patternID: division.patternID,\n });\n}\n\ninterface UnitComponentProps<T extends BaseUnit> {\n division: UnitWithDefinedOverlap<T> | T;\n nColumns: number;\n width?: number;\n}\n\nexport function UnitComponent<T extends BaseUnit>({\n division,\n nColumns = 2,\n ...rest\n}: UnitComponentProps<T>) {\n const width = rest.width ?? useColumnLayout()?.width;\n\n let _nColumns = nColumns;\n if (isNaN(_nColumns)) {\n _nColumns = 2;\n }\n let columnIx = 0;\n let x = 0;\n\n console.log(rest, _nColumns, width);\n\n let reducedWidth = _nColumns;\n //const nOverlappingUnits = division.overlappingUnits?.length ?? 0;\n if (\"overlap\" in division) {\n const overlap = division.overlap;\n _nColumns = Math.min(_nColumns, overlap.nColumns);\n columnIx = overlap.column;\n reducedWidth = width / _nColumns;\n x = (columnIx * width) / _nColumns;\n }\n return h(TrackedLabeledUnit, {\n division,\n ...rest,\n width: reducedWidth,\n x,\n });\n}\n\ninterface UnitColorOptions {\n asBackground?: boolean;\n}\n\nexport function useUnitColor(unit, opts: UnitColorOptions = {}): string | null {\n /** Get the color for a unit based on its lithology */\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || lithMap == null) return null;\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, lithMap, inDarkMode, asBackground]);\n}\n\nexport function ColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColor(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nexport function useUnitColorByEnvironment(\n unit,\n opts: UnitColorOptions = {},\n): string | null {\n /** Get the color for a unit based on its lithology */\n const environmentMap = useEnvironments();\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || environmentMap == null) return null;\n let c = getMixedUnitColor(unit, environmentMap, inDarkMode, asBackground, {\n key: \"environ\",\n id_key: \"environ_id\",\n });\n if (c != null) {\n return c;\n }\n // Fallback to lithology color if no environment color is found\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, environmentMap, lithMap, inDarkMode, asBackground]);\n}\n\nexport function EnvironmentColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColorByEnvironment(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nfunction getPatternID(\n liths: Array<Lithology>,\n lithMap: Map<number, Lithology>,\n): string | null {\n if (lithMap == null || liths == null || liths.length == 0) {\n return null;\n }\n const patternIDs = new Set<string>();\n for (const lith of liths) {\n const lithData = lithMap.get(lith.lith_id);\n if (lithData) {\n patternIDs.add(`${lithData.fill}`);\n }\n }\n let id = patternIDs.values()[0];\n if (id == \"0\") return null;\n return id;\n}\n"],"names":["h","LithologyColumn","UnitBoxes","UnitNamesColumn","useColumnLayout","TrackedLabeledUnit","useLithologies","useInDarkMode","useMemo","getMixedUnitColor","resolveID","useGeologicPattern","useEnvironments"],"mappings":"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"}
@@ -1,24 +1,23 @@
1
1
  import { ICompositeUnitProps } from './composite';
2
+ import { BaseUnit } from '@macrostrat/api-types';
3
+ import { UnitWithDefinedOverlap } from '../prepare-units/helpers.ts';
2
4
  export * from './composite';
3
5
  export * from './types';
4
6
  export * from './colors';
5
7
  export declare function UnitsColumn({ width }: {
6
8
  width?: number | undefined;
7
- }): import('react').FunctionComponentElement<import('../../../column-components/src/index.ts').LithologyColumnProps>;
9
+ }): import('react').FunctionComponentElement<import('@macrostrat/column-components').LithologyColumnProps>;
8
10
  export declare function SimpleUnitsColumn(props: ICompositeUnitProps): import('react').ReactElement<unknown, string | import('react').JSXElementConstructor<any>>;
9
11
  export declare function BasicUnitComponent({ division, ...rest }: {
10
12
  [x: string]: any;
11
13
  division: any;
12
- }): import('react').FunctionComponentElement<{
13
- [x: string]: any;
14
- division: any;
15
- nColumns?: number | undefined;
16
- }>;
17
- export declare function UnitComponent({ division, nColumns, ...rest }: {
18
- [x: string]: any;
19
- division: any;
20
- nColumns?: number | undefined;
21
- }): import('react').FunctionComponentElement<{
14
+ }): import('react').FunctionComponentElement<UnitComponentProps<BaseUnit>>;
15
+ interface UnitComponentProps<T extends BaseUnit> {
16
+ division: UnitWithDefinedOverlap<T> | T;
17
+ nColumns: number;
18
+ width?: number;
19
+ }
20
+ export declare function UnitComponent<T extends BaseUnit>({ division, nColumns, ...rest }: UnitComponentProps<T>): import('react').FunctionComponentElement<{
22
21
  [x: string]: any;
23
22
  division: any;
24
23
  nameForDivision?: ((div: any) => any) | undefined;
@@ -27,14 +26,6 @@ interface UnitColorOptions {
27
26
  asBackground?: boolean;
28
27
  }
29
28
  export declare function useUnitColor(unit: any, opts?: UnitColorOptions): string | null;
30
- export declare function ColoredUnitComponent(props: any): import('react').FunctionComponentElement<{
31
- [x: string]: any;
32
- division: any;
33
- nColumns?: number | undefined;
34
- }>;
29
+ export declare function ColoredUnitComponent(props: any): import('react').FunctionComponentElement<UnitComponentProps<BaseUnit>>;
35
30
  export declare function useUnitColorByEnvironment(unit: any, opts?: UnitColorOptions): string | null;
36
- export declare function EnvironmentColoredUnitComponent(props: any): import('react').FunctionComponentElement<{
37
- [x: string]: any;
38
- division: any;
39
- nColumns?: number | undefined;
40
- }>;
31
+ export declare function EnvironmentColoredUnitComponent(props: any): import('react').FunctionComponentElement<UnitComponentProps<BaseUnit>>;
@@ -34,13 +34,27 @@ function BasicUnitComponent({ division, ...rest }) {
34
34
  patternID: division.patternID
35
35
  });
36
36
  }
37
- function UnitComponent({ division, nColumns = 2, ...rest }) {
37
+ function UnitComponent({
38
+ division,
39
+ nColumns = 2,
40
+ ...rest
41
+ }) {
38
42
  const width = rest.width ?? useColumnLayout()?.width;
39
- const nOverlappingUnits = division.overlappingUnits?.length ?? 0;
40
- const _nColumns = nOverlappingUnits == 0 ? 1 : nColumns;
41
- const columnIx = (division.column ?? 0) % _nColumns;
42
- const reducedWidth = width / _nColumns;
43
- const x = columnIx * width / _nColumns;
43
+ let _nColumns = nColumns;
44
+ if (isNaN(_nColumns)) {
45
+ _nColumns = 2;
46
+ }
47
+ let columnIx = 0;
48
+ let x = 0;
49
+ console.log(rest, _nColumns, width);
50
+ let reducedWidth = _nColumns;
51
+ if ("overlap" in division) {
52
+ const overlap = division.overlap;
53
+ _nColumns = Math.min(_nColumns, overlap.nColumns);
54
+ columnIx = overlap.column;
55
+ reducedWidth = width / _nColumns;
56
+ x = columnIx * width / _nColumns;
57
+ }
44
58
  return h(TrackedLabeledUnit, {
45
59
  division,
46
60
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/units/index.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n LithologyColumn,\n useGeologicPattern,\n} from \"@macrostrat/column-components\";\nimport { UnitNamesColumn } from \"./names\";\nimport { ICompositeUnitProps } from \"./composite\";\nimport { UnitBoxes, UnitProps } from \"./boxes\";\nimport { useColumnLayout } from \"@macrostrat/column-components\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { getMixedUnitColor } from \"./colors\";\nimport { TrackedLabeledUnit } from \"./composite\";\nimport { useEnvironments, useLithologies } from \"@macrostrat/data-provider\";\nimport { useMemo } from \"react\";\nimport { resolveID } from \"./resolvers\";\nimport { Lithology } from \"@macrostrat/api-types\";\n\nexport * from \"./composite\";\nexport * from \"./types\";\nexport * from \"./colors\";\n\nexport function UnitsColumn({ width = 100 }) {\n /*\n A column showing units with USGS color fill\n */\n return h(LithologyColumn, { width }, h(UnitBoxes));\n}\n\nexport function SimpleUnitsColumn(props: ICompositeUnitProps) {\n /*\n A column with units and names either\n overlapping or offset to the right\n */\n const { columnWidth, width, gutterWidth = 0, labelOffset = 30 } = props;\n\n return h([\n h(UnitsColumn, {\n width: columnWidth,\n }),\n h(UnitNamesColumn, {\n transform: `translate(${columnWidth + gutterWidth})`,\n paddingLeft: labelOffset,\n width: width - columnWidth - gutterWidth,\n }),\n ]);\n}\n\nexport function BasicUnitComponent({ division, ...rest }) {\n /** A unit that allows directly setting colors and patterns. */\n\n return h(UnitComponent, {\n division,\n ...rest,\n backgroundColor: division.color,\n patternID: division.patternID,\n });\n}\n\nexport function UnitComponent({ division, nColumns = 2, ...rest }) {\n const width = rest.width ?? useColumnLayout()?.width;\n\n const nOverlappingUnits = division.overlappingUnits?.length ?? 0;\n const _nColumns = nOverlappingUnits == 0 ? 1 : nColumns;\n const columnIx = (division.column ?? 0) % _nColumns;\n const reducedWidth = width / _nColumns;\n const x = (columnIx * width) / _nColumns;\n\n return h(TrackedLabeledUnit, {\n division,\n ...rest,\n width: reducedWidth,\n x,\n });\n}\n\ninterface UnitColorOptions {\n asBackground?: boolean;\n}\n\nexport function useUnitColor(unit, opts: UnitColorOptions = {}): string | null {\n /** Get the color for a unit based on its lithology */\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || lithMap == null) return null;\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, lithMap, inDarkMode, asBackground]);\n}\n\nexport function ColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColor(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nexport function useUnitColorByEnvironment(\n unit,\n opts: UnitColorOptions = {},\n): string | null {\n /** Get the color for a unit based on its lithology */\n const environmentMap = useEnvironments();\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || environmentMap == null) return null;\n let c = getMixedUnitColor(unit, environmentMap, inDarkMode, asBackground, {\n key: \"environ\",\n id_key: \"environ_id\",\n });\n if (c != null) {\n return c;\n }\n // Fallback to lithology color if no environment color is found\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, environmentMap, lithMap, inDarkMode, asBackground]);\n}\n\nexport function EnvironmentColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColorByEnvironment(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nfunction getPatternID(\n liths: Array<Lithology>,\n lithMap: Map<number, Lithology>,\n): string | null {\n if (lithMap == null || liths == null || liths.length == 0) {\n return null;\n }\n const patternIDs = new Set<string>();\n for (const lith of liths) {\n const lithData = lithMap.get(lith.lith_id);\n if (lithData) {\n patternIDs.add(`${lithData.fill}`);\n }\n }\n let id = patternIDs.values()[0];\n if (id == \"0\") return null;\n return id;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/units/index.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n LithologyColumn,\n useGeologicPattern,\n} from \"@macrostrat/column-components\";\nimport { UnitNamesColumn } from \"./names\";\nimport { ICompositeUnitProps } from \"./composite\";\nimport { UnitBoxes, UnitProps } from \"./boxes\";\nimport { useColumnLayout } from \"@macrostrat/column-components\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { getMixedUnitColor } from \"./colors\";\nimport { TrackedLabeledUnit } from \"./composite\";\nimport { useEnvironments, useLithologies } from \"@macrostrat/data-provider\";\nimport { useMemo } from \"react\";\nimport { resolveID } from \"./resolvers\";\nimport { BaseUnit, Lithology } from \"@macrostrat/api-types\";\nimport { UnitWithDefinedOverlap } from \"../prepare-units/helpers.ts\";\n\nexport * from \"./composite\";\nexport * from \"./types\";\nexport * from \"./colors\";\n\nexport function UnitsColumn({ width = 100 }) {\n /*\n A column showing units with USGS color fill\n */\n return h(LithologyColumn, { width }, h(UnitBoxes));\n}\n\nexport function SimpleUnitsColumn(props: ICompositeUnitProps) {\n /*\n A column with units and names either\n overlapping or offset to the right\n */\n const { columnWidth, width, gutterWidth = 0, labelOffset = 30 } = props;\n\n return h([\n h(UnitsColumn, {\n width: columnWidth,\n }),\n h(UnitNamesColumn, {\n transform: `translate(${columnWidth + gutterWidth})`,\n paddingLeft: labelOffset,\n width: width - columnWidth - gutterWidth,\n }),\n ]);\n}\n\nexport function BasicUnitComponent({ division, ...rest }) {\n /** A unit that allows directly setting colors and patterns. */\n\n return h(UnitComponent, {\n division,\n ...rest,\n backgroundColor: division.color,\n patternID: division.patternID,\n });\n}\n\ninterface UnitComponentProps<T extends BaseUnit> {\n division: UnitWithDefinedOverlap<T> | T;\n nColumns: number;\n width?: number;\n}\n\nexport function UnitComponent<T extends BaseUnit>({\n division,\n nColumns = 2,\n ...rest\n}: UnitComponentProps<T>) {\n const width = rest.width ?? useColumnLayout()?.width;\n\n let _nColumns = nColumns;\n if (isNaN(_nColumns)) {\n _nColumns = 2;\n }\n let columnIx = 0;\n let x = 0;\n\n console.log(rest, _nColumns, width);\n\n let reducedWidth = _nColumns;\n //const nOverlappingUnits = division.overlappingUnits?.length ?? 0;\n if (\"overlap\" in division) {\n const overlap = division.overlap;\n _nColumns = Math.min(_nColumns, overlap.nColumns);\n columnIx = overlap.column;\n reducedWidth = width / _nColumns;\n x = (columnIx * width) / _nColumns;\n }\n return h(TrackedLabeledUnit, {\n division,\n ...rest,\n width: reducedWidth,\n x,\n });\n}\n\ninterface UnitColorOptions {\n asBackground?: boolean;\n}\n\nexport function useUnitColor(unit, opts: UnitColorOptions = {}): string | null {\n /** Get the color for a unit based on its lithology */\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || lithMap == null) return null;\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, lithMap, inDarkMode, asBackground]);\n}\n\nexport function ColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColor(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nexport function useUnitColorByEnvironment(\n unit,\n opts: UnitColorOptions = {},\n): string | null {\n /** Get the color for a unit based on its lithology */\n const environmentMap = useEnvironments();\n const lithMap = useLithologies();\n const inDarkMode = useInDarkMode();\n const { asBackground = true } = opts;\n\n return useMemo(() => {\n if (unit == null || environmentMap == null) return null;\n let c = getMixedUnitColor(unit, environmentMap, inDarkMode, asBackground, {\n key: \"environ\",\n id_key: \"environ_id\",\n });\n if (c != null) {\n return c;\n }\n // Fallback to lithology color if no environment color is found\n return getMixedUnitColor(unit, lithMap, inDarkMode, asBackground);\n }, [unit?.unit_id, environmentMap, lithMap, inDarkMode, asBackground]);\n}\n\nexport function EnvironmentColoredUnitComponent(props) {\n /** A unit component that is colored using a mixture of lithologies.\n * This is a separate component because it depends on more providers/contexts to determine coloring. */\n const backgroundColor = useUnitColorByEnvironment(props.division);\n\n const patternID = useMemo(() => {\n return resolveID(props.division); // ?? getPatternID(props.division.lith, lithMap);\n }, [props.division?.unit_id]);\n\n const fill = useGeologicPattern(patternID);\n\n return h(UnitComponent, {\n fill,\n backgroundColor,\n ...props,\n });\n}\n\nfunction getPatternID(\n liths: Array<Lithology>,\n lithMap: Map<number, Lithology>,\n): string | null {\n if (lithMap == null || liths == null || liths.length == 0) {\n return null;\n }\n const patternIDs = new Set<string>();\n for (const lith of liths) {\n const lithData = lithMap.get(lith.lith_id);\n if (lithData) {\n patternIDs.add(`${lithData.fill}`);\n }\n }\n let id = patternIDs.values()[0];\n if (id == \"0\") return null;\n return id;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ColumnAxisType, ColumnDivision, NoteData, NotesColumnProps } from '../../../column-components/src/index.ts';
1
+ import { ColumnAxisType, ColumnDivision, NoteData, NotesColumnProps } from '@macrostrat/column-components';
2
2
  import { IUnit } from './types';
3
3
  import { default as React } from 'react';
4
4
  import { CompositeColumnScale } from '../prepare-units';
@@ -23,12 +23,12 @@ declare function noteForDivision(div: IUnit, opts: {
23
23
  nameForDivision?: (obj: IUnit) => string;
24
24
  }): UnitNote;
25
25
  declare const defaultNameFunction: (div: any) => any;
26
- declare function UnitDataColumn_(props: UnitDataProps): import('react').FunctionComponentElement<NotesColumnProps> | null;
26
+ declare function UnitDataColumn_(props: UnitDataProps): React.FunctionComponentElement<NotesColumnProps> | null;
27
27
  declare const UnitDataColumn: React.MemoExoticComponent<typeof UnitDataColumn_>;
28
28
  export interface UnitNamesProps extends UnitDataProps {
29
29
  paddingLeft?: number;
30
30
  width: number;
31
31
  onClickNote?: (note: any) => void;
32
32
  }
33
- export declare function UnitNamesColumn(props: UnitNamesProps): import('react').FunctionComponentElement<UnitDataProps>;
33
+ export declare function UnitNamesColumn(props: UnitNamesProps): React.FunctionComponentElement<UnitDataProps>;
34
34
  export { defaultNameFunction, noteForDivision, UnitDataColumn };
@@ -1,8 +1,8 @@
1
- import { Lithology, UnitLithology } from '../../../api-types/src/index.ts';
1
+ import { Lithology, UnitLithology } from '@macrostrat/api-types';
2
2
  export declare function getBestFGDCPatternForLithologyList<T extends UnitLithology | Lithology>(liths: T[]): {
3
3
  lith: T;
4
4
  patternID: string;
5
5
  } | null;
6
- declare const resolveID: (d: any) => any;
6
+ declare const resolveID: (d: any) => "650" | "651" | "609" | "608" | "611" | "686" | "603" | "711" | "725" | null;
7
7
  declare const scalePattern: (id: any) => any;
8
8
  export { resolveID, scalePattern };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@macrostrat/column-views",
3
- "version": "3.3.4",
3
+ "version": "3.4.0",
4
4
  "description": "Data views for Macrostrat stratigraphic columns",
5
5
  "repository": {
6
6
  "type": "git",
@@ -45,21 +45,21 @@
45
45
  "react": "^18.0.0||^19.0.0"
46
46
  },
47
47
  "dependencies": {
48
- "@blueprintjs/core": "^6.11.3",
49
- "@macrostrat/api-types": "^1.1.5",
50
- "@macrostrat/color-utils": "^1.2.1",
51
- "@macrostrat/column-components": "^2.0.6",
52
- "@macrostrat/data-components": "^1.1.8",
53
- "@macrostrat/data-provider": "^1.0.2",
54
- "@macrostrat/hyper": "^3.1.0",
55
- "@macrostrat/map-interface": "^2.2.4",
56
- "@macrostrat/map-styles": "^2.2.1",
57
- "@macrostrat/mapbox-react": "^3.2.0",
58
- "@macrostrat/mapbox-utils": "^1.7.3",
59
- "@macrostrat/stratigraphy-utils": "^1.2.1",
60
- "@macrostrat/svg-map-components": "^2.0.2",
61
- "@macrostrat/timescale": "^3.1.2",
62
- "@macrostrat/ui-components": "^5.0.8",
48
+ "@blueprintjs/core": "^6.14.0",
49
+ "@macrostrat/api-types": "^1.2.0",
50
+ "@macrostrat/color-utils": "^1.2.2",
51
+ "@macrostrat/column-components": "^2.0.8",
52
+ "@macrostrat/data-components": "^1.1.10",
53
+ "@macrostrat/data-provider": "^1.0.4",
54
+ "@macrostrat/hyper": "^3.1.1",
55
+ "@macrostrat/map-interface": "^2.2.6",
56
+ "@macrostrat/map-styles": "^2.2.3",
57
+ "@macrostrat/mapbox-react": "^3.2.2",
58
+ "@macrostrat/mapbox-utils": "^1.7.4",
59
+ "@macrostrat/stratigraphy-utils": "^1.3.0",
60
+ "@macrostrat/svg-map-components": "^2.0.3",
61
+ "@macrostrat/timescale": "^3.1.3",
62
+ "@macrostrat/ui-components": "^5.0.10",
63
63
  "@turf/boolean-point-in-polygon": "^7.3.2",
64
64
  "@turf/buffer": "^7.3.2",
65
65
  "@turf/centroid": "^7.3.2",
@@ -82,8 +82,7 @@
82
82
  "d3-path": "^3.1.0",
83
83
  "d3-scale": "^4.0.2",
84
84
  "d3-shape": "^3.2.0",
85
- "jotai": "^2.16.0",
86
- "jotai-scope": "^0.10.0",
85
+ "jotai": "^2.20.0",
87
86
  "mapbox-gl": "^3.0.0",
88
87
  "p-map": "^7.0.4",
89
88
  "react-spring": "^9.7.5",
@@ -92,7 +91,8 @@
92
91
  "zustand-computed": "^2.0.2"
93
92
  },
94
93
  "devDependencies": {
95
- "@macrostrat/web-components-bundler": "1.0.1"
94
+ "@macrostrat/web-components-bundler": "1.0.1",
95
+ "jotai-scope": "^0.11.0"
96
96
  },
97
97
  "publishConfig": {
98
98
  "access": "public"
package/src/column.ts CHANGED
@@ -118,7 +118,7 @@ export function Column(props: ColumnProps) {
118
118
 
119
119
  /* Make pixelScale and targetUnitHeight mutually exclusive. PixelScale implies
120
120
  * standardization of scales in all sections */
121
- let _targetUnitHeight = targetUnitHeight;
121
+ let _targetUnitHeight: number | null = targetUnitHeight;
122
122
  let _minSectionHeight = minSectionHeight;
123
123
  let _minPixelScale = minPixelScale;
124
124
  if (pixelScale != null) {
@@ -16,6 +16,10 @@ type UnitSelectDispatch = (
16
16
  target: HTMLElement | null,
17
17
  ) => void;
18
18
 
19
+ export function useUnitSelection() {
20
+ return scope.use(selectedUnitAtom);
21
+ }
22
+
19
23
  export function useUnitSelectionDispatch(): UnitSelectDispatch {
20
24
  return scope.useSetAtom(selectedUnitAtom);
21
25
  }
@@ -70,6 +74,7 @@ const selectedUnitAtom = atom(
70
74
  ): BaseUnit | null => {
71
75
  if (!get(allowUnitSelectionAtom)) {
72
76
  console.error("Unit selection is disabled.");
77
+ return null;
73
78
  }
74
79
 
75
80
  let unitID: number | null = null;
@@ -83,8 +88,8 @@ const selectedUnitAtom = atom(
83
88
  }
84
89
 
85
90
  if (unitID != null) {
86
- // Verify that the unit exists in the current colum, else throw
87
91
  const unitsMap = get(columnUnitsMapAtom);
92
+ // Verify that the unit exists in the current colum, else throw
88
93
  if (!unitsMap?.has(unitID)) {
89
94
  throw new Error(
90
95
  `Unit with ID ${unitID} not found in current column units.`,
@@ -150,9 +155,8 @@ if (props.onClickedColumn) {
150
155
  export function useUnitSelectionTarget(
151
156
  unit: IUnit,
152
157
  ): [React.RefObject<HTMLElement>, boolean, (evt: Event) => void] {
153
- const ref = useRef<HTMLElement>();
154
- const selectedUnit = useSelectedUnit();
155
- const selectUnit = useUnitSelectionDispatch();
158
+ const ref = useRef<HTMLElement>(null);
159
+ const [selectedUnit, selectUnit] = useUnitSelection();
156
160
  const selected = selectedUnit?.unit_id == unit.unit_id;
157
161
 
158
162
  const onClick = useCallback(