ShadeTongueUp.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <script setup lang="ts">
  2. import { SVGPathData, SVGPathDataTransformer } from 'svg-pathdata';
  3. const Shade: SVGPathData[] = [
  4. 'M21 193C21 193-46 60 78 9 84 7 91 4 98 4 105 3 115 3 122 4 136 7 140 7 160 3 182 0 324 31 249 192Z',
  5. 'M139 127C139 127 49 81 27 152 6 223 51 357 130 364 205 370 244 331 249 181 249 181 259 75 139 127Z',
  6. ].map(d => new SVGPathData(d));
  7. const { translateX = 0, translateY = 0, scale = 1, } = defineProps<{
  8. translateX?: number; translateY?: number;
  9. scale?: number;
  10. }>();
  11. const paths = ref<string[]>([]);
  12. watchEffect(() => {
  13. paths.value = Shade.map(data => data
  14. .transform(SVGPathDataTransformer.TRANSLATE(translateX, translateY))
  15. .transform(SVGPathDataTransformer.SCALE(scale, scale))
  16. .encode(),
  17. );
  18. });
  19. </script>
  20. <template>
  21. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 272 366">
  22. <clipPath id="shade">
  23. <path v-for="(d,i) in paths" :id="'outline-'+i" stroke="#fefefe" stroke-width="2" fill="none" :d="d" />
  24. </clipPath>
  25. <path
  26. id="outline"
  27. stroke="#fefefe"
  28. stroke-width="2"
  29. fill="none"
  30. d="M21 193C21 193-46 60 78 9 84 7 91 4 98 4 105 3 115 3 122 4 136 7 140 7 160 3 182 0 324 31 249 192M139 127C139 127 49 81 27 152 6 223 51 357 130 364 205 370 244 331 249 181 249 181 259 75 139 127Z"
  31. />
  32. <path
  33. id="tongue"
  34. stroke="#fefefe"
  35. stroke-width="2"
  36. fill="none"
  37. d="M 139 298 L 138 127 C 138 126 138 126 139 126 C 139 126 140 126 140 127 L 140 127 L 139 298 Z"
  38. />
  39. </svg>
  40. </template>
  41. <style scoped lang="scss">
  42. svg { opacity: 0.85; }
  43. </style>
  44. <style lang="scss">
  45. .camera-container { clip-path: url("#shade");}
  46. </style>