@macrostrat/column-views 1.0.2 → 2.0.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 (242) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/esm/_shared.f7eec55a.js +9 -0
  3. package/dist/esm/_shared.f7eec55a.js.map +1 -0
  4. package/dist/esm/age-axis.4a8cf5e6.js +98 -0
  5. package/dist/esm/age-axis.4a8cf5e6.js.map +1 -0
  6. package/dist/esm/age-axis.module.03773a80.css +33 -0
  7. package/dist/esm/age-axis.module.03773a80.css.map +1 -0
  8. package/dist/esm/age-axis.module.3cc91335.js +22 -0
  9. package/dist/esm/age-axis.module.3cc91335.js.map +1 -0
  10. package/dist/esm/age-model-overlay.c7226855.js +57 -0
  11. package/dist/esm/age-model-overlay.c7226855.js.map +1 -0
  12. package/dist/esm/age-model-overlay.module.5d9e78fb.css +14 -0
  13. package/dist/esm/age-model-overlay.module.5d9e78fb.css.map +1 -0
  14. package/dist/esm/age-model-overlay.module.cd985dcb.js +16 -0
  15. package/dist/esm/age-model-overlay.module.cd985dcb.js.map +1 -0
  16. package/dist/esm/base.910b80b4.js +288 -0
  17. package/dist/esm/base.910b80b4.js.map +1 -0
  18. package/dist/esm/boxes.8292cff2.js +258 -0
  19. package/dist/esm/boxes.8292cff2.js.map +1 -0
  20. package/dist/esm/boxes.module.2b5fb18e.css +26 -0
  21. package/dist/esm/boxes.module.2b5fb18e.css.map +1 -0
  22. package/dist/esm/boxes.module.4ebc7796.js +19 -0
  23. package/dist/esm/boxes.module.4ebc7796.js.map +1 -0
  24. package/dist/esm/{carbon-isotopes.3b502a9e.js → carbon-isotopes.10db8285.js} +2 -2
  25. package/dist/esm/{carbon-isotopes.3b502a9e.js.map → carbon-isotopes.10db8285.js.map} +1 -1
  26. package/dist/esm/colors.395c6db5.js +40 -0
  27. package/dist/esm/colors.395c6db5.js.map +1 -0
  28. package/dist/esm/column-correlation.c8dcfe98.js +9 -0
  29. package/dist/esm/column-correlation.c8dcfe98.js.map +1 -0
  30. package/dist/esm/column-nav.5414677c.js +55 -0
  31. package/dist/esm/column-nav.5414677c.js.map +1 -0
  32. package/dist/esm/column-navigation.37cd3245.js +9 -0
  33. package/dist/esm/column-navigation.37cd3245.js.map +1 -0
  34. package/dist/esm/column.01d68dd8.js +127 -0
  35. package/dist/esm/column.01d68dd8.js.map +1 -0
  36. package/dist/esm/{column.db058031.js → column.a25f8ebd.js} +4 -4
  37. package/dist/esm/column.a25f8ebd.js.map +1 -0
  38. package/dist/esm/column.module.1b776e15.js +46 -0
  39. package/dist/esm/column.module.1b776e15.js.map +1 -0
  40. package/dist/esm/column.module.a67a6b4c.css +159 -0
  41. package/dist/esm/column.module.a67a6b4c.css.map +1 -0
  42. package/dist/esm/composite-scale.577bf64a.js +222 -0
  43. package/dist/esm/composite-scale.577bf64a.js.map +1 -0
  44. package/dist/esm/composite.039e4798.js +163 -0
  45. package/dist/esm/composite.039e4798.js.map +1 -0
  46. package/dist/esm/{core.4db8e452.js → core.843310d3.js} +11 -12
  47. package/dist/esm/core.843310d3.js.map +1 -0
  48. package/dist/esm/core.91ede078.js +206 -0
  49. package/dist/esm/core.91ede078.js.map +1 -0
  50. package/dist/esm/correlation-chart.abd8b346.js +9 -0
  51. package/dist/esm/correlation-chart.abd8b346.js.map +1 -0
  52. package/dist/esm/data-provider.1506eb64.js.map +1 -1
  53. package/dist/esm/data-provider.f10c6d0b.js +13 -0
  54. package/dist/esm/data-provider.f10c6d0b.js.map +1 -0
  55. package/dist/esm/fetch.99aec438.js +152 -0
  56. package/dist/esm/fetch.99aec438.js.map +1 -0
  57. package/dist/esm/hash-string.285b37fb.js +39 -0
  58. package/dist/esm/hash-string.285b37fb.js.map +1 -0
  59. package/dist/esm/helpers.2f0a0cb7.js +141 -0
  60. package/dist/esm/helpers.2f0a0cb7.js.map +1 -0
  61. package/dist/esm/index.d.ts +797 -120
  62. package/dist/esm/index.d.ts.map +1 -1
  63. package/dist/esm/index.js +14 -8
  64. package/dist/esm/index.js.map +1 -1
  65. package/dist/esm/inset-map.3c18106d.js +66 -0
  66. package/dist/esm/inset-map.3c18106d.js.map +1 -0
  67. package/dist/esm/keyboard-navigation.6713401b.js +48 -0
  68. package/dist/esm/keyboard-navigation.6713401b.js.map +1 -0
  69. package/dist/esm/keyboard-navigation.a9fc80dd.js +112 -0
  70. package/dist/esm/keyboard-navigation.a9fc80dd.js.map +1 -0
  71. package/dist/esm/layers.033d3fb0.js +170 -0
  72. package/dist/esm/layers.033d3fb0.js.map +1 -0
  73. package/dist/esm/main.2e0375a5.js +221 -0
  74. package/dist/esm/main.2e0375a5.js.map +1 -0
  75. package/dist/esm/main.module.3dd9500b.css +134 -0
  76. package/dist/esm/main.module.3dd9500b.css.map +1 -0
  77. package/dist/esm/main.module.c09154b1.js +70 -0
  78. package/dist/esm/main.module.c09154b1.js.map +1 -0
  79. package/dist/esm/mapbox.cac42eed.js +167 -0
  80. package/dist/esm/mapbox.cac42eed.js.map +1 -0
  81. package/dist/esm/maps.bcdea9c1.js +11 -0
  82. package/dist/esm/maps.bcdea9c1.js.map +1 -0
  83. package/dist/esm/{names.f6a4e9a4.js → names.a8f2b452.js} +5 -5
  84. package/dist/esm/names.a8f2b452.js.map +1 -0
  85. package/dist/esm/panel.598f76a5.js +420 -0
  86. package/dist/esm/panel.598f76a5.js.map +1 -0
  87. package/dist/esm/panel.module.386166cc.js +58 -0
  88. package/dist/esm/panel.module.386166cc.js.map +1 -0
  89. package/dist/esm/panel.module.3d2ea3c6.css +111 -0
  90. package/dist/esm/panel.module.3d2ea3c6.css.map +1 -0
  91. package/dist/esm/popover.a810b7bc.js +66 -0
  92. package/dist/esm/popover.a810b7bc.js.map +1 -0
  93. package/dist/esm/popover.module.c4ba4189.js +22 -0
  94. package/dist/esm/popover.module.c4ba4189.js.map +1 -0
  95. package/dist/esm/{selection-popover.module.0a701258.css → popover.module.c4d6bfb0.css} +11 -8
  96. package/dist/esm/popover.module.c4d6bfb0.css.map +1 -0
  97. package/dist/esm/prepare-data.d4284b4a.js +125 -0
  98. package/dist/esm/prepare-data.d4284b4a.js.map +1 -0
  99. package/dist/esm/prepare-units.6c890a96.js +104 -0
  100. package/dist/esm/prepare-units.6c890a96.js.map +1 -0
  101. package/dist/esm/{resolvers.b5c82b78.js → resolvers.36013b49.js} +13 -2
  102. package/dist/esm/resolvers.36013b49.js.map +1 -0
  103. package/dist/esm/section.a34d379a.js +215 -0
  104. package/dist/esm/section.a34d379a.js.map +1 -0
  105. package/dist/esm/selection.f5b0297e.js +143 -0
  106. package/dist/esm/selection.f5b0297e.js.map +1 -0
  107. package/dist/esm/state.178ef364.js +75 -0
  108. package/dist/esm/state.178ef364.js.map +1 -0
  109. package/dist/esm/state.2952cbca.js +118 -0
  110. package/dist/esm/state.2952cbca.js.map +1 -0
  111. package/dist/esm/store.c4d7a8a4.js +52 -0
  112. package/dist/esm/store.c4d7a8a4.js.map +1 -0
  113. package/dist/esm/styles.7bc776d1.js +95 -0
  114. package/dist/esm/styles.7bc776d1.js.map +1 -0
  115. package/dist/esm/svg.4b9a96c1.js +89 -0
  116. package/dist/esm/svg.4b9a96c1.js.map +1 -0
  117. package/dist/esm/types.0f0b57c9.js +3 -0
  118. package/dist/esm/types.0f0b57c9.js.map +1 -0
  119. package/dist/esm/unit-details.071cefed.js +9 -0
  120. package/dist/esm/unit-details.071cefed.js.map +1 -0
  121. package/dist/esm/units.5a4fc058.js +98 -0
  122. package/dist/esm/units.5a4fc058.js.map +1 -0
  123. package/dist/esm/utils.d7a43a2a.js +55 -0
  124. package/dist/esm/utils.d7a43a2a.js.map +1 -0
  125. package/dist/node/index.js.map +1 -1
  126. package/package.json +24 -7
  127. package/src/age-axis.module.sass +27 -0
  128. package/src/age-axis.ts +82 -19
  129. package/src/age-model-overlay.module.sass +11 -0
  130. package/src/age-model-overlay.ts +73 -0
  131. package/src/carbon-isotopes/column.ts +4 -2
  132. package/src/carbon-isotopes/core.ts +9 -6
  133. package/src/carbon-isotopes/data-provider.ts +3 -3
  134. package/src/column.module.sass +58 -49
  135. package/src/column.ts +149 -135
  136. package/src/correlation-chart/hash-string.ts +57 -0
  137. package/src/correlation-chart/index.ts +2 -0
  138. package/src/correlation-chart/main.module.sass +122 -0
  139. package/src/correlation-chart/main.ts +305 -0
  140. package/src/correlation-chart/prepare-data.ts +217 -0
  141. package/src/correlation-chart/stories/correlation-chart.stories.ts +192 -0
  142. package/src/correlation-chart/stories/stories.module.sass +18 -0
  143. package/src/correlation-chart/unconformity-line.module.sass +8 -0
  144. package/src/correlation-chart/unconformity-line.ts +25 -0
  145. package/src/data-provider/base.ts +388 -0
  146. package/src/data-provider/column-nav.ts +53 -0
  147. package/src/data-provider/fetch.ts +231 -0
  148. package/src/data-provider/index.ts +4 -0
  149. package/src/data-provider/store.ts +72 -0
  150. package/src/index.ts +6 -3
  151. package/src/maps/_shared/index.ts +2 -0
  152. package/src/maps/_shared/inset-map.stories.ts +20 -0
  153. package/src/maps/_shared/inset-map.ts +87 -0
  154. package/src/maps/_shared/styles.ts +57 -0
  155. package/src/maps/column-correlation/column-correlation-map.stories.ts +96 -0
  156. package/src/maps/column-correlation/core.ts +225 -0
  157. package/src/maps/column-correlation/index.ts +2 -0
  158. package/src/maps/column-correlation/state.ts +192 -0
  159. package/src/maps/column-navigation/index.ts +2 -0
  160. package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +102 -0
  161. package/src/maps/column-navigation/mapbox/index.ts +219 -0
  162. package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +119 -0
  163. package/src/maps/column-navigation/mapbox/state.ts +109 -0
  164. package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +46 -0
  165. package/src/{map → maps/column-navigation/svg}/index.ts +18 -6
  166. package/src/{map → maps/column-navigation/svg}/layers.ts +28 -109
  167. package/src/maps/column-navigation/utils/keyboard-navigation.ts +58 -0
  168. package/src/maps/index.ts +3 -0
  169. package/src/prepare-units/composite-scale.ts +353 -0
  170. package/src/prepare-units/helpers.ts +226 -0
  171. package/src/prepare-units/index.ts +177 -0
  172. package/src/prepare-units/utils.ts +98 -0
  173. package/src/section.ts +264 -84
  174. package/src/unit-details/index.ts +2 -215
  175. package/src/unit-details/{index.module.sass → panel.module.sass} +39 -8
  176. package/src/unit-details/panel.ts +523 -0
  177. package/src/{selection-popover.module.sass → unit-details/popover.module.sass} +4 -2
  178. package/src/unit-details/popover.ts +82 -0
  179. package/src/units/boxes.module.sass +16 -0
  180. package/src/units/boxes.ts +243 -90
  181. package/src/units/colors.ts +64 -0
  182. package/src/units/composite.ts +157 -152
  183. package/src/units/index.ts +76 -9
  184. package/src/units/names.ts +8 -4
  185. package/src/units/resolvers.ts +11 -0
  186. package/src/units/selection.ts +115 -101
  187. package/src/units/types.ts +5 -16
  188. package/dist/esm/age-axis.64c509ee.js +0 -41
  189. package/dist/esm/age-axis.64c509ee.js.map +0 -1
  190. package/dist/esm/boxes.13968b76.js +0 -164
  191. package/dist/esm/boxes.13968b76.js.map +0 -1
  192. package/dist/esm/boxes.module.28873d08.css +0 -4
  193. package/dist/esm/boxes.module.28873d08.css.map +0 -1
  194. package/dist/esm/boxes.module.605bdcd6.js +0 -13
  195. package/dist/esm/boxes.module.605bdcd6.js.map +0 -1
  196. package/dist/esm/column.8dd26e1a.js +0 -149
  197. package/dist/esm/column.8dd26e1a.js.map +0 -1
  198. package/dist/esm/column.db058031.js.map +0 -1
  199. package/dist/esm/column.module.039d872c.css +0 -151
  200. package/dist/esm/column.module.039d872c.css.map +0 -1
  201. package/dist/esm/column.module.e632868a.js +0 -19
  202. package/dist/esm/column.module.e632868a.js.map +0 -1
  203. package/dist/esm/composite.608a4ca2.js +0 -153
  204. package/dist/esm/composite.608a4ca2.js.map +0 -1
  205. package/dist/esm/core.4db8e452.js.map +0 -1
  206. package/dist/esm/helpers.8a03cfc7.js +0 -94
  207. package/dist/esm/helpers.8a03cfc7.js.map +0 -1
  208. package/dist/esm/index.module.0844afd8.css +0 -65
  209. package/dist/esm/index.module.0844afd8.css.map +0 -1
  210. package/dist/esm/index.module.24fe3a2e.js +0 -37
  211. package/dist/esm/index.module.24fe3a2e.js.map +0 -1
  212. package/dist/esm/layers.ad5fd25d.js +0 -231
  213. package/dist/esm/layers.ad5fd25d.js.map +0 -1
  214. package/dist/esm/map.7aa26f17.js +0 -82
  215. package/dist/esm/map.7aa26f17.js.map +0 -1
  216. package/dist/esm/names.f6a4e9a4.js.map +0 -1
  217. package/dist/esm/providers.cd1e652f.js +0 -25
  218. package/dist/esm/providers.cd1e652f.js.map +0 -1
  219. package/dist/esm/resolvers.b5c82b78.js.map +0 -1
  220. package/dist/esm/section.cc1b1100.js +0 -118
  221. package/dist/esm/section.cc1b1100.js.map +0 -1
  222. package/dist/esm/selection-popover.17d1bd55.js +0 -60
  223. package/dist/esm/selection-popover.17d1bd55.js.map +0 -1
  224. package/dist/esm/selection-popover.module.0a701258.css.map +0 -1
  225. package/dist/esm/selection-popover.module.e22f5183.js +0 -22
  226. package/dist/esm/selection-popover.module.e22f5183.js.map +0 -1
  227. package/dist/esm/selection.bbf26d0e.js +0 -117
  228. package/dist/esm/selection.bbf26d0e.js.map +0 -1
  229. package/dist/esm/store.25eaa168.js +0 -18
  230. package/dist/esm/store.25eaa168.js.map +0 -1
  231. package/dist/esm/types.f016e032.js +0 -18
  232. package/dist/esm/types.f016e032.js.map +0 -1
  233. package/dist/esm/unit-details.56ff8b70.js +0 -209
  234. package/dist/esm/unit-details.56ff8b70.js.map +0 -1
  235. package/dist/esm/units.361088d4.js +0 -42
  236. package/dist/esm/units.361088d4.js.map +0 -1
  237. package/src/helpers.ts +0 -133
  238. package/src/providers.ts +0 -34
  239. package/src/selection-popover.ts +0 -71
  240. package/src/store.ts +0 -12
  241. package/src/units/units.scss +0 -16
  242. /package/src/{map → maps/column-navigation/svg}/animated.ts +0 -0
