@macrostrat/column-views 3.8.0 → 3.10.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 (173) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/dist/animated-age-window.cjs +51 -0
  3. package/dist/animated-age-window.cjs.map +1 -0
  4. package/dist/animated-age-window.d.ts +51 -0
  5. package/dist/animated-age-window.js +51 -0
  6. package/dist/animated-age-window.js.map +1 -0
  7. package/dist/column.cjs +11 -1
  8. package/dist/column.cjs.map +1 -1
  9. package/dist/column.d.ts +11 -0
  10. package/dist/column.js +11 -1
  11. package/dist/column.js.map +1 -1
  12. package/dist/correlation-chart/main.cjs +24 -12
  13. package/dist/correlation-chart/main.cjs.map +1 -1
  14. package/dist/correlation-chart/main.d.ts +8 -1
  15. package/dist/correlation-chart/main.js +24 -12
  16. package/dist/correlation-chart/main.js.map +1 -1
  17. package/dist/data-provider/store.cjs +17 -4
  18. package/dist/data-provider/store.cjs.map +1 -1
  19. package/dist/data-provider/store.d.ts +6 -1
  20. package/dist/data-provider/store.js +17 -4
  21. package/dist/data-provider/store.js.map +1 -1
  22. package/dist/index.cjs +17 -42
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +3 -1
  25. package/dist/index.js +3 -34
  26. package/dist/index.js.map +1 -1
  27. package/dist/prepare-units/composite-scale.cjs +94 -8
  28. package/dist/prepare-units/composite-scale.cjs.map +1 -1
  29. package/dist/prepare-units/composite-scale.d.ts +39 -0
  30. package/dist/prepare-units/composite-scale.js +96 -10
  31. package/dist/prepare-units/composite-scale.js.map +1 -1
  32. package/dist/prepare-units/helpers.cjs +0 -1
  33. package/dist/prepare-units/helpers.cjs.map +1 -1
  34. package/dist/prepare-units/helpers.js +0 -1
  35. package/dist/prepare-units/helpers.js.map +1 -1
  36. package/dist/prepare-units/index.cjs +33 -12
  37. package/dist/prepare-units/index.cjs.map +1 -1
  38. package/dist/prepare-units/index.js +34 -13
  39. package/dist/prepare-units/index.js.map +1 -1
  40. package/dist/prepare-units/types.cjs.map +1 -1
  41. package/dist/prepare-units/types.d.ts +13 -0
  42. package/dist/prepare-units/types.js.map +1 -1
  43. package/dist/section.cjs +4 -2
  44. package/dist/section.cjs.map +1 -1
  45. package/dist/section.d.ts +4 -1
  46. package/dist/section.js +4 -2
  47. package/dist/section.js.map +1 -1
  48. package/dist/units/boxes.cjs +22 -39
  49. package/dist/units/boxes.cjs.map +1 -1
  50. package/dist/units/boxes.js +24 -41
  51. package/dist/units/boxes.js.map +1 -1
  52. package/dist/units/composite.cjs +12 -12
  53. package/dist/units/composite.cjs.map +1 -1
  54. package/dist/units/composite.js +12 -12
  55. package/dist/units/composite.js.map +1 -1
  56. package/dist/units/index.cjs +7 -11
  57. package/dist/units/index.cjs.map +1 -1
  58. package/dist/units/index.d.ts +0 -1
  59. package/dist/units/index.js +4 -9
  60. package/dist/units/index.js.map +1 -1
  61. package/package.json +10 -31
  62. package/src/animated-age-window.ts +120 -0
  63. package/src/column.ts +24 -0
  64. package/src/correlation-chart/main.ts +30 -8
  65. package/src/data-provider/store.ts +21 -2
  66. package/src/index.ts +4 -1
  67. package/src/prepare-units/composite-scale.ts +210 -10
  68. package/src/prepare-units/helpers.ts +0 -2
  69. package/src/prepare-units/index.ts +68 -14
  70. package/src/prepare-units/types.ts +13 -0
  71. package/src/section.ts +6 -0
  72. package/src/units/boxes.ts +37 -56
  73. package/src/units/composite.ts +21 -12
  74. package/src/units/index.ts +9 -26
  75. package/dist/maps/column-correlation/core.cjs +0 -288
  76. package/dist/maps/column-correlation/core.cjs.map +0 -1
  77. package/dist/maps/column-correlation/core.d.ts +0 -9
  78. package/dist/maps/column-correlation/core.js +0 -286
  79. package/dist/maps/column-correlation/core.js.map +0 -1
  80. package/dist/maps/column-correlation/index.d.ts +0 -2
  81. package/dist/maps/column-correlation/state.cjs +0 -193
  82. package/dist/maps/column-correlation/state.cjs.map +0 -1
  83. package/dist/maps/column-correlation/state.d.ts +0 -62
  84. package/dist/maps/column-correlation/state.js +0 -190
  85. package/dist/maps/column-correlation/state.js.map +0 -1
  86. package/dist/maps/column-navigation/index.d.ts +0 -2
  87. package/dist/maps/column-navigation/mapbox/index.cjs +0 -215
  88. package/dist/maps/column-navigation/mapbox/index.cjs.map +0 -1
  89. package/dist/maps/column-navigation/mapbox/index.d.ts +0 -38
  90. package/dist/maps/column-navigation/mapbox/index.js +0 -213
  91. package/dist/maps/column-navigation/mapbox/index.js.map +0 -1
  92. package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs +0 -105
  93. package/dist/maps/column-navigation/mapbox/keyboard-navigation.cjs.map +0 -1
  94. package/dist/maps/column-navigation/mapbox/keyboard-navigation.d.ts +0 -8
  95. package/dist/maps/column-navigation/mapbox/keyboard-navigation.js +0 -105
  96. package/dist/maps/column-navigation/mapbox/keyboard-navigation.js.map +0 -1
  97. package/dist/maps/column-navigation/mapbox/state.cjs +0 -73
  98. package/dist/maps/column-navigation/mapbox/state.cjs.map +0 -1
  99. package/dist/maps/column-navigation/mapbox/state.d.ts +0 -23
  100. package/dist/maps/column-navigation/mapbox/state.js +0 -71
  101. package/dist/maps/column-navigation/mapbox/state.js.map +0 -1
  102. package/dist/maps/column-navigation/svg/animated.d.ts +0 -1
  103. package/dist/maps/column-navigation/svg/data-fetcher.cjs +0 -25
  104. package/dist/maps/column-navigation/svg/data-fetcher.cjs.map +0 -1
  105. package/dist/maps/column-navigation/svg/data-fetcher.d.ts +0 -6
  106. package/dist/maps/column-navigation/svg/data-fetcher.js +0 -25
  107. package/dist/maps/column-navigation/svg/data-fetcher.js.map +0 -1
  108. package/dist/maps/column-navigation/svg/index.cjs +0 -94
  109. package/dist/maps/column-navigation/svg/index.cjs.map +0 -1
  110. package/dist/maps/column-navigation/svg/index.d.ts +0 -9
  111. package/dist/maps/column-navigation/svg/index.js +0 -93
  112. package/dist/maps/column-navigation/svg/index.js.map +0 -1
  113. package/dist/maps/column-navigation/svg/layers.cjs +0 -177
  114. package/dist/maps/column-navigation/svg/layers.cjs.map +0 -1
  115. package/dist/maps/column-navigation/svg/layers.d.ts +0 -54
  116. package/dist/maps/column-navigation/svg/layers.js +0 -174
  117. package/dist/maps/column-navigation/svg/layers.js.map +0 -1
  118. package/dist/maps/column-navigation/utils/keyboard-navigation.cjs +0 -50
  119. package/dist/maps/column-navigation/utils/keyboard-navigation.cjs.map +0 -1
  120. package/dist/maps/column-navigation/utils/keyboard-navigation.d.ts +0 -10
  121. package/dist/maps/column-navigation/utils/keyboard-navigation.js +0 -50
  122. package/dist/maps/column-navigation/utils/keyboard-navigation.js.map +0 -1
  123. package/dist/maps/index.d.ts +0 -4
  124. package/dist/maps/inset-map/index.cjs +0 -71
  125. package/dist/maps/inset-map/index.cjs.map +0 -1
  126. package/dist/maps/inset-map/index.d.ts +0 -16
  127. package/dist/maps/inset-map/index.js +0 -69
  128. package/dist/maps/inset-map/index.js.map +0 -1
  129. package/dist/maps/layers/columns.cjs +0 -165
  130. package/dist/maps/layers/columns.cjs.map +0 -1
  131. package/dist/maps/layers/columns.d.ts +0 -28
  132. package/dist/maps/layers/columns.js +0 -165
  133. package/dist/maps/layers/columns.js.map +0 -1
  134. package/dist/maps/layers/index.d.ts +0 -2
  135. package/dist/maps/layers/units.cjs +0 -207
  136. package/dist/maps/layers/units.cjs.map +0 -1
  137. package/dist/maps/layers/units.d.ts +0 -14
  138. package/dist/maps/layers/units.js +0 -204
  139. package/dist/maps/layers/units.js.map +0 -1
  140. package/dist/units/colors.cjs +0 -115
  141. package/dist/units/colors.cjs.map +0 -1
  142. package/dist/units/colors.d.ts +0 -20
  143. package/dist/units/colors.js +0 -113
  144. package/dist/units/colors.js.map +0 -1
  145. package/dist/units/resolvers.cjs +0 -125
  146. package/dist/units/resolvers.cjs.map +0 -1
  147. package/dist/units/resolvers.d.ts +0 -8
  148. package/dist/units/resolvers.js +0 -125
  149. package/dist/units/resolvers.js.map +0 -1
  150. package/src/maps/column-correlation/column-correlation-map.stories.ts +0 -108
  151. package/src/maps/column-correlation/core.ts +0 -342
  152. package/src/maps/column-correlation/index.ts +0 -2
  153. package/src/maps/column-correlation/state.ts +0 -315
  154. package/src/maps/column-navigation/index.ts +0 -2
  155. package/src/maps/column-navigation/mapbox/column-navigation-map.stories.ts +0 -278
  156. package/src/maps/column-navigation/mapbox/index.ts +0 -276
  157. package/src/maps/column-navigation/mapbox/keyboard-navigation.ts +0 -133
  158. package/src/maps/column-navigation/mapbox/state.ts +0 -119
  159. package/src/maps/column-navigation/svg/animated.ts +0 -78
  160. package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +0 -46
  161. package/src/maps/column-navigation/svg/data-fetcher.ts +0 -34
  162. package/src/maps/column-navigation/svg/index.ts +0 -96
  163. package/src/maps/column-navigation/svg/layers.ts +0 -233
  164. package/src/maps/column-navigation/utils/keyboard-navigation.ts +0 -58
  165. package/src/maps/index.ts +0 -4
  166. package/src/maps/inset-map/index.ts +0 -87
  167. package/src/maps/inset-map/inset-map.stories.ts +0 -20
  168. package/src/maps/layers/columns.ts +0 -216
  169. package/src/maps/layers/index.ts +0 -2
  170. package/src/maps/layers/units.ts +0 -286
  171. package/src/maps/unit-map.stories.ts +0 -79
  172. package/src/units/colors.ts +0 -183
  173. package/src/units/resolvers.ts +0 -141
