@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
1 lines • 6.88 kB
Source Map (JSON)
{"version":3,"file":"patterns.cjs","sources":["../../src/lithology/patterns.ts"],"sourcesContent":["import { createContext, ReactNode, useContext, useRef } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { geologyPatternURL, useAsyncEffect } from \"@macrostrat/ui-components\";\n\ninterface IGeologicPatternBase {\n prefix: string;\n color?: string;\n id: string;\n width: number;\n height: number;\n backgroundColor?: string;\n name?: string;\n}\n\nexport interface IGeologicPatternProvider {\n resolvePattern(string): string;\n children?: ReactNode;\n}\n\nconst GeologicPatternContext = createContext<any>(null);\n\nconst GeologicPatternProvider = (props: IGeologicPatternProvider) => {\n const { resolvePattern, children } = props;\n return h(GeologicPatternContext.Provider, {\n value: { resolvePattern },\n children,\n });\n};\n\nenum PatternType {\n Vector = \"vector\",\n Raster = \"raster\",\n}\n\nconst RasterGeologicPattern = (props: IGeologicPatternBase) => {\n const { resolvePattern } = useContext(GeologicPatternContext);\n let { prefix, backgroundColor, color, width, height, id, name, ...rest } =\n props;\n const patternSize = { width, height };\n const patternBounds = { x: 0, y: 0, ...patternSize };\n\n const patternID = `${prefix}-${name ?? id}`;\n const maskID = `${patternID}-mask`;\n\n const ref = useRef<HTMLImageElement>();\n\n useAsyncEffect(async () => {\n const { current: img } = ref;\n if (img == null) return;\n try {\n const uri = await geologyPatternURL(id, backgroundColor, color);\n img.crossOrigin = \"anonymous\";\n img.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", uri);\n } catch (err) {\n console.error(err);\n }\n }, [id, ref]);\n\n return h(\n \"pattern\",\n {\n id: patternID,\n patternUnits: \"userSpaceOnUse\",\n ...patternSize,\n ...rest,\n },\n h(\"image\", { ref, ...patternSize }),\n );\n};\n\nconst VectorGeologicPattern = (props: IGeologicPatternBase) => {\n const { resolvePattern } = useContext(GeologicPatternContext) ?? {};\n if (resolvePattern == null) return null;\n let {\n prefix,\n backgroundColor,\n color,\n width = 100,\n height = 100,\n id,\n name,\n ...rest\n } = props;\n const patternSize = { width, height };\n const patternBounds = { x: 0, y: 0, ...patternSize };\n const href = resolvePattern(id);\n\n if (href == null) {\n return null;\n }\n\n // Compositing if we want to set overlay color\n // let overlayStyles = {}\n // if (color != null) {\n // overlayStyles = {mixB}\n // }\n\n const patternID = `${prefix}-${name ?? id}`;\n const maskID = `${patternID}-mask`;\n\n return h(\n \"pattern\",\n {\n id: patternID,\n patternUnits: \"userSpaceOnUse\",\n shapeRendering: \"crispEdges\",\n ...patternSize,\n ...rest,\n },\n [\n h(\"g\", { style: { isolation: \"isolate\" } }, [\n // Mask, if required\n h.if(color != null && id != null)(\"mask\", { id: maskID }, [\n h(\"image\", {\n xlinkHref: href,\n ...patternBounds,\n }),\n ]),\n h.if(backgroundColor != null)(\"rect\", {\n ...patternBounds,\n fill: backgroundColor,\n }),\n // Render a masked colored image\n h.if(color != null)(\"rect\", {\n ...patternBounds,\n fill: color,\n mask: `url(#${maskID})`,\n }),\n // Or render the image as normal\n h.if(id != null && color == null)(\"image\", {\n xlinkHref: href,\n ...patternBounds,\n }),\n ]),\n ],\n );\n};\n\ninterface IGeologicPattern extends IGeologicPatternBase {\n type?: PatternType;\n invert?: boolean;\n}\n\nconst GeologicPattern = (props: IGeologicPattern) => {\n let { type = PatternType.Vector, invert, ...rest } = props;\n\n if (invert ?? false) {\n rest.color = props.backgroundColor;\n rest.backgroundColor = props.color;\n }\n\n switch (type) {\n case PatternType.Vector:\n return h(VectorGeologicPattern, rest);\n case PatternType.Raster:\n return h(RasterGeologicPattern, rest);\n }\n};\n\nexport {\n GeologicPattern,\n GeologicPatternProvider,\n GeologicPatternContext,\n PatternType,\n};\n"],"names":["createContext","h","PatternType","useContext","useRef","useAsyncEffect","geologyPatternURL"],"mappings":"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"}