import { MeshBasicMaterialProps, MeshProps, Object3DProps, useLoader } from '@react-three/fiber' import * as React from 'react' import { forwardRef, Fragment, useEffect, useMemo } from 'react' import { DoubleSide, Object3D } from 'three' import { SVGLoader } from 'three-stdlib' import { ForwardRefComponent } from '../helpers/ts-utils' export interface SvgProps extends Omit { /** src can be a URL or SVG data */ src: string skipFill?: boolean skipStrokes?: boolean fillMaterial?: MeshBasicMaterialProps strokeMaterial?: MeshBasicMaterialProps fillMeshProps?: MeshProps strokeMeshProps?: MeshProps } export const Svg: ForwardRefComponent = /* @__PURE__ */ forwardRef( function R3FSvg( { src, skipFill, skipStrokes, fillMaterial, strokeMaterial, fillMeshProps, strokeMeshProps, ...props }, ref ) { const svg = useLoader(SVGLoader, !src.startsWith(' skipStrokes ? [] : svg.paths.map((path) => path.userData?.style.stroke === undefined || path.userData.style.stroke === 'none' ? null : path.subPaths.map((subPath) => SVGLoader.pointsToStroke(subPath.getPoints(), path.userData!.style)) ), [svg, skipStrokes] ) useEffect(() => { return () => strokeGeometries.forEach((group) => group && group.map((g) => g.dispose())) }, [strokeGeometries]) let renderOrder = 0 return ( {svg.paths.map((path, p) => ( {!skipFill && path.userData?.style.fill !== undefined && path.userData.style.fill !== 'none' && SVGLoader.createShapes(path).map((shape, s) => ( ))} {!skipStrokes && path.userData?.style.stroke !== undefined && path.userData.style.stroke !== 'none' && path.subPaths.map((_subPath, s) => ( ))} ))} ) } )