|
import React, {useCallback, useEffect, useState} from 'react'; |
|
|
|
import {continueRender, delayRender} from 'remotion'; |
|
import GsapAnimation from './GsapAnimation'; |
|
import gsap from 'gsap'; |
|
export default function SvgMaker(props) { |
|
const [svgData, setSvgPath] = useState(null); |
|
|
|
const [handle] = useState(() => delayRender()); |
|
|
|
const fetchData = useCallback(async () => { |
|
try { |
|
const response = await fetch( |
|
'https://yakova-svg.hf.space/generateSVGPath', |
|
{ |
|
method: 'POST', |
|
headers: { |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify({ |
|
text: props.text, |
|
size: 150, |
|
separate: true, |
|
strokeWidth:props.strokeWidth, |
|
fill: props.fill, |
|
individualLetters: true, |
|
stroke: 'black', |
|
fontUrl: |
|
'https://bla-tranny.hf.space/stream/?id=131', |
|
}), |
|
} |
|
); |
|
|
|
if (!response.ok) { |
|
throw new Error('Network response was not ok'); |
|
} |
|
|
|
const data = await response.json(); |
|
setSvgPath(data); |
|
continueRender(handle); |
|
} catch (error) { |
|
console.error('Error fetching data:', error); |
|
} |
|
}, []); |
|
|
|
useEffect(() => { |
|
fetchData(); |
|
}, []); |
|
|
|
return ( |
|
<div className="absolute flex"> |
|
{svgData && |
|
Array.from(props.text).map((key) => { |
|
const {style, ...otherAttributes} = svgData[key].svg.g.$; |
|
return ( |
|
<> |
|
<div className={props.className} id={`${props.id}`} style={props.style}> |
|
<svg |
|
key={`${props.id}`} |
|
xmlns="http://www.w3.org/2000/svg" |
|
style={ |
|
{ |
|
// transformStyle: 'preserve-3d', |
|
// transform:'translateZ(0px)' |
|
} |
|
} |
|
// transform="perspective(200) rotateX(45)" |
|
{...svgData[key].svg.$} // Set SVG attributes from JSON |
|
> |
|
<g {...otherAttributes}> |
|
<path {...svgData[key].svg.g.path.$} /> |
|
</g> |
|
</svg> |
|
</div> |
|
</> |
|
); |
|
})} |
|
</div> |
|
); |
|
} |
|
|
|
export const SVG3D = ({text}) => { |
|
return ( |
|
<GsapAnimation Timeline={Timeline}> |
|
<SvgMaker |
|
text={text} |
|
style={{transformStyle: 'preserve-3d', transform:'translateY(100%)',backgroundColor:'transparent'}} |
|
id="svg1" |
|
fill="yellow" |
|
className="" |
|
|
|
/> |
|
<SvgMaker |
|
text={text} |
|
style={{transformStyle: 'preserve-3d', transform:'translateY(100%)',backgroundColor:'transparent'}} |
|
id="svg2" |
|
fill="white" |
|
className="opacity-0" |
|
/> |
|
</GsapAnimation> |
|
); |
|
}; |
|
|
|
|
|
const Timeline = () => { |
|
let timeline=gsap.timeline() |
|
|
|
let duration = 0.8; |
|
let stagger = { each: 0.02, ease: "power2", from: "start" }; |
|
const ease = "slow"; |
|
|
|
timeline.set('#svg2',{rotationX:-90,opacity:0,transformOrigin:"50% 50% -100",ease:"power4.in"}) |
|
|
|
|
|
timeline.to('#svg2', {duration:duration, opacity:1, stagger:stagger}, 0.001) |
|
|
|
|
|
|
|
timeline.to('#svg2',{rotationX:0,duration:duration,stagger:stagger,ease:ease},0) |
|
|
|
|
|
|
|
timeline.to('#svg1',{rotationX:90,duration:duration, stagger:stagger,transformOrigin: |
|
"50% 50% -100",opacity:0,ease:ease},0) |
|
return timeline |
|
} |