index.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import React from 'react';
  2. import { Animation } from '@douyinfe/semi-animation-react';
  3. import { interpolate as flubberInterpolate } from 'flubber';
  4. import { GradientPinkRed as Gradient } from '@vx/gradient';
  5. const paths = [
  6. 'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z',
  7. 'M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z',
  8. 'M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z',
  9. 'M7 2v11h3v9l7-12h-4l4-8z',
  10. 'M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z',
  11. 'M17.4112 7.30848C18.0693 7.81171 18.1948 8.75312 17.6915 9.41119L11.1915 17.9112C10.9091 18.2806 10.4712 18.4981 10.0062 18.5C9.54111 18.5019 9.10149 18.288 8.81598 17.9209L5.31598 13.4209C4.80737 12.767 4.92518 11.8246 5.5791 11.316C6.23302 10.8074 7.17543 10.9252 7.68404 11.5791L9.98994 14.5438L15.3085 7.58884C15.8117 6.93077 16.7531 6.80525 17.4112 7.30848Z',
  12. 'M5 12.5C5 11.6716 5.67157 11 6.5 11H17.5C18.3284 11 19 11.6716 19 12.5C19 13.3284 18.3284 14 17.5 14H6.5C5.67157 14 5 13.3284 5 12.5Z',
  13. ];
  14. const interpolators = [];
  15. for (let i = 0; i < paths.length; i++) {
  16. interpolators.push(flubberInterpolate(paths[i], paths[i + 1] || paths[0], { maxSegmentLength: 0.1 }));
  17. }
  18. export default class App extends React.Component {
  19. state = { interpolators, index: 0 };
  20. goNext = () => this.setState(({ index, interpolators }) => ({
  21. index: index + 1 >= interpolators.length ? 0 : index + 1,
  22. }));
  23. render() {
  24. const { interpolators, index } = this.state;
  25. const interpolator = interpolators[index];
  26. return (
  27. <div
  28. style={{
  29. background: '#F3FFBD',
  30. width: '100%',
  31. height: '100%',
  32. display: 'flex',
  33. justifyContent: 'center',
  34. alignItems: 'center',
  35. }}
  36. >
  37. <svg width="180" viewBox="0 0 22 22">
  38. <Gradient id="gradient-morph" />
  39. <g fill="url(#gradient-morph)">
  40. <Animation
  41. forwardInstance={handler => (this.handler = handler)}
  42. reset
  43. from={{ t: 0 }}
  44. to={{ t: 1 }}
  45. onRest={this.goNext}
  46. >
  47. {({ t }) => <path d={interpolator(t)} />}
  48. </Animation>
  49. </g>
  50. </svg>
  51. </div>
  52. );
  53. }
  54. }