diff --git a/src/components.d.ts b/src/components.d.ts index 3bfe0ae..5232b92 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -17,6 +17,7 @@ declare module '@vue/runtime-core' { RouterView: typeof import('vue-router')['RouterView'] StapleTag: typeof import('./components/tags/StapleTag.vue')['default'] Switch: typeof import('./components/Switch.vue')['default'] + ToggleMode: typeof import('./components/ToggleMode.vue')['default'] ToolTag: typeof import('./components/tags/ToolTag.vue')['default'] VegetableTag: typeof import('./components/tags/VegetableTag.vue')['default'] } diff --git a/src/components/ChooseFood.vue b/src/components/ChooseFood.vue index eae5714..2ba9440 100644 --- a/src/components/ChooseFood.vue +++ b/src/components/ChooseFood.vue @@ -1,8 +1,6 @@ + + diff --git a/src/composables/animation.ts b/src/composables/animation.ts new file mode 100644 index 0000000..24d8448 --- /dev/null +++ b/src/composables/animation.ts @@ -0,0 +1,42 @@ +import { isClient } from '@vueuse/core' +import type { Ref } from 'vue' + +export function useEmojiAnimation(recipeBtn: Ref) { + const { x, y } = usePointer() + const { top, left } = useElementBounding(recipeBtn) + + const playAnimation = (emoji: string) => { + if (!isClient) + return + + // 单个 Vue 组件实现不适合创建多个元素和清除动画 + const emojiEl = document.createElement('span') + emojiEl.style.position = 'fixed' + emojiEl.style.left = `${x.value}px` + emojiEl.style.top = `${y.value}px` + emojiEl.style.zIndex = '10' + emojiEl.style.transition = 'left .4s linear, top .4s cubic-bezier(0.5, -0.5, 1, 1)' + emojiEl.textContent = emoji + document.body.appendChild(emojiEl) + + setTimeout(() => { + // 以防万一,按钮位置没检测出来,就不播放动画了 + if (!top.value || !left.value) { + emojiEl.style.top = `${x.value}px` + emojiEl.style.left = `${y.value}px` + } + else { + emojiEl.style.top = `${top.value}px` + emojiEl.style.left = `${left.value + 12}px` + } + }, 1) + + emojiEl.ontransitionend = () => { + emojiEl.remove() + } + } + + return { + playAnimation, + } +} diff --git a/src/stores/recipe.ts b/src/stores/recipe.ts index 3d2fa81..bcf743e 100644 --- a/src/stores/recipe.ts +++ b/src/stores/recipe.ts @@ -4,12 +4,12 @@ const namespace = 'cook' /** * survival: 生存模式 + * strict: 严格 + * loose: 模糊 */ -type CookMode = 'survival' | '' +export type SearchMode = 'survival' | 'loose' | 'strict' export const useRecipeStore = defineStore('recipe', () => { - const strict = useStorage(`${namespace}:strict`, false) - const curStuff = useStorage(`${namespace}:stuff`, new Set()) // const curTools = ref(new Set()) const curTool = useStorage(`${namespace}:tool`, '') @@ -18,7 +18,7 @@ export const useRecipeStore = defineStore('recipe', () => { // const selectedTools = computed(() => Array.from(curTools.value)) // const selectedTools = ref('') - const mode = ref('') + const curMode = useStorage(`${namespace}:mode`, 'loose') function toggleStuff(name: string) { if (!curStuff) @@ -40,6 +40,10 @@ export const useRecipeStore = defineStore('recipe', () => { // curTools.value.add(name) } + function setMode(mode: SearchMode) { + curMode.value = mode + } + /** * 重置 */ @@ -50,12 +54,14 @@ export const useRecipeStore = defineStore('recipe', () => { } return { - strict, curTool, + curMode, selectedStuff, + toggleStuff, toggleTools, reset, + setMode, } })