BaseTextElement.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <div
  3. class="base-element-text"
  4. :style="{
  5. top: elementInfo.top + 'px',
  6. left: elementInfo.left + 'px',
  7. width: elementInfo.width + 'px',
  8. transform: `rotate(${elementInfo.rotate}deg)`,
  9. }"
  10. >
  11. <div
  12. class="element-content"
  13. :style="{
  14. backgroundColor: elementInfo.fill,
  15. opacity: elementInfo.opacity,
  16. textShadow: shadowStyle,
  17. }"
  18. >
  19. <ElementOutline
  20. :width="elementInfo.width"
  21. :height="elementInfo.height"
  22. :outline="elementInfo.outline"
  23. />
  24. <div class="text ProseMirror-static" v-html="elementInfo.content"></div>
  25. </div>
  26. </div>
  27. </template>
  28. <script lang="ts">
  29. import { defineComponent, PropType, computed } from 'vue'
  30. import { PPTTextElement } from '@/types/slides'
  31. import ElementOutline from '@/views/components/element/ElementOutline.vue'
  32. import useElementShadow from '@/views/components/element/hooks/useElementShadow'
  33. export default defineComponent({
  34. name: 'base-element-text',
  35. components: {
  36. ElementOutline,
  37. },
  38. props: {
  39. elementInfo: {
  40. type: Object as PropType<PPTTextElement>,
  41. required: true,
  42. },
  43. },
  44. setup(props) {
  45. const shadow = computed(() => props.elementInfo.shadow)
  46. const { shadowStyle } = useElementShadow(shadow)
  47. return {
  48. shadowStyle,
  49. }
  50. },
  51. })
  52. </script>
  53. <style lang="scss" scoped>
  54. .base-element-text {
  55. position: absolute;
  56. }
  57. .element-content {
  58. position: relative;
  59. padding: 10px;
  60. line-height: 1.5;
  61. .text {
  62. position: relative;
  63. }
  64. }
  65. </style>