@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
131 lines (130 loc) • 3.63 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const d3Scale = require("d3-scale");
const React = require("react");
const h = require("@macrostrat/hyper");
const column = require("./column.cjs");
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
const h__default = /* @__PURE__ */ _interopDefault(h);
const ColumnLayoutContext = React.createContext({
scale: d3Scale.scaleLinear(),
scaleClamped: d3Scale.scaleLinear().clamp(true),
width: 0,
divisions: [],
grainSizes: [],
grainsizeScale: (d) => 40,
xScale: null,
widthForDivision: (d) => 0,
pixelsPerMeter: 1,
zoom: 1
});
function ColumnLayoutProvider({
children,
width,
grainSizes = [],
grainsizeScale = (d) => 40,
xScale
}) {
const ctx = React.useContext(column.ColumnContext);
return h__default.default(
ColumnLayoutContext.Provider,
{
value: {
...ctx,
width,
grainSizes,
grainsizeScale,
xScale,
widthForDivision: (d) => width
}
},
children
);
}
class CrossAxisLayoutProvider extends React.Component {
static contextType = column.ColumnContext;
render() {
let { domain, range, width, children } = this.props;
if (range == null) {
range = [0, width];
}
const xScale = d3Scale.scaleLinear().domain(domain).range(range);
return h__default.default(ColumnLayoutProvider, {
...this.context,
xScale,
width,
children
});
}
}
function GrainsizeLayoutProvider({
width,
grainSizes = ["ms", "s", "vf", "f", "m", "c", "vc", "p"],
grainsizeScaleStart = 50,
grainsizeScaleRange,
tickPositions,
children
}) {
if (grainsizeScaleRange == null) {
console.warn(
"GrainsizeLayoutProvider: grainsizeScaleStart and width are deprecated in favor of grainsizeScaleRange"
);
}
grainsizeScaleRange ??= [grainsizeScaleStart, width];
const divisions = column.useColumnDivisions();
const grainsizeScale = React.useMemo(() => {
const scale = d3Scale.scaleLinear().domain([0, grainSizes.length - 1]).range(grainsizeScaleRange);
tickPositions ??= grainSizes.map((d, i) => scale(i));
return d3Scale.scaleOrdinal().domain(grainSizes).range(tickPositions);
}, [grainSizes, grainsizeScaleRange, tickPositions]);
const grainsizeForDivision = React.useCallback(
(division) => {
let ix = divisions.indexOf(division);
while (ix > 0) {
const { grainsize } = divisions[ix];
if (grainsize != null) {
return grainsize;
}
ix -= 1;
}
},
[divisions]
);
const widthForDivision = React.useCallback(
(division) => {
if (division == null) {
return width;
}
return grainsizeScale(grainsizeForDivision(division));
},
[grainsizeForDivision, grainsizeScale, width]
);
return h__default.default(
ColumnLayoutProvider,
{
width,
grainSizes,
grainsizeScale,
grainsizeScaleStart,
grainsizeScaleRange,
grainsizeForDivision,
widthForDivision
},
children
);
}
function useColumnLayout() {
const ctx = React.useContext(ColumnLayoutContext);
if (ctx == null) {
throw new Error(
"useColumnLayout must be used within a ColumnLayoutProvider"
);
}
return ctx;
}
exports.ColumnLayoutContext = ColumnLayoutContext;
exports.ColumnLayoutProvider = ColumnLayoutProvider;
exports.CrossAxisLayoutProvider = CrossAxisLayoutProvider;
exports.GrainsizeLayoutProvider = GrainsizeLayoutProvider;
exports.useColumnLayout = useColumnLayout;
//# sourceMappingURL=layout.cjs.map