| <template> | |
| <div | |
| class="screen-slide" | |
| :style="{ | |
| width: viewportSize + 'px', | |
| height: viewportSize * viewportRatio + 'px', | |
| transform: `scale(${scale})`, | |
| }" | |
| > | |
| <div class="background" :style="{ ...backgroundStyle }"></div> | |
| <ScreenElement | |
| v-for="(element, index) in slide.elements" | |
| :key="element.id" | |
| :elementInfo="element" | |
| :elementIndex="index + 1" | |
| :animationIndex="animationIndex" | |
| :turnSlideToId="turnSlideToId" | |
| :manualExitFullscreen="manualExitFullscreen" | |
| /> | |
| </div> | |
| </template> | |
| <script lang="ts" setup> | |
| import { computed, provide } from 'vue' | |
| import { storeToRefs } from 'pinia' | |
| import { useSlidesStore } from '@/store' | |
| import type { Slide } from '@/types/slides' | |
| import { injectKeySlideId } from '@/types/injectKey' | |
| import useSlideBackgroundStyle from '@/hooks/useSlideBackgroundStyle' | |
| import ScreenElement from './ScreenElement.vue' | |
| const props = defineProps<{ | |
| slide: Slide | |
| scale: number | |
| animationIndex: number | |
| turnSlideToId: (id: string) => void | |
| manualExitFullscreen: () => void | |
| }>() | |
| const { viewportRatio, viewportSize } = storeToRefs(useSlidesStore()) | |
| const background = computed(() => props.slide.background) | |
| const { backgroundStyle } = useSlideBackgroundStyle(background) | |
| const slideId = computed(() => props.slide.id) | |
| provide(injectKeySlideId, slideId) | |
| </script> | |
| <style lang="scss" scoped> | |
| .screen-slide { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| transform-origin: 0 0; | |
| overflow: hidden; | |
| } | |
| .background { | |
| width: 100%; | |
| height: 100%; | |
| background-position: center; | |
| position: absolute; | |
| } | |
| </style> |