UPD: Animate drag
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
class="flex-1 flex flex-col items-center rounded-lg p-2 gap-2 font-heading transition-all border"
|
class="flex-1 flex flex-col items-center rounded-lg p-2 gap-2 font-heading transition-all border"
|
||||||
:class="{'text-black bg-zinc-300 hover:bg-zinc-200 border-zinc-100': selected,
|
:class="{'text-black bg-zinc-300 hover:bg-zinc-200 border-zinc-100': selected,
|
||||||
'hover:bg-zinc-800 text-muted-foreground border-transparent' : !selected}"
|
'hover:bg-zinc-800 text-muted-foreground border-transparent' : !selected}"
|
||||||
@click="$emit('select'); $refs.title.scramble()">
|
@click="$emit('select'); $refs.title?.scramble()">
|
||||||
<slot v-if="$slots['replace']" name="replace" />
|
<slot v-if="$slots['replace']" name="replace" />
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<img
|
<img
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
v-model="configPage"
|
v-model="configPage"
|
||||||
:options="configPages"
|
:options="configPages"
|
||||||
class="p-2 border solid border-b">
|
class="p-2 border solid border-b">
|
||||||
<template v-for="(page, key) in configPages" #[key]>
|
<template v-for="(page, key) in configPages" #[key] :key="key">
|
||||||
{{ $t(page.titleKey) }}
|
<ScrambleText ref="title" :text="$t(page.titleKey)" />
|
||||||
</template>
|
</template>
|
||||||
</TabSelect>
|
</TabSelect>
|
||||||
<div class="grow overflow-y-auto">
|
<div class="grow overflow-y-auto">
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { AudioLines, AudioWaveform, GaugeCircle } from 'lucide-vue-next'
|
import { AudioLines, AudioWaveform, GaugeCircle } from 'lucide-vue-next'
|
||||||
import ConfigSection from '@/components/common/ConfigSection.vue'
|
import ConfigSection from '@/components/common/ConfigSection.vue'
|
||||||
import Color from 'color'
|
import { Separator } from '@/components/ui/separator'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import TabSelect from '@/components/common/TabSelect.vue'
|
import TabSelect from '@/components/common/TabSelect.vue'
|
||||||
import FdIcon from '@/assets/icons/iconFineDetents.svg'
|
import FdIcon from '@/assets/icons/iconFineDetents.svg'
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import CdIcon from '@/assets/icons/iconCoarseDetents.svg'
|
|||||||
import VfIcon from '@/assets/icons/iconViscousRotation.svg'
|
import VfIcon from '@/assets/icons/iconViscousRotation.svg'
|
||||||
import RcIcon from '@/assets/icons/iconReturnToCenter.svg'
|
import RcIcon from '@/assets/icons/iconReturnToCenter.svg'
|
||||||
import SteppedSlider from '@/components/common/SteppedSlider.vue'
|
import SteppedSlider from '@/components/common/SteppedSlider.vue'
|
||||||
|
import { Separator } from '@/components/ui/separator'
|
||||||
|
|
||||||
const feedbackType = ref('fineDetents') // TODO: replace with actual value
|
const feedbackType = ref('fineDetents') // TODO: replace with actual value
|
||||||
|
|
||||||
|
|||||||
76
src/components/old/DragTest.vue
Normal file
76
src/components/old/DragTest.vue
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import draggable from 'vuedraggable'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const message = [
|
||||||
|
'vue.draggable',
|
||||||
|
'draggable',
|
||||||
|
'component',
|
||||||
|
'for',
|
||||||
|
'vue.js 2.0',
|
||||||
|
'based',
|
||||||
|
'on',
|
||||||
|
'Sortablejs',
|
||||||
|
]
|
||||||
|
|
||||||
|
const list = ref(
|
||||||
|
message.map((name, index) => {
|
||||||
|
return { name, order: index + 1 }
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const dragOptions = ref({
|
||||||
|
animation: 200,
|
||||||
|
group: 'description',
|
||||||
|
disabled: false,
|
||||||
|
ghostClass: 'ghost',
|
||||||
|
})
|
||||||
|
|
||||||
|
const drag = ref(false)
|
||||||
|
|
||||||
|
const sort = () => {
|
||||||
|
console.log('here')
|
||||||
|
list.value = list.value.sort((a, b) => a.order - b.order)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-2 flex">
|
||||||
|
<button class="btn btn-secondary button" @click="sort">
|
||||||
|
To original order
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-6 flex-col">
|
||||||
|
<h3>Transition</h3>
|
||||||
|
<transition-group>
|
||||||
|
<draggable
|
||||||
|
key="dragggable"
|
||||||
|
item-key="name"
|
||||||
|
:list="list"
|
||||||
|
v-bind="dragOptions"
|
||||||
|
@start="drag = true"
|
||||||
|
@end="drag = false"
|
||||||
|
>
|
||||||
|
<template #item="{ element }">
|
||||||
|
<li :key="element.name">
|
||||||
|
{{ element.name }}
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
</draggable>
|
||||||
|
</transition-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.button {
|
||||||
|
margin-top: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ghost {
|
||||||
|
opacity: 0.5;
|
||||||
|
background: #c8ebfb;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -50,30 +50,32 @@
|
|||||||
}})</span>
|
}})</span>
|
||||||
</CollapsibleTrigger>
|
</CollapsibleTrigger>
|
||||||
<CollapsibleContent>
|
<CollapsibleContent>
|
||||||
<draggable
|
<TransitionGroup>
|
||||||
:list="category.profiles"
|
<draggable
|
||||||
group="profiles"
|
key="draggable"
|
||||||
item-key="name"
|
item-key="id"
|
||||||
:animation="150"
|
:list="category.profiles"
|
||||||
direction="vertical"
|
v-bind="dragOptions"
|
||||||
@start="drag = true"
|
@start="drag = true"
|
||||||
@end="drag = false"
|
@end="drag = false"
|
||||||
@change="(event)=>onProfileDrop(event, categoryIndex)">
|
@change="(event)=>onProfileDrop(event, categoryIndex)">
|
||||||
<template v-if="category.profiles.length === 0" #header>
|
<template v-if="category.profiles.length === 0" #header>
|
||||||
<div class="flex h-12 justify-center items-center hideable-header">
|
<div class="flex h-12 justify-center items-center hideable-header">
|
||||||
<MoreHorizontal class="w-4 text-zinc-600" />
|
<MoreHorizontal class="w-4 text-zinc-600" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #item="{ element }">
|
<template #item="{ element }">
|
||||||
<ProfileButton
|
<div :key="element.name">
|
||||||
:key="element.id"
|
<ProfileButton
|
||||||
:profile="element"
|
:profile="element"
|
||||||
:selected="store.selectedProfile?.id === element.id"
|
:selected="store.selectedProfile?.id === element.id"
|
||||||
@select="store.selectProfile(element.id); showProfileConfig=true"
|
@select="store.selectProfile(element.id); showProfileConfig=true"
|
||||||
@duplicate="store.duplicateProfile(element.id)"
|
@duplicate="store.duplicateProfile(element.id)"
|
||||||
@delete="store.removeProfile(element.id)" />
|
@delete="store.removeProfile(element.id)" />
|
||||||
</template>
|
</div>
|
||||||
</draggable>
|
</template>
|
||||||
|
</draggable>
|
||||||
|
</TransitionGroup>
|
||||||
</CollapsibleContent>
|
</CollapsibleContent>
|
||||||
</Collapsible>
|
</Collapsible>
|
||||||
</div>
|
</div>
|
||||||
@@ -104,6 +106,13 @@ defineProps({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const dragOptions = ref({
|
||||||
|
group: 'profiles',
|
||||||
|
ghostClass: 'ghost',
|
||||||
|
animation: 150,
|
||||||
|
direction: 'vertical',
|
||||||
|
})
|
||||||
|
|
||||||
const maxProfiles = 32
|
const maxProfiles = 32
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
@@ -198,6 +207,10 @@ const onProfileDrop = (event, categoryIndex) => {
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sortable-drag {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.hideable-header:not(:only-child) {
|
.hideable-header:not(:only-child) {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user