ScreenSlide.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <template>
  2. <div
  3. class="screen-slide"
  4. :style="{
  5. width: VIEWPORT_SIZE + 'px',
  6. height: VIEWPORT_SIZE * VIEWPORT_ASPECT_RATIO + 'px',
  7. transform: `scale(${scale})`,
  8. }"
  9. >
  10. <div class="background" :style="{ ...backgroundStyle }"></div>
  11. <ScreenElement
  12. :id="`screen-element-${element.id}`"
  13. v-for="(element, index) in slide.elements"
  14. :key="element.id"
  15. :elementInfo="element"
  16. :elementIndex="index + 1"
  17. :animationIndex="animationIndex"
  18. />
  19. </div>
  20. </template>
  21. <script lang="ts">
  22. import { computed, PropType, defineComponent } from 'vue'
  23. import { Slide } from '@/types/slides'
  24. import { VIEWPORT_SIZE, VIEWPORT_ASPECT_RATIO } from '@/configs/canvas'
  25. import useSlideBackgroundStyle from '@/hooks/useSlideBackgroundStyle'
  26. import ScreenElement from './ScreenElement.vue'
  27. export default defineComponent({
  28. name: 'screen-slide',
  29. components: {
  30. ScreenElement,
  31. },
  32. props: {
  33. slide: {
  34. type: Object as PropType<Slide>,
  35. required: true,
  36. },
  37. scale: {
  38. type: Number,
  39. required: true,
  40. },
  41. animationIndex: {
  42. type: Number,
  43. default: -1,
  44. },
  45. },
  46. setup(props) {
  47. const background = computed(() => props.slide.background)
  48. const { backgroundStyle } = useSlideBackgroundStyle(background)
  49. return {
  50. backgroundStyle,
  51. VIEWPORT_SIZE,
  52. VIEWPORT_ASPECT_RATIO,
  53. }
  54. },
  55. })
  56. </script>
  57. <style lang="scss" scoped>
  58. .screen-slide {
  59. position: absolute;
  60. top: 0;
  61. left: 0;
  62. transform-origin: 0 0;
  63. }
  64. .background {
  65. width: 100%;
  66. height: 100%;
  67. background-position: center;
  68. position: absolute;
  69. }
  70. </style>