@@ -1,21 +1,18 @@
1
1
  import { BaseUnit } from "@macrostrat/api-types";
2
2
  import h from "@macrostrat/hyper";
3
+ import { useKeyHandler } from "@macrostrat/ui-components";
3
4
  import {
4
- getQueryString,
5
- setQueryString,
6
- useKeyHandler,
7
- } from "@macrostrat/ui-components";
8
- import {
9
- Dispatch,
10
- SetStateAction,
11
5
  createContext,
12
6
  useContext,
13
7
  useEffect,
14
- useMemo,
15
8
  useState,
16
9
  ReactNode,
10
+ RefObject,
11
+ useRef,
17
12
  useCallback,
18
13
  } from "react";
14
+ import { createStore, StoreApi, useStore } from "zustand";
15
+ import type { RectBounds, IUnit } from "./types";
19
16
 
20
17
  type UnitSelectDispatch = (
21
18
  unit: BaseUnit | null,
@@ -23,120 +20,137 @@ type UnitSelectDispatch = (
23
20
  event: Event | null
24
21
  ) => void;
25
22
 
26
- const UnitSelectionContext = createContext<BaseUnit | null>(null);
27
- const DispatchContext = createContext<UnitSelectDispatch | null>(null);
23
+ const UnitSelectionContext = createContext<StoreApi<UnitSelectionStore>>(null);
28
24
 
29
- export function useUnitSelectionDispatch() {
30
- return useContext(DispatchContext);
25
+ export function useUnitSelectionDispatch(): UnitSelectDispatch {
26
+ const store = useContext(UnitSelectionContext);
27
+ if (store == null) {
28
+ return () => {};
29
+ }
30
+ return useStore(store, (state) => state.onUnitSelected);
31
31
  }
32
32
 
33
- export function useSelectedUnit() {
34
- return useContext(UnitSelectionContext);
33
+ export function useUnitSelectionStore<T>(
34
+ selector: (state: UnitSelectionStore) => T
35
+ ): T {
36
+ const store = useContext(UnitSelectionContext);
37
+ if (store == null) {
38
+ throw new Error(
39
+ "useUnitSelectionStore must be used within a UnitSelectionProvider"
40
+ );
41
+ }
42
+ return useStore(store, selector);
35
43
  }
36
44
 
37
- export interface UnitSelectionProps<T extends BaseUnit> {
38
- children: React.ReactNode;
39
- unit: T | null;
40
- setUnit: Dispatch<SetStateAction<T>>;
41
- onUnitSelected?: (unit: T, target: HTMLElement, event: Event) => void;
45
+ export function useSelectedUnit() {
46
+ return useUnitSelectionStore((state) => state.selectedUnitData);
42
47
  }
43
48
 
44
- export function UnitSelectionProvider<T extends BaseUnit>(
45
- props: Partial<UnitSelectionProps<T>>
46
- ) {
47
- const { unit, setUnit, onUnitSelected, children } = props;
48
-
49
- if (unit == null && setUnit == null) {
50
- return h(StatefulUnitSelectionProvider, props);
51
- }
52
-
53
- return h(
54
- BaseUnitSelectionProvider,
55
- { unit, setUnit, onUnitSelected },
56
- children
57
- );
49
+ interface UnitSelectionStore {
50
+ selectedUnit: number | null;
51
+ selectedUnitData: BaseUnit | null;
52
+ overlayPosition: RectBounds | null;
53
+ onUnitSelected: UnitSelectDispatch;
54
+ setSelectedUnit: (unit: number | null) => void;
58
55
  }
59
56
 
60
- function StatefulUnitSelectionProvider<T extends BaseUnit>(props: {
57
+ export function UnitSelectionProvider<T extends BaseUnit>(props: {
61
58
  children: ReactNode;
62
- onUnitSelected?: (unit: T, target: HTMLElement, event: Event) => void;
59
+ columnRef?: RefObject<HTMLElement>;
60
+ units: T[];
61
+ selectedUnit: number | null;
62
+ onUnitSelected?: (unitID: number | null, unit: T | null) => void;
63
63
  }) {
64
- const [unit, setUnit] = useState<T | null>(null);
65
-
66
- return h(BaseUnitSelectionProvider, { ...props, unit, setUnit });
67
- }
68
-
69
- function BaseUnitSelectionProvider<T extends BaseUnit>({
70
- children,
71
- unit,
72
- setUnit,
73
- onUnitSelected,
74
- }: UnitSelectionProps<T>) {
75
- const value = useMemo(() => unit, [unit?.unit_id]);
76
-
77
- const _onUnitSelected = useCallback(
78
- (u: T, target: HTMLElement, event: Event) => {
79
- let newUnit = u;
80
- setUnit(newUnit);
81
- onUnitSelected?.(newUnit, target, event);
82
- },
83
- [setUnit, onUnitSelected]
64
+ const [store] = useState(() =>
65
+ createStore<UnitSelectionStore>((set) => ({
66
+ selectedUnit: null,
67
+ selectedUnitData: null,
68
+ overlayPosition: null,
69
+ setSelectedUnit(selectedUnit: number | null | BaseUnit) {
70
+ if (selectedUnit == null) {
71
+ set({ selectedUnit: null, selectedUnitData: null });
72
+ return;
73
+ // If it's a number, set the selected unit
74
+ } else if (typeof selectedUnit === "number") {
75
+ set({ selectedUnit, selectedUnitData: null });
76
+ } else if ("unit_id" in selectedUnit) {
77
+ set({
78
+ selectedUnit: selectedUnit.unit_id,
79
+ selectedUnitData: selectedUnit,
80
+ });
81
+ }
82
+ },
83
+ onUnitSelected: (unit: T, target: HTMLElement, event: Event) => {
84
+ console.log("onUnitSelected", unit, target, event);
85
+ const el = props.columnRef?.current;
86
+ let overlayPosition = null;
87
+ if (unit != null && el != null && target != null) {
88
+ const rect = el.getBoundingClientRect();
89
+ const targetRect = target.getBoundingClientRect();
90
+
91
+ overlayPosition = {
92
+ x: targetRect.left - rect.left,
93
+ y: targetRect.top - rect.top,
94
+ width: targetRect.width,
95
+ height: targetRect.height,
96
+ };
97
+ }
98
+ props.onUnitSelected?.(unit?.unit_id, unit);
99
+
100
+ return set({
101
+ selectedUnit: unit?.unit_id,
102
+ selectedUnitData: unit,
103
+ overlayPosition,
104
+ });
105
+ },
106
+ }))
84
107
  );
85
108
 
86
- return h(
87
- DispatchContext.Provider,
88
- { value: _onUnitSelected },
89
- h(UnitSelectionContext.Provider, { value }, children)
90
- );
91
- }
92
-
93
- export interface ColumnArgs {
94
- col_id?: number;
95
- unit_id?: number;
96
- project_id?: number;
97
- status_code?: "in process";
98
- }
109
+ const { units, selectedUnit } = props;
99
110
 
100
- type ColumnManagerData = [ColumnArgs, (c: ColumnArgs) => void];
111
+ useEffect(() => {
112
+ // Synchronize store with provided props
113
+ if (selectedUnit != null) {
114
+ const unitData = units?.find((u) => u.unit_id === selectedUnit);
115
+ store.setState({ selectedUnit, selectedUnitData: unitData });
116
+ } else {
117
+ store.setState({ selectedUnit: null, selectedUnitData: null });
118
+ }
119
+ }, [selectedUnit, units]);
101
120
 
102
- const ColumnNavCtx = createContext<ColumnManagerData | null>(null);
121
+ return h(UnitSelectionContext.Provider, { value: store }, props.children);
122
+ }
103
123
 
104
- export function useColumnNav(
105
- defaultArgs: ColumnArgs = { col_id: 495, unit_id: null }
106
- ): ColumnManagerData {
107
- const ctx = useContext(ColumnNavCtx);
108
- if (ctx != null) return ctx;
124
+ export function useUnitSelectionTarget(
125
+ unit: IUnit
126
+ ): [React.RefObject<HTMLElement>, boolean, (evt: Event) => void] {
127
+ const ref = useRef<HTMLElement>();
128
+ const selectedUnit = useSelectedUnit();
129
+ const onSelectUnit = useUnitSelectionStore((state) => state.onUnitSelected);
130
+ const selected = selectedUnit?.unit_id == unit.unit_id;
109
131
 
110
- const [columnArgs, setColumnArgs] = useState<ColumnArgs>(
111
- extractColumnArgs(getQueryString(window.location.search)) ?? defaultArgs
132
+ const onClick = useCallback(
133
+ (evt: Event) => {
134
+ onSelectUnit(unit, ref.current, evt);
135
+ evt.stopPropagation();
136
+ },
137
+ [unit, onSelectUnit]
112
138
  );
113
139
 
114
- useEffect(() => setQueryString(columnArgs), [columnArgs]);
140
+ useEffect(() => {
141
+ if (!selected) return;
142
+ // In case we haven't set the position of the unit (if we don't have a target), set the selected unit
143
+ onSelectUnit(unit, ref.current, null);
115
144
 
116
- const { col_id, project_id, status_code } = columnArgs;
117
-
118
- const setCurrentColumn = (obj) => {
119
- let args = obj;
120
- if ("properties" in obj) {
121
- args = { col_id: obj.properties.col_id, project_id, status_code };
122
- }
123
- // Set query string
124
- setQueryString(args);
125
- setColumnArgs(args);
126
- };
127
-
128
- return [columnArgs, setCurrentColumn];
129
- }
130
-
131
- function extractColumnArgs(search: any): ColumnArgs | null {
132
- const { col_id, unit_id, project_id, status_code } = search;
133
- if (col_id == null) return null;
134
- return { col_id, unit_id, project_id, status_code };
135
- }
145
+ // Scroll the unit into view
146
+ ref.current?.scrollIntoView({
147
+ behavior: "smooth",
148
+ block: "center",
149
+ inline: "nearest",
150
+ });
151
+ }, [selected, onSelectUnit]);
136
152
 
137
- export function ColumnNavProvider({ children, ...defaultArgs }) {
138
- const value = useColumnNav(defaultArgs as any);
139
- return h(ColumnNavCtx.Provider, { value }, children);
153
+ return [ref, selected, onClick];
140
154
  }
141
155
 
142
156
  export function UnitKeyboardNavigation<T extends BaseUnit>({
@@ -1,4 +1,3 @@
1
- import { ColumnAxisType } from "@macrostrat/column-components";
2
1
  export interface IUnit {
3
2
  unit_id: number;
4
3
  col_id: number;
@@ -8,19 +7,9 @@ export interface IUnit {
8
7
  [x: string]: any;
9
8
  }
10
9
 
11
- enum MacrostratAxisKey {
12
- AGE = "age",
13
- POS = "pos"
10
+ export interface RectBounds {
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
14
15
  }
15
-
16
- function transformAxisType(t: ColumnAxisType): MacrostratAxisKey {
17
- switch (t) {
18
- case "age":
19
- return MacrostratAxisKey.AGE;
20
- case "height":
21
- case "depth":
22
- return MacrostratAxisKey.POS;
23
- }
24
- }
25
-
26
- export { MacrostratAxisKey, transformAxisType };
@@ -1,41 +0,0 @@
1
- import $lfxOo$macrostrathyper from "@macrostrat/hyper";
2
- import {ColumnContext as $lfxOo$ColumnContext, ColumnAxis as $lfxOo$ColumnAxis, ColumnSVG as $lfxOo$ColumnSVG} from "@macrostrat/column-components";
3
- import {useContext as $lfxOo$useContext} from "react";
4
-
5
-
6
-
7
-
8
- // import "@macrostrat/timescale/dist/timescale.css";
9
- //
10
- const $43794af7643cdf40$var$AgeAxisCore = ({ ticks: ticks, tickSpacing: tickSpacing = 40, showDomain: showDomain = false })=>{
11
- const { pixelHeight: pixelHeight } = (0, $lfxOo$useContext)((0, $lfxOo$ColumnContext));
12
- // A tick roughly every 40 pixels
13
- let v = Math.max(Math.round(pixelHeight / tickSpacing), 1);
14
- return (0, $lfxOo$macrostrathyper)("g.axis", {
15
- transform: "translate(20 0)"
16
- }, [
17
- (0, $lfxOo$macrostrathyper)((0, $lfxOo$ColumnAxis), {
18
- ticks: v,
19
- showDomain: showDomain
20
- })
21
- ]);
22
- };
23
- function $43794af7643cdf40$export$25ce20521d0ab97d(props) {
24
- const { ticks: ticks, tickSpacing: tickSpacing, showLabel: showLabel = true, paddingV: paddingV = 10, showDomain: showDomain, ...rest } = props;
25
- // Not sure where this extra 5px comes from.
26
- return (0, $lfxOo$macrostrathyper)("div.column.age-axis", [
27
- (0, $lfxOo$macrostrathyper).if(showLabel)("div.age-axis-label", "Age (Ma)"),
28
- (0, $lfxOo$macrostrathyper)((0, $lfxOo$ColumnSVG), {
29
- paddingV: paddingV,
30
- ...rest
31
- }, (0, $lfxOo$macrostrathyper)($43794af7643cdf40$var$AgeAxisCore, {
32
- ticks: ticks,
33
- tickSpacing: tickSpacing,
34
- showDomain: showDomain
35
- }))
36
- ]);
37
- }
38
-
39
-
40
- export {$43794af7643cdf40$export$25ce20521d0ab97d as AgeAxis};
41
- //# sourceMappingURL=age-axis.64c509ee.js.map
@@ -1 +0,0 @@
1
- {"mappings":";;;;;;;AAOA,qDAAqD;AACrD,EAAE;AACF,MAAM,oCAAc,CAAC,SAAE,KAAK,eAAE,cAAc,gBAAI,aAAa,OAAO;IAClE,MAAM,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,oBAAY;IAC/C,iCAAiC;IACjC,IAAI,IAAI,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,cAAc,cAAc;IAExD,OAAO,CAAA,GAAA,sBAAA,EAAE,UAAU;QAAE,WAAW;IAAkB,GAAG;QACnD,CAAA,GAAA,sBAAA,EAAE,CAAA,GAAA,iBAAS,GAAG;YACZ,OAAO;wBACP;QACF;KACD;AACH;AAEO,SAAS,0CAAQ,KAAK;IAC3B,MAAM,SACJ,KAAK,eACL,WAAW,aACX,YAAY,gBACZ,WAAW,gBACX,UAAU,EACV,GAAG,MACJ,GAAG;IAEJ,4CAA4C;IAC5C,OAAO,CAAA,GAAA,sBAAA,EAAE,uBAAuB;QAC9B,CAAA,GAAA,sBAAA,EAAE,EAAE,CAAC,WAAW,sBAAsB;QACtC,CAAA,GAAA,sBAAA,EACE,CAAA,GAAA,gBAAQ,GACR;sBAAE;YAAU,GAAG,IAAI;QAAC,GACpB,CAAA,GAAA,sBAAA,EAAE,mCAAa;mBAAE;yBAAO;wBAAa;QAAW;KAEnD;AACH","sources":["packages/column-views/src/age-axis.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n ColumnSVG,\n ColumnAxis,\n ColumnContext,\n} from \"@macrostrat/column-components\";\nimport { useContext } from \"react\";\n// import \"@macrostrat/timescale/dist/timescale.css\";\n//\nconst AgeAxisCore = ({ ticks, tickSpacing = 40, showDomain = false }) => {\n const { pixelHeight } = useContext(ColumnContext);\n // A tick roughly every 40 pixels\n let v = Math.max(Math.round(pixelHeight / tickSpacing), 1);\n\n return h(\"g.axis\", { transform: \"translate(20 0)\" }, [\n h(ColumnAxis, {\n ticks: v,\n showDomain,\n }),\n ]);\n};\n\nexport function AgeAxis(props) {\n const {\n ticks,\n tickSpacing,\n showLabel = true,\n paddingV = 10,\n showDomain,\n ...rest\n } = props;\n\n // Not sure where this extra 5px comes from.\n return h(\"div.column.age-axis\", [\n h.if(showLabel)(\"div.age-axis-label\", \"Age (Ma)\"),\n h(\n ColumnSVG,\n { paddingV, ...rest },\n h(AgeAxisCore, { ticks, tickSpacing, showDomain })\n ),\n ]);\n}\n"],"names":[],"version":3,"file":"age-axis.64c509ee.js.map"}
@@ -1,164 +0,0 @@
1
- import {resolveID as $d3e69bd163d41f63$export$7be7d732f3de9464, scalePattern as $d3e69bd163d41f63$export$e8deec7b02ce51eb} from "./resolvers.b5c82b78.js";
2
- import {useSelectedUnit as $4d5d1c15f39f6a14$export$f0dd93f90aa8e5da, useUnitSelectionDispatch as $4d5d1c15f39f6a14$export$77a278d5ca56e309} from "./selection.bbf26d0e.js";
3
- import {transformAxisType as $faf1eba02aecac6a$export$ab2a19f8a72df19b} from "./types.f016e032.js";
4
- import "./boxes.module.28873d08.css";
5
- import $lClM8$boxesmodule605bdcd6js from "./boxes.module.605bdcd6.js";
6
- import {ColumnAxisType as $lClM8$ColumnAxisType, ColumnContext as $lClM8$ColumnContext, ColumnLayoutContext as $lClM8$ColumnLayoutContext, useColumn as $lClM8$useColumn, useGeologicPattern as $lClM8$useGeologicPattern, ForeignObject as $lClM8$ForeignObject, PatternDefsProvider as $lClM8$PatternDefsProvider} from "@macrostrat/column-components";
7
- import {SizeAwareLabel as $lClM8$SizeAwareLabel} from "@macrostrat/ui-components";
8
- import $lClM8$macrostrathyper from "@macrostrat/hyper";
9
- import {useContext as $lClM8$useContext, useRef as $lClM8$useRef, useCallback as $lClM8$useCallback, useEffect as $lClM8$useEffect, useMemo as $lClM8$useMemo} from "react";
10
-
11
-
12
- function $parcel$interopDefault(a) {
13
- return a && a.__esModule ? a.default : a;
14
- }
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
- const $d254716a820e9c85$var$h = (0, $lClM8$macrostrathyper).styled((0, ($parcel$interopDefault($lClM8$boxesmodule605bdcd6js))));
24
- function $d254716a820e9c85$var$useUnitRect(division, options = {}) {
25
- const { widthFraction: widthFraction = 1, axisType: axisType = (0, $lClM8$ColumnAxisType).AGE } = options;
26
- const { scale: scale } = (0, $lClM8$useContext)((0, $lClM8$ColumnContext));
27
- const { width: width } = (0, $lClM8$useContext)((0, $lClM8$ColumnLayoutContext));
28
- const macrostratAxisKey = (0, $faf1eba02aecac6a$export$ab2a19f8a72df19b)(axisType);
29
- const t_key = "t_" + macrostratAxisKey;
30
- const b_key = "b_" + macrostratAxisKey;
31
- const topHeight = division[t_key];
32
- const bottomHeight = division[b_key];
33
- if (topHeight == null && bottomHeight == null) console.warn(`Missing keys ${t_key} and ${b_key} for ${division.unit_id} (${division.unit_name})`);
34
- const y = scale(topHeight);
35
- const height = Math.abs(scale(bottomHeight) - y);
36
- return {
37
- x: width * (1 - widthFraction),
38
- y: y,
39
- height: height,
40
- width: widthFraction * width
41
- };
42
- }
43
- function $d254716a820e9c85$export$1d8b9ae22d404866(props) {
44
- const { division: d, children: children, defaultFill: defaultFill = "transparent", className: className, widthFraction: widthFraction = 1, ...baseBounds } = props;
45
- const { axisType: axisType } = (0, $lClM8$useColumn)();
46
- const bounds = {
47
- ...$d254716a820e9c85$var$useUnitRect(d, {
48
- widthFraction: widthFraction,
49
- axisType: axisType
50
- }),
51
- ...baseBounds
52
- };
53
- const patternID = (0, $d3e69bd163d41f63$export$7be7d732f3de9464)(d);
54
- const fill = (0, $lClM8$useGeologicPattern)(patternID, defaultFill);
55
- // Allow us to select this unit if in the proper context
56
- const ref = (0, $lClM8$useRef)();
57
- const [selected, onClick] = $d254716a820e9c85$var$useUnitSelectionManager(ref, d);
58
- return $d254716a820e9c85$var$h("g.unit", {
59
- className: className
60
- }, [
61
- $d254716a820e9c85$var$h("rect.unit", {
62
- ref: ref,
63
- ...bounds,
64
- fill: fill,
65
- onClick: onClick
66
- }),
67
- $d254716a820e9c85$var$h.if(selected)("rect.selection-overlay", bounds),
68
- children
69
- ]);
70
- }
71
- function $d254716a820e9c85$var$useUnitSelectionManager(ref, unit) {
72
- const selectedUnit = (0, $4d5d1c15f39f6a14$export$f0dd93f90aa8e5da)();
73
- const selected = selectedUnit?.unit_id == unit.unit_id;
74
- const dispatch = (0, $4d5d1c15f39f6a14$export$77a278d5ca56e309)();
75
- const onClick = (0, $lClM8$useCallback)((evt)=>{
76
- dispatch(unit, ref.current, evt);
77
- evt.stopPropagation();
78
- }, [
79
- unit,
80
- ref,
81
- dispatch
82
- ]);
83
- (0, $lClM8$useEffect)(()=>{
84
- if (!selected) return;
85
- // In case we haven't set the position of the unit (if we don't have a target), set the selected unit
86
- dispatch(unit, ref.current, null);
87
- // Scroll the unit into view
88
- ref.current?.scrollIntoView({
89
- behavior: "smooth",
90
- block: "center",
91
- inline: "nearest"
92
- });
93
- }, [
94
- selected
95
- ]);
96
- return [
97
- selected,
98
- onClick
99
- ];
100
- }
101
- function $d254716a820e9c85$export$b4f0ca233b98f9af(props) {
102
- const { division: division, label: label, onLabelUpdated: onLabelUpdated, widthFraction: widthFraction, ...baseBounds } = props;
103
- const { axisType: axisType } = (0, $lClM8$useColumn)();
104
- const bounds = {
105
- ...$d254716a820e9c85$var$useUnitRect(division, {
106
- widthFraction: widthFraction,
107
- axisType: axisType
108
- }),
109
- ...baseBounds
110
- };
111
- const { width: width, height: height } = bounds;
112
- return $d254716a820e9c85$var$h($d254716a820e9c85$export$1d8b9ae22d404866, {
113
- className: "labeled-unit",
114
- division: division,
115
- ...bounds
116
- }, [
117
- $d254716a820e9c85$var$h((0, $lClM8$ForeignObject), {
118
- ...bounds,
119
- className: "unit-label-container"
120
- }, $d254716a820e9c85$var$h((0, $lClM8$SizeAwareLabel), {
121
- className: "unit-overlay",
122
- labelClassName: "unit-label",
123
- style: {
124
- width: width,
125
- height: height
126
- },
127
- label: label,
128
- onVisibilityChanged (viz) {
129
- onLabelUpdated(label, viz);
130
- }
131
- }))
132
- ]);
133
- }
134
- function $d254716a820e9c85$export$5d1cdfabe8dc8085(props) {
135
- const { unitComponent: unitComponent = $d254716a820e9c85$export$1d8b9ae22d404866, unitComponentProps: unitComponentProps = {} } = props;
136
- const { divisions: divisions } = (0, $lClM8$useContext)((0, $lClM8$ColumnContext));
137
- if (divisions.length == 0) {
138
- console.warn("No divisions found in column context");
139
- return null;
140
- }
141
- const children = (0, $lClM8$useMemo)(()=>{
142
- return divisions.map((division, i)=>{
143
- // @ts-ignore
144
- return $d254716a820e9c85$var$h(unitComponent, {
145
- division: division,
146
- key: division.unit_id,
147
- axisType: (0, $lClM8$ColumnAxisType).HEIGHT,
148
- ...unitComponentProps
149
- });
150
- });
151
- }, [
152
- divisions,
153
- unitComponent,
154
- unitComponentProps
155
- ]);
156
- return $d254716a820e9c85$var$h((0, $lClM8$PatternDefsProvider), {
157
- resolveID: $d3e69bd163d41f63$export$7be7d732f3de9464,
158
- scalePattern: $d3e69bd163d41f63$export$e8deec7b02ce51eb
159
- }, $d254716a820e9c85$var$h("g.divisions", children));
160
- }
161
-
162
-
163
- export {$d254716a820e9c85$export$1d8b9ae22d404866 as Unit, $d254716a820e9c85$export$b4f0ca233b98f9af as LabeledUnit, $d254716a820e9c85$export$5d1cdfabe8dc8085 as UnitBoxes};
164
- //# sourceMappingURL=boxes.13968b76.js.map
@@ -1 +0,0 @@
1
- {"mappings":"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","sources":["packages/column-views/src/units/boxes.ts"],"sourcesContent":["import {\n ColumnAxisType,\n ColumnContext,\n ColumnLayoutContext,\n ForeignObject,\n PatternDefsProvider,\n useColumn,\n useGeologicPattern,\n} from \"@macrostrat/column-components\";\nimport { SizeAwareLabel, Clickable } from \"@macrostrat/ui-components\";\nimport hyper from \"@macrostrat/hyper\";\nimport {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { resolveID, scalePattern } from \"./resolvers\";\nimport { useSelectedUnit, useUnitSelectionDispatch } from \"./selection\";\nimport { IUnit, transformAxisType } from \"./types\";\nimport styles from \"./boxes.module.sass\";\n\nconst h = hyper.styled(styles);\n\nexport interface RectBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface UnitRectOptions {\n widthFraction?: number;\n axisType?: ColumnAxisType;\n}\n\ninterface UnitProps extends Clickable, Partial<RectBounds>, UnitRectOptions {\n division: IUnit;\n resolveID?(IUnit): string;\n UUID?: string;\n defaultFill?: string;\n widthFraction?: number;\n children?: ReactNode;\n className?: string;\n}\n\nexport interface LabeledUnitProps\n extends UnitRectOptions,\n Clickable,\n Partial<RectBounds> {\n division: IUnit;\n label: string;\n onLabelUpdated?(label: string, shown: boolean);\n halfWidth?: boolean;\n}\n\nfunction useUnitRect(\n division: IUnit,\n options: UnitRectOptions = {}\n): RectBounds {\n const { widthFraction = 1, axisType = ColumnAxisType.AGE } = options;\n const { scale } = useContext(ColumnContext);\n const { width } = useContext(ColumnLayoutContext);\n const macrostratAxisKey = transformAxisType(axisType);\n const t_key = \"t_\" + macrostratAxisKey;\n const b_key = \"b_\" + macrostratAxisKey;\n\n const topHeight = division[t_key];\n const bottomHeight = division[b_key];\n if (topHeight == null && bottomHeight == null) {\n console.warn(\n `Missing keys ${t_key} and ${b_key} for ${division.unit_id} (${division.unit_name})`\n );\n }\n\n const y = scale(topHeight);\n const height = Math.abs(scale(bottomHeight) - y);\n\n return {\n x: width * (1 - widthFraction),\n y,\n height,\n width: widthFraction * width,\n };\n}\n\nfunction Unit(props: UnitProps) {\n const {\n division: d,\n children,\n defaultFill = \"transparent\",\n className,\n widthFraction = 1,\n ...baseBounds\n } = props;\n\n const { axisType } = useColumn();\n const bounds = {\n ...useUnitRect(d, { widthFraction, axisType }),\n ...baseBounds,\n };\n const patternID = resolveID(d);\n const fill = useGeologicPattern(patternID, defaultFill);\n // Allow us to select this unit if in the proper context\n\n const ref = useRef<HTMLElement>();\n\n const [selected, onClick] = useUnitSelectionManager(ref, d);\n\n return h(\"g.unit\", { className }, [\n h(\"rect.unit\", {\n ref,\n ...bounds,\n fill,\n onClick,\n }),\n h.if(selected)(\"rect.selection-overlay\", bounds),\n children,\n ]);\n}\n\nfunction useUnitSelectionManager(\n ref: React.RefObject<HTMLElement>,\n unit: IUnit\n): [boolean, (evt: Event) => void] {\n const selectedUnit = useSelectedUnit();\n const selected = selectedUnit?.unit_id == unit.unit_id;\n\n const dispatch = useUnitSelectionDispatch();\n\n const onClick = useCallback(\n (evt: Event) => {\n dispatch(unit, ref.current, evt);\n evt.stopPropagation();\n },\n [unit, ref, dispatch]\n );\n\n useEffect(() => {\n if (!selected) return;\n // In case we haven't set the position of the unit (if we don't have a target), set the selected unit\n dispatch(unit, ref.current, null);\n\n // Scroll the unit into view\n ref.current?.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"nearest\",\n });\n }, [selected]);\n\n return [selected, onClick];\n}\n\nfunction LabeledUnit(props: LabeledUnitProps) {\n const { division, label, onLabelUpdated, widthFraction, ...baseBounds } =\n props;\n\n const { axisType } = useColumn();\n const bounds = {\n ...useUnitRect(division, { widthFraction, axisType }),\n ...baseBounds,\n };\n const { width, height } = bounds;\n return h(Unit, { className: \"labeled-unit\", division, ...bounds }, [\n h(\n ForeignObject,\n { ...bounds, className: \"unit-label-container\" },\n h(SizeAwareLabel, {\n className: \"unit-overlay\",\n labelClassName: \"unit-label\",\n style: { width, height },\n label,\n onVisibilityChanged(viz) {\n onLabelUpdated(label, viz);\n },\n })\n ),\n ]);\n}\n\nfunction UnitBoxes<T>(props: {\n unitComponent: React.FunctionComponent<{ division: T }>;\n unitComponentProps?: any;\n transformDivisions?(divisions: T[]): T[];\n transformDivision?: (\n division: any,\n index: number,\n divisions: any[]\n ) => T | null;\n}) {\n const { unitComponent = Unit, unitComponentProps = {} } = props;\n const { divisions } = useContext(ColumnContext);\n\n if (divisions.length == 0) {\n console.warn(\"No divisions found in column context\");\n return null;\n }\n\n const children = useMemo(() => {\n return divisions.map((division: any, i) => {\n // @ts-ignore\n return h(unitComponent, {\n division,\n key: division.unit_id,\n axisType: ColumnAxisType.HEIGHT,\n ...unitComponentProps,\n });\n });\n }, [divisions, unitComponent, unitComponentProps]);\n\n return h(\n PatternDefsProvider,\n { resolveID, scalePattern },\n h(\"g.divisions\", children)\n );\n}\n\nexport { LabeledUnit, Unit, UnitBoxes, UnitProps };\n"],"names":[],"version":3,"file":"boxes.13968b76.js.map"}
@@ -1,4 +0,0 @@
1
- .WkKD8q_unit-label-container {
2
- pointer-events: none;
3
- }
4
- /*# sourceMappingURL=boxes.module.28873d08.css.map */
@@ -1 +0,0 @@
1
- {"mappings":"AAAA","sources":["packages/column-views/src/units/boxes.module.sass"],"sourcesContent":[".unit-label-container\n pointer-events: none\n\n"],"names":[],"version":3,"file":"boxes.module.28873d08.css.map"}
@@ -1,13 +0,0 @@
1
-
2
- function $parcel$export(e, n, v, s) {
3
- Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
4
- }
5
- var $b9031ec72fd2f651$exports = {};
6
-
7
- $parcel$export($b9031ec72fd2f651$exports, "unit-label-container", () => $b9031ec72fd2f651$export$7756584041496870, (v) => $b9031ec72fd2f651$export$7756584041496870 = v);
8
- var $b9031ec72fd2f651$export$7756584041496870;
9
- $b9031ec72fd2f651$export$7756584041496870 = `WkKD8q_unit-label-container`;
10
-
11
-
12
- export {$b9031ec72fd2f651$exports as default};
13
- //# sourceMappingURL=boxes.module.605bdcd6.js.map
@@ -1 +0,0 @@
1
- {"mappings":";;;;;;;AAAA,IAAA;AAAA,4CAAyC,CAAC,2BAA2B,CAAC","sources":["packages/column-views/src/units/boxes.module.sass"],"sourcesContent":[".unit-label-container\n pointer-events: none\n\n"],"names":[],"version":3,"file":"boxes.module.605bdcd6.js.map"}