{"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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"}