@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
1 lines • 5.8 kB
Source Map (JSON)
{"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;;;;;;"}