@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
1 lines • 7.33 kB
Source Map (JSON)
{"version":3,"file":"layout.cjs","sources":["../../src/context/layout.ts"],"sourcesContent":["import { scaleLinear, scaleOrdinal } from \"d3-scale\";\nimport { Component, createContext } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n ColumnContext,\n useColumnDivisions,\n ColumnCtx,\n ColumnDivision,\n} from \"./column\";\nimport { useContext, useMemo, useCallback } from \"react\";\nimport { ReactNode } from \"react\";\n\n//# This isn't really used yet...\n\nexport interface ColumnLayoutCtx<\n T extends ColumnDivision,\n> extends ColumnCtx<T> {\n width: number;\n grainSizes?: string[];\n grainsizeScale?: (d: string) => number;\n xScale: any;\n widthForDivision: (d: ColumnDivision) => number;\n}\n\nconst ColumnLayoutContext = createContext<ColumnLayoutCtx<ColumnDivision>>({\n scale: scaleLinear(),\n scaleClamped: scaleLinear().clamp(true),\n width: 0,\n divisions: [],\n grainSizes: [],\n grainsizeScale: (d) => 40,\n xScale: null,\n widthForDivision: (d) => 0,\n pixelsPerMeter: 1,\n zoom: 1,\n});\n\nexport interface ColumnLayoutProviderProps<\n T extends ColumnDivision,\n> extends Partial<ColumnCtx<T>> {\n grainSizes?: string[];\n grainsizeScale?: (d: string) => number;\n width: number;\n // @deprecated\n xScale?: any;\n children?: ReactNode;\n}\n\nfunction ColumnLayoutProvider<T extends ColumnDivision>({\n children,\n width,\n grainSizes = [],\n grainsizeScale = (d) => 40,\n xScale,\n}: ColumnLayoutProviderProps<T>) {\n const ctx = useContext(ColumnContext);\n return h(\n ColumnLayoutContext.Provider,\n {\n value: {\n ...ctx,\n width,\n grainSizes,\n grainsizeScale,\n xScale,\n widthForDivision: (d) => width,\n },\n },\n children,\n );\n}\n\nexport interface CrossAxisLayoutProviderProps {\n width: number;\n domain: number[];\n range?: number[];\n children?: ReactNode;\n}\n\nclass CrossAxisLayoutProvider extends Component<CrossAxisLayoutProviderProps> {\n static contextType = ColumnContext;\n declare context: ColumnCtx<ColumnDivision>;\n render() {\n let { domain, range, width, children } = this.props;\n if (range == null) {\n range = [0, width];\n }\n const xScale = scaleLinear().domain(domain).range(range);\n return h(ColumnLayoutProvider, {\n ...this.context,\n xScale,\n width,\n children,\n });\n }\n}\n\nexport type GrainsizeLayoutProps = {\n grainSizes: string[];\n children?: ReactNode;\n width?: number;\n grainsizeScaleStart?: number;\n grainsizeScaleRange?: [number, number];\n tickPositions?: number[];\n};\n\nfunction GrainsizeLayoutProvider({\n width,\n grainSizes = [\"ms\", \"s\", \"vf\", \"f\", \"m\", \"c\", \"vc\", \"p\"],\n grainsizeScaleStart = 50,\n grainsizeScaleRange,\n tickPositions,\n children,\n}: GrainsizeLayoutProps) {\n /**\n Right now this provides a ColumnLayoutContext\n but it could be reworked to provide a\n separate \"GrainsizeLayoutContext\" if that seemed\n appropriate.\n */\n\n if (grainsizeScaleRange == null) {\n console.warn(\n \"GrainsizeLayoutProvider: grainsizeScaleStart and width are deprecated in favor of grainsizeScaleRange\",\n );\n }\n\n grainsizeScaleRange ??= [grainsizeScaleStart, width];\n const divisions = useColumnDivisions();\n\n const grainsizeScale: any = useMemo(() => {\n const scale = scaleLinear()\n .domain([0, grainSizes.length - 1])\n .range(grainsizeScaleRange);\n\n tickPositions ??= grainSizes.map((d, i) => scale(i));\n\n return scaleOrdinal().domain(grainSizes).range(tickPositions);\n }, [grainSizes, grainsizeScaleRange, tickPositions]);\n\n // This function should probably be moved up a level\n const grainsizeForDivision = useCallback(\n (division) => {\n let ix = divisions.indexOf(division);\n // Search backwards through divisions\n while (ix > 0) {\n const { grainsize } = divisions[ix];\n if (grainsize != null) {\n return grainsize;\n }\n ix -= 1;\n }\n },\n [divisions],\n );\n\n const widthForDivision = useCallback(\n (division) => {\n if (division == null) {\n return width;\n }\n return grainsizeScale(grainsizeForDivision(division));\n },\n [grainsizeForDivision, grainsizeScale, width],\n );\n\n // This is slow to run each iteration\n return h(\n ColumnLayoutProvider,\n {\n width,\n grainSizes,\n grainsizeScale,\n grainsizeScaleStart,\n grainsizeScaleRange,\n grainsizeForDivision,\n widthForDivision,\n } as any,\n children,\n );\n}\n\nexport function useColumnLayout() {\n const ctx = useContext(ColumnLayoutContext);\n if (ctx == null) {\n throw new Error(\n \"useColumnLayout must be used within a ColumnLayoutProvider\",\n );\n }\n return ctx;\n}\n\nexport {\n ColumnLayoutContext,\n ColumnLayoutProvider,\n CrossAxisLayoutProvider,\n GrainsizeLayoutProvider,\n};\n"],"names":["createContext","scaleLinear","useContext","ColumnContext","h","Component","useColumnDivisions","useMemo","scaleOrdinal","useCallback"],"mappings":"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"}