{"version":3,"file":"column.cjs","sources":["../../src/context/column.ts"],"sourcesContent":["import { scaleLinear, ScaleContinuousNumeric, ScaleLinear } from \"d3-scale\";\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport h from \"@macrostrat/hyper\";\n\ntype HeightRange = number;\ntype ColumnScale = ScaleContinuousNumeric<HeightRange, number> | any;\n\ntype ColumnScaleClamped = ScaleContinuousNumeric<number, number>;\n\nexport declare interface ColumnDivision {\n  section_id: string;\n  id: number;\n  surface: number;\n  bottom: number;\n  top: number;\n  // Extra properties that are there for legacy purposes\n  flooding_surface_order?: number;\n  grainsize?: string;\n  covered?: boolean;\n  // Used for boundary management control\n  definite_boundary?: boolean;\n  facies?: string;\n}\n\nenum ColumnAxisType {\n  AGE = \"age\",\n  HEIGHT = \"height\",\n  DEPTH = \"depth\",\n  ORDINAL = \"ordinal\",\n}\nexport interface ColumnCtx<T extends ColumnDivision> {\n  divisions: T[];\n  scaleClamped: ColumnScaleClamped;\n  pixelsPerMeter: number;\n  scale: ColumnScale;\n  axisType?: ColumnAxisType;\n  pixelHeight?: number;\n  zoom: number;\n}\n\nexport const ColumnContext = createContext<ColumnCtx<ColumnDivision>>({\n  scale: scaleLinear(),\n  divisions: [],\n  scaleClamped: scaleLinear().clamp(true),\n  pixelsPerMeter: 1,\n  zoom: 1,\n});\n\nexport interface ColumnProviderProps<T extends ColumnDivision> {\n  pixelsPerMeter?: number;\n  divisions: T[];\n  range?: HeightRange | any;\n  height?: number;\n  zoom?: number;\n  width?: number;\n  axisType?: ColumnAxisType;\n  children?: any;\n  scale?: ColumnScale;\n}\n\nfunction ColumnProvider<T extends ColumnDivision>(\n  props: ColumnProviderProps<T>,\n) {\n  /**\n    Lays out a column on its Y (height) axis.\n    This component would be swapped to provide eventual generalization to a Wheeler-diagram\n    (time-domain) framework.\n    */\n\n  let {\n    children,\n    pixelsPerMeter = 20,\n    zoom = 1,\n    height,\n    range,\n    divisions = [],\n    width = 150,\n    axisType = ColumnAxisType.HEIGHT,\n    scale: _scale,\n    ...rest\n  } = props;\n\n  // Check if \"rest\" actually changed\n  // This is a hack to avoid re-rendering the column\n  // when the \"rest\" props change\n  const restStr = JSON.stringify(rest);\n  const restRef = React.useRef(null);\n  if (restStr !== restRef.current) {\n    restRef.current = restStr;\n    if (Object.keys(rest).length > 0) {\n      console.warn(\n        \"Passing extra properties to ColumnProvider is deprecated:\",\n        rest,\n      );\n    }\n  }\n\n  //# Calculate correct range and height\n  // Range overrides height if set\n  const value: ColumnCtx<T> = useMemo(() => {\n    if (range != null) {\n      height = Math.abs(range[1] - range[0]);\n    } else {\n      range = [0, height];\n    }\n\n    // same as the old `innerHeight`\n    let scale = _scale;\n    let pixelHeight: number;\n    if (scale == null) {\n      pixelHeight = height * pixelsPerMeter * zoom;\n      scale = scaleLinear().domain(range).range([pixelHeight, 0]);\n    } else {\n      pixelHeight = Math.abs(scale.range()[1] - scale.range()[0]);\n      // Remove any offset that might exist from paddings, scale breaks, etc.\n      const r1 = scale.range().map((d) => d - scale.range()[0]);\n      scale = _scale.copy().range(r1);\n    }\n    const scaleClamped = scale.copy().clamp(true);\n\n    return {\n      pixelsPerMeter,\n      pixelHeight,\n      zoom,\n      range,\n      height,\n      scale,\n      scaleClamped,\n      divisions,\n      width,\n      axisType,\n      ...rest,\n    };\n  }, [\n    axisType,\n    height,\n    pixelsPerMeter,\n    range,\n    zoom,\n    divisions,\n    width,\n    restRef.current,\n  ]);\n  return h(ColumnContext.Provider, { value }, children);\n}\n\nconst useColumn = () => useContext(ColumnContext);\nconst useColumnDivisions = () => useContext(ColumnContext).divisions;\n\nexport { ColumnProvider, ColumnAxisType, useColumnDivisions, useColumn };\n"],"names":["ColumnAxisType","createContext","scaleLinear","React","useMemo","h","useContext"],"mappings":";;;;;;;;AAwBA,IAAK,mCAAAA,oBAAL;AACEA,kBAAA,KAAA,IAAM;AACNA,kBAAA,QAAA,IAAS;AACTA,kBAAA,OAAA,IAAQ;AACRA,kBAAA,SAAA,IAAU;AAJP,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AAgBE,MAAM,gBAAgBC,MAAAA,cAAyC;AAAA,EACpE,OAAOC,QAAAA,YAAA;AAAA,EACP,WAAW,CAAA;AAAA,EACX,cAAcA,QAAAA,YAAA,EAAc,MAAM,IAAI;AAAA,EACtC,gBAAgB;AAAA,EAChB,MAAM;AACR,CAAC;AAcD,SAAS,eACP,OACA;AAOA,MAAI;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,YAAY,CAAA;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,GAAG;AAAA,EAAA,IACD;AAKJ,QAAM,UAAU,KAAK,UAAU,IAAI;AACnC,QAAM,UAAUC,eAAAA,QAAM,OAAO,IAAI;AACjC,MAAI,YAAY,QAAQ,SAAS;AAC/B,YAAQ,UAAU;AAClB,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAIA,QAAM,QAAsBC,MAAAA,QAAQ,MAAM;AACxC,QAAI,SAAS,MAAM;AACjB,eAAS,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;AAAA,IACvC,OAAO;AACL,cAAQ,CAAC,GAAG,MAAM;AAAA,IACpB;AAGA,QAAI,QAAQ;AACZ,QAAI;AACJ,QAAI,SAAS,MAAM;AACjB,oBAAc,SAAS,iBAAiB;AACxC,cAAQF,QAAAA,YAAA,EAAc,OAAO,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAAA,IAC5D,OAAO;AACL,oBAAc,KAAK,IAAI,MAAM,MAAA,EAAQ,CAAC,IAAI,MAAM,MAAA,EAAQ,CAAC,CAAC;AAE1D,YAAM,KAAK,MAAM,MAAA,EAAQ,IAAI,CAAC,MAAM,IAAI,MAAM,MAAA,EAAQ,CAAC,CAAC;AACxD,cAAQ,OAAO,OAAO,MAAM,EAAE;AAAA,IAChC;AACA,UAAM,eAAe,MAAM,KAAA,EAAO,MAAM,IAAI;AAE5C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA;AAAA,EAEP,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EAAA,CACT;AACD,SAAOG,WAAAA,QAAE,cAAc,UAAU,EAAE,MAAA,GAAS,QAAQ;AACtD;AAEA,MAAM,YAAY,MAAMC,MAAAA,WAAW,aAAa;AAChD,MAAM,qBAAqB,MAAMA,iBAAW,aAAa,EAAE;;;;;;"}