diff --git a/src/components/IconFont.ts b/src/components/IconFont.ts
index b17bb0f6..786e90e7 100644
--- a/src/components/IconFont.ts
+++ b/src/components/IconFont.ts
@@ -3,5 +3,5 @@
import { createFromIconfontCN } from '@ant-design/icons-vue'
export default createFromIconfontCN({
- scriptUrl: '//at.alicdn.com/t/font_2317509_83tu8tohuv.js',
+ scriptUrl: '//at.alicdn.com/t/font_2317509_nn4bn0af7a.js',
}) as any
\ No newline at end of file
diff --git a/src/main.ts b/src/main.ts
index 002a4b1c..00637f9a 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -29,6 +29,7 @@ import {
Switch,
Radio,
Input,
+ Modal,
} from 'ant-design-vue'
const app = createApp(App)
@@ -48,6 +49,7 @@ app.component('RadioGroup', Radio.Group)
app.component('RadioButton', Radio.Button)
app.component('Input', Input)
app.component('InputGroup', Input.Group)
+app.component('Modal', Modal)
app.use(contextmenu)
app.use(clickOutside)
diff --git a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue
index 7c487eda..bf05dc4f 100644
--- a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue
+++ b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue
@@ -321,7 +321,7 @@ export default defineComponent({
store.commit(MutationTypes.REMOVE_ELEMENT_PROPS, {
id: handleElement.value.id,
- propName: ['clip', 'outline', 'flip', 'shadow', 'filter'],
+ propName: ['clip', 'outline', 'flip', 'shadow', 'filters'],
})
addHistorySnapshot()
}
diff --git a/src/views/Screen/index.vue b/src/views/Screen/index.vue
index fa01bb6a..1e98acef 100644
--- a/src/views/Screen/index.vue
+++ b/src/views/Screen/index.vue
@@ -8,12 +8,13 @@
@@ -32,6 +33,33 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -40,18 +68,20 @@ import { computed, defineComponent, onMounted, onUnmounted, Ref, ref } from 'vue
import { useStore } from 'vuex'
import throttle from 'lodash/throttle'
import { MutationTypes, State } from '@/store'
+import { Slide } from '@/types/slides'
import { exitFullscreen, isFullscreen } from '@/utils/fullscreen'
import { VIEWPORT_ASPECT_RATIO, VIEWPORT_SIZE } from '@/configs/canvas'
import { KEYS } from '@/configs/hotkey'
import { ContextmenuItem } from '@/components/Contextmenu/types'
import ScreenSlide from './ScreenSlide.vue'
-import { Slide } from '@/types/slides'
+import ThumbnailSlide from '@/views/components/ThumbnailSlide/index.vue'
export default defineComponent({
name: 'screen',
components: {
ScreenSlide,
+ ThumbnailSlide,
},
setup() {
const store = useStore()
@@ -63,6 +93,8 @@ export default defineComponent({
const slideHeight = ref(0)
const scale = computed(() => slideWidth.value / VIEWPORT_SIZE)
+ const slideListModelVisible = ref(false)
+
const setSlideContentSize = () => {
const winWidth = document.body.clientWidth
const winHeight = document.body.clientHeight
@@ -158,6 +190,12 @@ export default defineComponent({
animationIndex.value = 0
}
+ const turnSlideToIndex = (index: number) => {
+ slideListModelVisible.value = false
+ store.commit(MutationTypes.UPDATE_SLIDE_INDEX, index)
+ animationIndex.value = 0
+ }
+
const contextmenus = (): ContextmenuItem[] => {
return [
{
@@ -188,6 +226,10 @@ export default defineComponent({
mousewheelListener,
animationIndex,
contextmenus,
+ execPrev,
+ execNext,
+ slideListModelVisible,
+ turnSlideToIndex,
}
},
})
@@ -212,17 +254,48 @@ export default defineComponent({
left: 0;
width: 100%;
height: 100%;
- transition-property: transform;
- transition-duration: .4s;
&.show {
z-index: 2;
}
- &.prev {
- transform: translateY(-100%);
+
+ &.turning-mode-no {
+ &.prev {
+ transform: translateY(-100%);
+ }
+ &.next {
+ transform: translateY(100%);
+ }
}
- &.next {
- transform: translateY(100%);
+ &.turning-mode-fade {
+ transition: opacity .75s;
+
+ &.prev {
+ pointer-events: none;
+ opacity: 0;
+ }
+ &.next {
+ pointer-events: none;
+ opacity: 0;
+ }
+ }
+ &.turning-mode-slideX {
+ transition: transform .35s;
+ &.prev {
+ transform: translateX(-100%);
+ }
+ &.next {
+ transform: translateX(100%);
+ }
+ }
+ &.turning-mode-slideY {
+ transition: transform .35s;
+ &.prev {
+ transform: translateY(-100%);
+ }
+ &.next {
+ transform: translateY(100%);
+ }
}
}
.slide-content {
@@ -235,4 +308,47 @@ export default defineComponent({
justify-content: center;
align-items: center;
}
+
+.tools {
+ position: fixed;
+ bottom: 8px;
+ left: 8px;
+ font-size: 25px;
+ color: #666;
+ z-index: 10;
+ cursor: pointer;
+}
+.tool-btn {
+ opacity: .35;
+
+ &:hover {
+ opacity: .7;
+ }
+ & + .tool-btn {
+ margin-left: 8px;
+ }
+}
+
+.slide-list-model {
+ height: 600px;
+ padding: 5px 10px;
+ display: flex;
+ flex-wrap: wrap;
+ align-content: flex-start;
+ overflow: overlay;
+
+ .thumbnail {
+ width: 150px;
+ margin-bottom: 12px;
+ outline: 1px solid rgba($color: $themeColor, $alpha: .1);
+
+ &.active {
+ outline-color: $themeColor;
+ }
+
+ &:not(:nth-child(6n)) {
+ margin-right: 12px;
+ }
+ }
+}
\ No newline at end of file