/ ui / src / components / svg / Bubbles.tsx
Bubbles.tsx
  1  import { motion } from 'framer-motion';
  2  import { useLocation } from 'react-router-dom';
  3  import { useEffect, useState } from 'react';
  4  interface BubblesProps {
  5    primaryColor?: string;
  6    secondaryColor?: string;
  7  }
  8  const variants = {
  9    a: {
 10      scale: 1,
 11    },
 12    b: {
 13      scale: 1.5,
 14    },
 15    c: {
 16      scale: 2,
 17    },
 18    d: {
 19      scale: 2.5,
 20    },
 21    e: {
 22      scale: 3,
 23    },
 24  };
 25  
 26  const bubbleStates = Object.keys(variants);
 27  
 28  const transition = {
 29    duration: 0.6,
 30    type: 'tween',
 31    ease: 'linear',
 32  };
 33  
 34  // color options
 35  // {
 36  //   primaryColor = '#C33764',
 37  //   secondaryColor = '#1D2671',
 38  // }
 39  // {
 40  //   primaryColor = '#60ff72',
 41  //   secondaryColor = '#0096ff',
 42  // }
 43  
 44  const Bubbles = ({
 45    primaryColor = '#e63946',
 46    secondaryColor = '#6564db',
 47  }: BubblesProps) => {
 48    const [status, setStatus] = useState('a');
 49    const location = useLocation();
 50    useEffect(() => {
 51      const unusedStates = bubbleStates.filter((x) => x !== status);
 52      setStatus(unusedStates[Math.floor(Math.random() * unusedStates.length)]);
 53      // eslint-disable-next-line react-hooks/exhaustive-deps
 54    }, [location]);
 55  
 56    return (
 57      <svg
 58        xmlns="http://www.w3.org/2000/svg"
 59        viewBox="0 0 750 480.2"
 60        preserveAspectRatio="xMidYMid slice"
 61        width="100vw"
 62        height="100vh"
 63        style={{ transform: 'rotate(180deg)' }}
 64      >
 65        <defs>
 66          <radialGradient
 67            id="a"
 68            cx="0"
 69            cy="0"
 70            r="1"
 71            fx="0"
 72            fy="0"
 73            gradientTransform="scale(262.93372 -262.93372) rotate(63.15 1.357 -.874)"
 74            gradientUnits="userSpaceOnUse"
 75            spreadMethod="pad"
 76          >
 77            <stop offset="0" stopColor={primaryColor} />
 78            <stop offset=".011" stopColor={primaryColor} />
 79            <stop offset=".989" stopColor={secondaryColor} />
 80            <stop offset="1" stopColor={secondaryColor} />
 81          </radialGradient>
 82          <radialGradient
 83            id="b"
 84            cx="0"
 85            cy="0"
 86            r="1"
 87            fx="0"
 88            fy="0"
 89            gradientTransform="scale(256.12998 -256.12998) rotate(-26.85 .662 -2.484)"
 90            gradientUnits="userSpaceOnUse"
 91            spreadMethod="pad"
 92          >
 93            <stop offset="0" stopColor={primaryColor} />
 94            <stop offset=".011" stopColor={primaryColor} />
 95            <stop offset=".989" stopColor={secondaryColor} />
 96            <stop offset="1" stopColor={secondaryColor} />
 97          </radialGradient>
 98          <radialGradient
 99            id="c"
100            cx="0"
101            cy="0"
102            r="1"
103            fx="0"
104            fy="0"
105            gradientTransform="scale(245.89953 -245.89953) rotate(-3.474 -15.822 -36.129)"
106            gradientUnits="userSpaceOnUse"
107            spreadMethod="pad"
108          >
109            <stop offset="0" stopColor={primaryColor} />
110            <stop offset=".011" stopColor={primaryColor} />
111            <stop offset=".989" stopColor={secondaryColor} />
112            <stop offset="1" stopColor={secondaryColor} />
113          </radialGradient>
114          <radialGradient
115            id="d"
116            cx="0"
117            cy="0"
118            r="1"
119            fx="0"
120            fy="0"
121            gradientTransform="scale(197.42657 -197.42657) rotate(-34.611 -3.576 -.925)"
122            gradientUnits="userSpaceOnUse"
123            spreadMethod="pad"
124          >
125            <stop offset="0" stopColor={primaryColor} />
126            <stop offset=".011" stopColor={primaryColor} />
127            <stop offset=".989" stopColor={secondaryColor} />
128            <stop offset="1" stopColor={secondaryColor} />
129          </radialGradient>
130          <radialGradient
131            id="e"
132            cx="0"
133            cy="0"
134            r="1"
135            fx="0"
136            fy="0"
137            gradientTransform="scale(89.94663 -89.94663) rotate(-34.611 1.84 -9.09)"
138            gradientUnits="userSpaceOnUse"
139            spreadMethod="pad"
140          >
141            <stop offset="0" stopColor={primaryColor} />
142            <stop offset=".011" stopColor={primaryColor} />
143            <stop offset=".989" stopColor={secondaryColor} />
144            <stop offset="1" stopColor={secondaryColor} />
145          </radialGradient>
146          <radialGradient
147            id="f"
148            cx="0"
149            cy="0"
150            r="1"
151            fx="0"
152            fy="0"
153            gradientTransform="scale(49.56927 -49.56927) rotate(-34.611 -2.104 -20.282)"
154            gradientUnits="userSpaceOnUse"
155            spreadMethod="pad"
156          >
157            <stop offset="0" stopColor={primaryColor} />
158            <stop offset=".011" stopColor={primaryColor} />
159            <stop offset=".989" stopColor={secondaryColor} />
160            <stop offset="1" stopColor={secondaryColor} />
161          </radialGradient>
162          <radialGradient
163            id="g"
164            cx="0"
165            cy="0"
166            r="1"
167            fx="0"
168            fy="0"
169            gradientTransform="scale(-148.16167 148.16167) rotate(53.354 -2.872 -3.856)"
170            gradientUnits="userSpaceOnUse"
171            spreadMethod="pad"
172          >
173            <stop offset="0" stopColor={primaryColor} />
174            <stop offset=".011" stopColor={primaryColor} />
175            <stop offset=".989" stopColor={secondaryColor} />
176            <stop offset="1" stopColor={secondaryColor} />
177          </radialGradient>
178          <radialGradient
179            id="h"
180            cx="0"
181            cy="0"
182            r="1"
183            fx="0"
184            fy="0"
185            gradientTransform="scale(245.89953 -245.89953) rotate(86.526 .985 .1)"
186            gradientUnits="userSpaceOnUse"
187            spreadMethod="pad"
188          >
189            <stop offset="0" stopColor={primaryColor} />
190            <stop offset=".011" stopColor={primaryColor} />
191            <stop offset=".989" stopColor={secondaryColor} />
192            <stop offset="1" stopColor={secondaryColor} />
193          </radialGradient>
194          <radialGradient
195            id="i"
196            cx="0"
197            cy="0"
198            r="1"
199            fx="0"
200            fy="0"
201            gradientTransform="scale(197.42657 -197.42657) rotate(55.389 1.436 -.338)"
202            gradientUnits="userSpaceOnUse"
203            spreadMethod="pad"
204          >
205            <stop offset="0" stopColor={primaryColor} />
206            <stop offset=".011" stopColor={primaryColor} />
207            <stop offset=".989" stopColor={secondaryColor} />
208            <stop offset="1" stopColor={secondaryColor} />
209          </radialGradient>
210          <radialGradient
211            id="j"
212            cx="0"
213            cy="0"
214            r="1"
215            fx="0"
216            fy="0"
217            gradientTransform="scale(89.94663 -89.94663) rotate(55.389 2.643 1.782)"
218            gradientUnits="userSpaceOnUse"
219            spreadMethod="pad"
220          >
221            <stop offset="0" stopColor={primaryColor} />
222            <stop offset=".011" stopColor={primaryColor} />
223            <stop offset=".989" stopColor={secondaryColor} />
224            <stop offset="1" stopColor={secondaryColor} />
225          </radialGradient>
226          <radialGradient
227            id="k"
228            cx="0"
229            cy="0"
230            r="1"
231            fx="0"
232            fy="0"
233            gradientTransform="scale(49.56927 -49.56927) rotate(55.389 6.01 6.37)"
234            gradientUnits="userSpaceOnUse"
235            spreadMethod="pad"
236          >
237            <stop offset="0" stopColor={primaryColor} />
238            <stop offset=".011" stopColor={primaryColor} />
239            <stop offset=".989" stopColor={secondaryColor} />
240            <stop offset="1" stopColor={secondaryColor} />
241          </radialGradient>
242          <radialGradient
243            id="l"
244            cx="0"
245            cy="0"
246            r="1"
247            fx="0"
248            fy="0"
249            gradientTransform="scale(148.16167 -148.16167) rotate(-36.646 -.849 -1.537)"
250            gradientUnits="userSpaceOnUse"
251            spreadMethod="pad"
252          >
253            <stop offset="0" stopColor={primaryColor} />
254            <stop offset=".011" stopColor={primaryColor} />
255            <stop offset=".989" stopColor={secondaryColor} />
256            <stop offset="1" stopColor={secondaryColor} />
257          </radialGradient>
258        </defs>
259        <motion.path
260          animate={status}
261          variants={variants}
262          transition={transition}
263          fill="url(#a)"
264          d="M0 78.695c94.683.563 171.211 62.834 171.211 135.29 0 72.455-76.528 127.786-171.211 128.349z"
265          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
266        />
267        <motion.path
268          animate={status}
269          variants={variants}
270          transition={transition}
271          fill="url(#b)"
272          d="M407.665 0h263.64c-.563 94.683-62.833 147.197-135.289 147.197-72.457 0-127.788-52.514-128.351-147.197"
273          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
274        />
275        <motion.path
276          animate={status}
277          variants={variants}
278          transition={transition}
279          fill="url(#c)"
280          d="M693.527 276.392c15.73-103.692-78.353-84.401-100.71-137.303C569.056 82.865 588.833 36.263 643.462 0H750v438.532s-80.081-6.519-56.473-162.14"
281          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
282        />
283        <motion.path
284          animate={status}
285          variants={variants}
286          transition={transition}
287          fill="url(#d)"
288          d="M30.98 445.947c0-18.917 15.335-34.25 34.25-34.25 18.916 0 34.252 15.333 34.252 34.25 0 18.916-15.336 34.251-34.252 34.251-18.915 0-34.25-15.335-34.25-34.251"
289          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
290        />
291        <motion.path
292          animate={status}
293          variants={variants}
294          transition={transition}
295          fill="url(#e)"
296          d="M517.466 56.473c0-8.618 6.986-15.605 15.604-15.605 8.618 0 15.605 6.987 15.605 15.605s-6.987 15.604-15.605 15.604-15.604-6.986-15.604-15.604"
297          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
298        />
299        <motion.path
300          animate={status}
301          variants={variants}
302          transition={transition}
303          fill="url(#f)"
304          d="M565.708 240.332a8.6 8.6 0 0 1 8.6-8.599 8.598 8.598 0 0 1 8.599 8.599 8.6 8.6 0 0 1-17.199 0"
305          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
306        />
307        <motion.path
308          animate={status}
309          variants={variants}
310          transition={transition}
311          fill="url(#g)"
312          d="M637.42 0H750v160.25C624.649 141.492 637.42 0 637.42 0"
313          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
314        />
315        <motion.path
316          animate={status}
317          variants={variants}
318          transition={transition}
319          fill="url(#h)"
320          d="M0 106.538V0h438.532s-6.519 80.081-162.14 56.473c-103.691-15.731-84.401 78.352-137.303 100.71-15.786 6.671-30.81 9.91-45.062 9.91C57.515 167.091 26.082 145.83 0 106.538"
321          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
322        />
323        <motion.path
324          animate={status}
325          variants={variants}
326          transition={transition}
327          fill="url(#i)"
328          d="M45.874 175.692c0-18.917 15.335-34.251 34.251-34.251 18.916 0 34.251 15.334 34.251 34.251 0 18.917-15.335 34.251-34.251 34.251-18.916 0-34.251-15.334-34.251-34.251"
329          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
330        />
331        <motion.path
332          animate={status}
333          variants={variants}
334          transition={transition}
335          fill="url(#j)"
336          d="M224.727 87.05c0-8.618 6.987-15.604 15.605-15.604s15.605 6.986 15.605 15.604c0 8.618-6.987 15.605-15.605 15.605s-15.605-6.987-15.605-15.605"
337          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
338        />
339        <motion.path
340          animate={status}
341          variants={variants}
342          transition={transition}
343          fill="url(#k)"
344          d="M383.131 87.05a8.6 8.6 0 0 1 17.199 0c0 4.75-3.85 8.599-8.6 8.599a8.598 8.598 0 0 1-8.599-8.599"
345          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
346        />
347        <motion.path
348          animate={status}
349          variants={variants}
350          transition={transition}
351          fill="url(#l)"
352          d="M0 112.58V0h160.25C144.667 104.135 44.382 112.946 10.881 112.946 4.056 112.946 0 112.58 0 112.58"
353          transform="matrix(1.33333 0 0 -1.33333 0 666.667)"
354        />
355      </svg>
356    );
357  };
358  
359  export default Bubbles;