@@ -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 { BaseUnit, Lithology } from \"@macrostrat/api-types\";\nimport { UnitWithLayoutParameters } 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: UnitWithLayoutParameters<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 let reducedWidth = _nColumns;\n if (\"layout\" in division) {\n const layout = division.layout;\n _nColumns = Math.min(_nColumns, layout.totalColumns);\n columnIx = layout.column;\n reducedWidth = width / layout.totalColumns / layout.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":";;;;;;;;;;;;AAsBO,SAAS,YAAY,EAAE,QAAQ,OAAO;AAI3C,SAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,CAAC;AACnD;AAEO,SAAS,kBAAkB,OAA4B;AAK5D,QAAM,EAAE,aAAa,OAAO,cAAc,GAAG,cAAc,OAAO;AAElE,SAAO,EAAE;AAAA,IACP,EAAE,aAAa;AAAA,MACb,OAAO;AAAA,IAAA,CACR;AAAA,IACD,EAAE,iBAAiB;AAAA,MACjB,WAAW,aAAa,cAAc,WAAW;AAAA,MACjD,aAAa;AAAA,MACb,OAAO,QAAQ,cAAc;AAAA,IAAA,CAC9B;AAAA,EAAA,CACF;AACH;AAEO,SAAS,mBAAmB,EAAE,UAAU,GAAG,QAAQ;AAGxD,SAAO,EAAE,eAAe;AAAA,IACtB;AAAA,IACA,GAAG;AAAA,IACH,iBAAiB,SAAS;AAAA,IAC1B,WAAW,SAAS;AAAA,EAAA,CACrB;AACH;AAQO,SAAS,cAAkC;AAAA,EAChD;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACL,GAA0B;AACxB,QAAM,QAAQ,KAAK,SAAS,gBAAA,GAAmB;AAE/C,MAAI,YAAY;AAChB,MAAI,MAAM,SAAS,GAAG;AACpB,gBAAY;AAAA,EACd;AACA,MAAI,WAAW;AACf,MAAI,IAAI;AAER,MAAI,eAAe;AACnB,MAAI,YAAY,UAAU;AACxB,UAAM,SAAS,SAAS;AACxB,gBAAY,KAAK,IAAI,WAAW,OAAO,YAAY;AACnD,eAAW,OAAO;AAClB,mBAAe,QAAQ,OAAO,eAAe,OAAO;AACpD,QAAK,WAAW,QAAS;AAAA,EAC3B;AACA,SAAO,EAAE,oBAAoB;AAAA,IAC3B;AAAA,IACA,GAAG;AAAA,IACH,OAAO;AAAA,IACP;AAAA,EAAA,CACD;AACH;AAMO,SAAS,aAAa,MAAM,OAAyB,IAAmB;AAE7E,QAAM,UAAU,eAAA;AAChB,QAAM,aAAa,cAAA;AACnB,QAAM,EAAE,eAAe,KAAA,IAAS;AAEhC,SAAO,QAAQ,MAAM;AACnB,QAAI,QAAQ,QAAQ,WAAW,KAAM,QAAO;AAC5C,WAAO,kBAAkB,MAAM,SAAS,YAAY,YAAY;AAAA,EAClE,GAAG,CAAC,MAAM,SAAS,SAAS,YAAY,YAAY,CAAC;AACvD;AAEO,SAAS,qBAAqB,OAAO;AAG1C,QAAM,kBAAkB,aAAa,MAAM,QAAQ;AAEnD,QAAM,YAAY,QAAQ,MAAM;AAC9B,WAAO,UAAU,MAAM,QAAQ;AAAA,EACjC,GAAG,CAAC,MAAM,UAAU,OAAO,CAAC;AAE5B,QAAM,OAAO,mBAAmB,SAAS;AAEzC,SAAO,EAAE,eAAe;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,CACJ;AACH;AAEO,SAAS,0BACd,MACA,OAAyB,IACV;AAEf,QAAM,iBAAiB,gBAAA;AACvB,QAAM,UAAU,eAAA;AAChB,QAAM,aAAa,cAAA;AACnB,QAAM,EAAE,eAAe,KAAA,IAAS;AAEhC,SAAO,QAAQ,MAAM;AACnB,QAAI,QAAQ,QAAQ,kBAAkB,KAAM,QAAO;AACnD,QAAI,IAAI,kBAAkB,MAAM,gBAAgB,YAAY,cAAc;AAAA,MACxE,KAAK;AAAA,MACL,QAAQ;AAAA,IAAA,CACT;AACD,QAAI,KAAK,MAAM;AACb,aAAO;AAAA,IACT;AAEA,WAAO,kBAAkB,MAAM,SAAS,YAAY,YAAY;AAAA,EAClE,GAAG,CAAC,MAAM,SAAS,gBAAgB,SAAS,YAAY,YAAY,CAAC;AACvE;AAEO,SAAS,gCAAgC,OAAO;AAGrD,QAAM,kBAAkB,0BAA0B,MAAM,QAAQ;AAEhE,QAAM,YAAY,QAAQ,MAAM;AAC9B,WAAO,UAAU,MAAM,QAAQ;AAAA,EACjC,GAAG,CAAC,MAAM,UAAU,OAAO,CAAC;AAE5B,QAAM,OAAO,mBAAmB,SAAS;AAEzC,SAAO,EAAE,eAAe;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,CACJ;AACH;"}
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 } from \"./boxes\";\nimport { useColumnLayout } from \"@macrostrat/column-components\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport {\n getBestFGDCPatternForUnit,\n getMixedUnitColor,\n} from \"@macrostrat/stratigraphy-utils\";\nimport { TrackedLabeledUnit } from \"./composite\";\nimport { useEnvironments, useLithologies } from \"@macrostrat/data-provider\";\nimport { useMemo } from \"react\";\nimport { BaseUnit, Lithology } from \"@macrostrat/api-types\";\nimport { UnitWithLayoutParameters } from \"../prepare-units/helpers.ts\";\n\nexport * from \"./composite\";\nexport * from \"./types\";\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: UnitWithLayoutParameters<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 let reducedWidth = _nColumns;\n if (\"layout\" in division) {\n const layout = division.layout;\n _nColumns = layout.totalColumns;\n columnIx = layout.column;\n reducedWidth = width / layout.totalColumns / layout.nColumns;\n x = (columnIx * width) / _nColumns;\n }\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 getBestFGDCPatternForUnit(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 getBestFGDCPatternForUnit(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"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@macrostrat/column-views",
3
- "version": "3.8.0",
3
+ "version": "3.10.0",
4
4
  "description": "Data views for Macrostrat stratigraphic columns",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,50 +46,29 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@blueprintjs/core": "^6.14.0",
49
- "@macrostrat/api-types": "^1.2.0",
49
+ "@macrostrat/api-types": "^1.3.0",
50
50
  "@macrostrat/color-utils": "^1.2.2",
51
- "@macrostrat/column-components": "^2.0.10",
52
- "@macrostrat/data-components": "^1.5.0",
51
+ "@macrostrat/column-components": "^2.1.0",
52
+ "@macrostrat/data-components": "^1.5.1",
53
53
  "@macrostrat/data-provider": "^1.2.0",
54
54
  "@macrostrat/hyper": "^3.1.1",
55
- "@macrostrat/map-interface": "^2.3.1",
56
- "@macrostrat/map-styles": "^2.2.6",
57
- "@macrostrat/mapbox-react": "^3.3.3",
58
- "@macrostrat/mapbox-utils": "^1.8.0",
59
- "@macrostrat/scoped-store": "^1.0.1",
60
- "@macrostrat/stratigraphy-utils": "^1.3.0",
61
- "@macrostrat/svg-map-components": "^2.0.3",
62
- "@macrostrat/timescale": "^3.1.6",
63
- "@macrostrat/ui-components": "^5.1.0",
64
- "@turf/boolean-point-in-polygon": "^7.3.2",
65
- "@turf/buffer": "^7.3.2",
66
- "@turf/centroid": "^7.3.2",
67
- "@turf/distance": "^7.3.2",
68
- "@turf/line-intersect": "^7.3.2",
69
- "@turf/nearest-point-on-line": "^7.3.2",
55
+ "@macrostrat/map-views": "^1.0.0",
56
+ "@macrostrat/scoped-store": "^1.1.0",
57
+ "@macrostrat/stratigraphy-utils": "^1.4.0",
58
+ "@macrostrat/timescale": "^3.2.0",
59
+ "@macrostrat/ui-components": "^5.2.0",
70
60
  "@types/chroma-js": "^3.1.1",
71
61
  "@types/d3-format": "^3.0.4",
72
- "@types/d3-geo": "^3.1.0",
73
62
  "@types/d3-shape": "^3.1.7",
74
- "@types/topojson-client": "^3.1.5",
75
63
  "@visx/axis": "^3.12.0",
76
64
  "chroma-js": "^3.2.0",
77
65
  "classnames": "^2.5.1",
78
- "cross-fetch": "^4.1.0",
79
66
  "d3-array": "^3.2.4",
80
67
  "d3-format": "^3.1.2",
81
- "d3-geo": "^3.1.1",
82
- "d3-geo-voronoi": "^2.1.0",
83
68
  "d3-path": "^3.1.0",
84
69
  "d3-scale": "^4.0.2",
85
70
  "d3-shape": "^3.2.0",
86
- "jotai": "^2.20.0",
87
- "mapbox-gl": "^3.0.0",
88
- "p-map": "^7.0.4",
89
- "react-spring": "^9.7.5",
90
- "topojson-client": "^3.1.0",
91
- "zustand": "^5.0.3",
92
- "zustand-computed": "^2.0.2"
71
+ "jotai": "^2.20.0"
93
72
  },
94
73
  "devDependencies": {
95
74
  "@macrostrat/web-components-bundler": "1.0.1",
@@ -0,0 +1,120 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { AgeDomain, useAnimatedDomain } from "@macrostrat/timescale";
3
+
4
+ /** A rendered age window, ordered as the column props expect:
5
+ * `t_age` is the younger (top) bound, `b_age` the older (bottom) bound. */
6
+ export interface AgeWindow {
7
+ t_age: number;
8
+ b_age: number;
9
+ }
10
+
11
+ export interface AnimateWindowOptions {
12
+ duration?: number;
13
+ }
14
+
15
+ export interface UseAnimatedAgeWindowOptions {
16
+ /** The full data extent — the window to reset to, and the initial window.
17
+ * `null` until the data (and hence extent) is known. */
18
+ fullExtent: AgeWindow | null;
19
+ /** Animation duration in ms (default 750). */
20
+ duration?: number;
21
+ }
22
+
23
+ export interface AnimatedAgeWindow {
24
+ /** The current animated window to feed to `t_age`/`b_age` column props
25
+ * (`null` until `fullExtent` is known). */
26
+ window: AgeWindow | null;
27
+ isAnimating: boolean;
28
+ /** True when the window is (approximately) the full extent. */
29
+ isFullExtent: boolean;
30
+ /** Pan-and-contract to an explicit window (clamped to the full extent).
31
+ * Density (`pixelScale`) is left untouched — this is not a zoom. */
32
+ zoomToWindow(target: AgeWindow, opts?: AnimateWindowOptions): void;
33
+ /** Pan-and-contract to a timescale interval, using `eag`/`lag`. */
34
+ zoomToInterval(
35
+ interval: { eag: number; lag: number },
36
+ opts?: AnimateWindowOptions,
37
+ ): void;
38
+ /** Ease back to the full extent. */
39
+ reset(opts?: AnimateWindowOptions): void;
40
+ }
41
+
42
+ /**
43
+ * Animate the rendered age window (`t_age`/`b_age`) of a column or correlation
44
+ * chart. This is the "animate the current zoom approach" model: narrowing the
45
+ * window re-lays-out the column with explicit clipping — units past the bounds
46
+ * get a zig-zag edge, unconformities keep their fixed `unconformityHeight`, and
47
+ * `pixelScale` (density) is untouched, so a sub-interval click **pans and
48
+ * contracts** at constant density rather than zooming. Joint domain/range
49
+ * change (true zoom) stays under the user's direct control via `pixelScale`.
50
+ *
51
+ * The animation itself is `useAnimatedDomain` from `@macrostrat/timescale` —
52
+ * the same state machine that drives the timescale's `useZoomableScale`. This
53
+ * hook only maps an `[older, younger]` domain onto `{ b_age, t_age }`; it
54
+ * animates the window you ask for and nothing more. Revealing a margin of the
55
+ * neighboring column is the *layout's* job, via the `windowPadding` prop (px),
56
+ * which is resolved against real section heights rather than predicted here.
57
+ */
58
+ export function useAnimatedAgeWindow(
59
+ options: UseAnimatedAgeWindowOptions,
60
+ ): AnimatedAgeWindow {
61
+ const { fullExtent, duration } = options;
62
+
63
+ const extent = useMemo(() => toDomain(fullExtent), [
64
+ fullExtent?.t_age,
65
+ fullExtent?.b_age,
66
+ ]);
67
+
68
+ const anim = useAnimatedDomain({ extent, duration });
69
+
70
+ const zoomToWindow = useCallback(
71
+ (target: AgeWindow, opts: AnimateWindowOptions = {}) => {
72
+ anim.animateTo([target.b_age, target.t_age], {
73
+ duration: opts.duration,
74
+ });
75
+ },
76
+ [anim.animateTo],
77
+ );
78
+
79
+ const zoomToInterval = useCallback(
80
+ (
81
+ interval: { eag: number; lag: number },
82
+ opts: AnimateWindowOptions = {},
83
+ ) => {
84
+ zoomToWindow({ t_age: interval.lag, b_age: interval.eag }, opts);
85
+ },
86
+ [zoomToWindow],
87
+ );
88
+
89
+ const reset = useCallback(
90
+ (opts: AnimateWindowOptions = {}) => {
91
+ if (fullExtent == null) return;
92
+ zoomToWindow(fullExtent, opts);
93
+ },
94
+ [zoomToWindow, fullExtent?.t_age, fullExtent?.b_age],
95
+ );
96
+
97
+ return {
98
+ window: toWindow(anim.domain),
99
+ isAnimating: anim.isAnimating,
100
+ isFullExtent: anim.isFullExtent,
101
+ zoomToWindow,
102
+ zoomToInterval,
103
+ reset,
104
+ };
105
+ }
106
+
107
+ /** `{t_age, b_age}` ↔ the core's `[older, younger]` domain. */
108
+ function toDomain(w: AgeWindow): AgeDomain;
109
+ function toDomain(w: AgeWindow | null): AgeDomain | null;
110
+ function toDomain(w: AgeWindow | null): AgeDomain | null {
111
+ if (w == null) return null;
112
+ return [w.b_age, w.t_age];
113
+ }
114
+
115
+ function toWindow(d: AgeDomain): AgeWindow;
116
+ function toWindow(d: AgeDomain | null): AgeWindow | null;
117
+ function toWindow(d: AgeDomain | null): AgeWindow | null {
118
+ if (d == null) return null;
119
+ return { t_age: d[1], b_age: d[0] };
120
+ }
package/src/column.ts CHANGED
@@ -45,6 +45,10 @@ import {
45
45
  ColumnHeightScaleOptions,
46
46
  } from "./prepare-units";
47
47
  import { UnitLong } from "@macrostrat/api-types";
48
+ import type {
49
+ TimescaleClickHandler,
50
+ IntervalStyleBuilder,
51
+ } from "@macrostrat/timescale";
48
52
  import { NonIdealState } from "@blueprintjs/core";
49
53
  import { DataField } from "@macrostrat/data-components";
50
54
  import { ScaleContinuousNumeric } from "d3-scale";
@@ -61,6 +65,10 @@ interface BaseColumnProps extends Omit<
61
65
  // Timescale properties
62
66
  showTimescale?: boolean;
63
67
  timescaleLevels?: number | [number, number];
68
+ /** Called when a timescale interval is clicked (e.g. to zoom the age range). */
69
+ onClickTimescaleInterval?: TimescaleClickHandler;
70
+ /** Per-interval style for the timescale (e.g. to bold the selected interval). */
71
+ timescaleIntervalStyle?: IntervalStyleBuilder;
64
72
  unconformityLabels?: boolean | UnconformityLabelPlacement;
65
73
  onMouseOver?: (
66
74
  unit: UnitLong | null,
@@ -87,6 +95,12 @@ export interface ColumnProps
87
95
  // Unconformity height in pixels
88
96
  unconformityHeight?: number;
89
97
  scale?: ScaleContinuousNumeric<number, number>;
98
+ /** True while the age window is animating (e.g. from `useAnimatedAgeWindow`),
99
+ * so per-frame label/pattern recalculation can be skipped. */
100
+ isTransitioning?: boolean;
101
+ /** Hide unit labels while transitioning (perf escape hatch; default false —
102
+ * labels stay visible through the animation). */
103
+ hideLabelsWhileTransitioning?: boolean;
90
104
  ref?: RefObject<ColumnRef>;
91
105
  }
92
106
 
@@ -108,11 +122,14 @@ export function Column(props: ColumnProps) {
108
122
  pixelScale,
109
123
  minPixelScale = 0.2,
110
124
  minSectionHeight = 50,
125
+ windowPadding = 0,
111
126
  collapseSmallUnconformities = true,
112
127
  allowUnitSelection = false,
113
128
  hybridScale,
114
129
  scale,
115
130
  axisType,
131
+ isTransitioning,
132
+ hideLabelsWhileTransitioning,
116
133
  ref,
117
134
  ...rest
118
135
  } = props;
@@ -152,6 +169,7 @@ export function Column(props: ColumnProps) {
152
169
  pixelScale,
153
170
  minPixelScale: _minPixelScale,
154
171
  minSectionHeight: _minSectionHeight,
172
+ windowPadding,
155
173
  collapseSmallUnconformities,
156
174
  // TODO: consider unifying scale and hybridScale options
157
175
  scale,
@@ -179,6 +197,8 @@ export function Column(props: ColumnProps) {
179
197
  allowUnitSelection: showUnitPopover || allowUnitSelection,
180
198
  onUnitSelected,
181
199
  selectedUnit,
200
+ isTransitioning,
201
+ hideLabelsWhileTransitioning,
182
202
  ref,
183
203
  },
184
204
  h(ColumnInner, { ageAxisComponent, ...rest }, [
@@ -218,6 +238,8 @@ function ColumnInner(props: ColumnInnerProps) {
218
238
  timescaleLevels,
219
239
  maxInternalColumns,
220
240
  onMouseOver,
241
+ onClickTimescaleInterval,
242
+ timescaleIntervalStyle,
221
243
  ageAxisComponent = CompositeAgeAxis,
222
244
  } = props;
223
245
 
@@ -262,6 +284,8 @@ function ColumnInner(props: ColumnInnerProps) {
262
284
  h.if(_showTimescale)(CompositeTimescale, {
263
285
  levels: timescaleLevels,
264
286
  unconformityLabels: _timescaleUnconformityLabels,
287
+ onClickInterval: onClickTimescaleInterval,
288
+ intervalStyle: timescaleIntervalStyle,
265
289
  }),
266
290
  h(SectionsColumn, {
267
291
  unitComponent,
@@ -69,6 +69,13 @@ export interface CorrelationChartProps extends CorrelationChartSettings {
69
69
  /** Content rendered above the timescale axis (top-left), beside the column
70
70
  * headers — e.g. a zoom/filter indicator. */
71
71
  axisTopContent?: React.ReactNode;
72
+ /** True while the age window is animating (e.g. from `useAnimatedAgeWindow`).
73
+ * Propagated to each column's context so per-frame label/pattern work can be
74
+ * skipped during the transition. */
75
+ isTransitioning?: boolean;
76
+ /** Hide unit labels while transitioning (perf escape hatch; default false —
77
+ * labels stay visible through the animation). */
78
+ hideLabelsWhileTransitioning?: boolean;
72
79
  onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;
73
80
  /** Called when a timescale interval is clicked (e.g. to zoom the age range) */
74
81
  onClickTimescaleInterval?: TimescaleClickHandler;
@@ -83,6 +90,14 @@ export interface CorrelationChartProps extends CorrelationChartSettings {
83
90
  * this so that they line up with the columns beneath them. */
84
91
  const chartPaddingH = 4;
85
92
 
93
+ /** Default scale settings for the correlation chart. */
94
+ const defaultCorrelationChartScaleProps = {
95
+ targetUnitHeight: 10,
96
+ unconformityHeight: 60,
97
+ minSectionHeight: 60,
98
+ collapseSmallUnconformities: true,
99
+ };
100
+
86
101
  function MainChartArea({ children }) {
87
102
  const columnRef = useColumnRef();
88
103
  return h("div.main-chart", { ref: columnRef }, children);
@@ -109,19 +124,14 @@ export function CorrelationChart({
109
124
  onClickTimescaleInterval,
110
125
  onColumnMouseOver,
111
126
  onColumnClick,
127
+ isTransitioning = false,
128
+ hideLabelsWhileTransitioning = false,
112
129
  ...scaleProps
113
130
  }: CorrelationChartProps) {
114
- const defaultScaleProps = {
115
- targetUnitHeight: 10,
116
- unconformityHeight: 60,
117
- minSectionHeight: 60,
118
- collapseSmallUnconformities: true,
119
- };
120
-
121
131
  const chartData = useMemo(() => {
122
132
  if (!data) return null;
123
133
  return buildCorrelationChartData(data, {
124
- ...defaultScaleProps,
134
+ ...defaultCorrelationChartScaleProps,
125
135
  ...scaleProps,
126
136
  });
127
137
  }, [data, ...Object.values(scaleProps)]);
@@ -180,6 +190,8 @@ export function CorrelationChart({
180
190
  scale,
181
191
  unitComponent,
182
192
  onColumnMouseOver,
193
+ isTransitioning,
194
+ hideLabelsWhileTransitioning,
183
195
  });
184
196
  }),
185
197
  ),
@@ -215,6 +227,8 @@ function Package({
215
227
  pixelScale,
216
228
  scale,
217
229
  onColumnMouseOver,
230
+ isTransitioning,
231
+ hideLabelsWhileTransitioning,
218
232
  }) {
219
233
  return h("g.package", { transform: `translate(0 ${offset})` }, [
220
234
  // Disable the SVG overlay for now
@@ -232,6 +246,8 @@ function Package({
232
246
  scale,
233
247
  offsetLeft: i * (columnWidth + columnSpacing),
234
248
  onColumnMouseOver,
249
+ isTransitioning,
250
+ hideLabelsWhileTransitioning,
235
251
  });
236
252
  }),
237
253
  ]),
@@ -253,6 +269,8 @@ interface ColumnProps {
253
269
  pixelScale: number;
254
270
  scale?: ScaleContinuousNumeric<number, number>;
255
271
  onColumnMouseOver?: (columnID: number | null) => void;
272
+ isTransitioning?: boolean;
273
+ hideLabelsWhileTransitioning?: boolean;
256
274
  }
257
275
 
258
276
  function Column(props: ColumnProps) {
@@ -266,6 +284,8 @@ function Column(props: ColumnProps) {
266
284
  scale,
267
285
  unitComponent = ColoredUnitComponent,
268
286
  onColumnMouseOver,
287
+ isTransitioning,
288
+ hideLabelsWhileTransitioning,
269
289
  } = props;
270
290
 
271
291
  const columnWidth = width;
@@ -297,6 +317,8 @@ function Column(props: ColumnProps) {
297
317
  scale,
298
318
  pixelsPerMeter: pixelScale, // Actually pixels per myr
299
319
  axisType: ColumnAxisType.AGE,
320
+ isTransitioning,
321
+ hideLabelsWhileTransitioning,
300
322
  },
301
323
  h(UnitBoxes, {
302
324
  unitComponent,
@@ -118,6 +118,11 @@ export interface MacrostratColumnDataContext<T extends BaseUnit> {
118
118
  totalHeight?: number;
119
119
  axisType?: ColumnAxisType;
120
120
  allowUnitSelection?: boolean;
121
+ /** True while the age window is animating; propagated to each section's
122
+ * `ColumnProvider` so per-frame label/pattern work can be skipped. */
123
+ isTransitioning?: boolean;
124
+ /** Hide unit labels while transitioning (perf escape hatch; default false). */
125
+ hideLabelsWhileTransitioning?: boolean;
121
126
  }
122
127
 
123
128
  export interface ColumnDataProviderProps<T extends BaseUnit>
@@ -138,6 +143,8 @@ export function MacrostratColumnDataProvider<T extends BaseUnit>({
138
143
  allowUnitSelection,
139
144
  onUnitSelected,
140
145
  selectedUnit,
146
+ isTransitioning,
147
+ hideLabelsWhileTransitioning,
141
148
  ref,
142
149
  }: ColumnDataProviderProps<T>) {
143
150
  /** Internal provider for Macrostrat column data.
@@ -158,8 +165,17 @@ export function MacrostratColumnDataProvider<T extends BaseUnit>({
158
165
  sections,
159
166
  totalHeight,
160
167
  axisType,
168
+ isTransitioning,
169
+ hideLabelsWhileTransitioning,
161
170
  };
162
- }, [units, sections, totalHeight, axisType]);
171
+ }, [
172
+ units,
173
+ sections,
174
+ totalHeight,
175
+ axisType,
176
+ isTransitioning,
177
+ hideLabelsWhileTransitioning,
178
+ ]);
163
179
 
164
180
  return h(
165
181
  MacrostratColumnStateProvider,
@@ -242,7 +258,8 @@ export function MacrostratColumnProvider(props) {
242
258
  * generic concepts to Macrostrat-specific ones.
243
259
  */
244
260
 
245
- const { axisType } = useMacrostratColumnData();
261
+ const { axisType, isTransitioning, hideLabelsWhileTransitioning } =
262
+ useMacrostratColumnData();
246
263
  const { units, domain, pixelScale, scale, children } = props;
247
264
  return h(
248
265
  ColumnProvider,
@@ -252,6 +269,8 @@ export function MacrostratColumnProvider(props) {
252
269
  range: domain,
253
270
  pixelsPerMeter: pixelScale,
254
271
  scale,
272
+ isTransitioning,
273
+ hideLabelsWhileTransitioning,
255
274
  },
256
275
  children,
257
276
  );
package/src/index.ts CHANGED
@@ -2,10 +2,13 @@ export * from "./units";
2
2
  export * from "./data-provider";
3
3
  export * from "./age-axis";
4
4
  export * from "./prepare-units";
5
+ export * from "./animated-age-window";
5
6
  export * from "./column";
6
7
  export * from "./unit-details";
7
- export * from "./maps";
8
8
  export * from "./age-model-overlay";
9
9
  export * from "./correlation-chart";
10
10
  export * from "./notes";
11
11
  export * from "./facets";
12
+
13
+ /** Legacy views */
14
+ export * from "@macrostrat/map-views";