Transitions
This commit is contained in:
parent
dbeb7db2c3
commit
2dcfaf513f
18
src/App.vue
18
src/App.vue
|
@ -1,7 +1,19 @@
|
|||
<script setup lang="ts"></script>
|
||||
<script setup lang="ts">
|
||||
import AppHeader from './components/AppHeader.vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container px-2 mx-auto h-full">
|
||||
<RouterView />
|
||||
<div class="container flex overflow-hidden flex-col px-2 mx-auto h-full max-w-md">
|
||||
<AppHeader />
|
||||
<!-- keep relative for transition -->
|
||||
<div class="relative">
|
||||
<RouterView v-slot="{ Component, route }">
|
||||
<Transition name="route">
|
||||
<Component
|
||||
:is="Component"
|
||||
:key="route.path" />
|
||||
</Transition>
|
||||
</RouterView>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -1,7 +1,24 @@
|
|||
<template>
|
||||
<h1 class="pt-2 pb-4 text-3xl font-bold text-center">
|
||||
Numbers
|
||||
</h1>
|
||||
<div class="flex justify-between items-center mx-auto w-full max-w-md">
|
||||
<RouterLink
|
||||
:class="{ 'opacity-0': isHome }"
|
||||
to="/"
|
||||
class="text-xl text-stone-400 transition-opacity">
|
||||
<IconHouse />
|
||||
</RouterLink>
|
||||
<h1 class="py-2 text-3xl text-center">
|
||||
Numbers
|
||||
</h1>
|
||||
<IconMenu class="text-xl" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts"></script>
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import IconHouse from '~icons/ph/house'
|
||||
import IconMenu from '~icons/ph/list'
|
||||
|
||||
const isHome = computed(() => useRoute().name === 'home')
|
||||
</script>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div>
|
||||
<TransitionGroup name="slide_up">
|
||||
<div
|
||||
class="mb-2 text-center"
|
||||
class="text-center md:mb-2"
|
||||
v-for="(op, i) in operations"
|
||||
:style="{
|
||||
transitionDelay: `${transDelay * (operations.length - i)}ms`,
|
||||
|
@ -21,7 +21,7 @@
|
|||
<!-- OPERATOR -->
|
||||
<div class="flex justify-center w-[2.5em] transition-all">
|
||||
<Component
|
||||
class="text-lg"
|
||||
class="text-lg text-stone-400"
|
||||
v-if="op.operator"
|
||||
:is="operatorIcons[op.operator]" />
|
||||
<span v-else> </span>
|
||||
|
@ -33,7 +33,7 @@
|
|||
</div>
|
||||
|
||||
<!-- EQUALS -->
|
||||
<div class="mx-4 border-none">
|
||||
<div class="mx-4 text-stone-400 border-none">
|
||||
<IconEquals />
|
||||
</div>
|
||||
|
||||
|
@ -56,10 +56,10 @@
|
|||
|
||||
<!-- UNDO -->
|
||||
<button
|
||||
class="ml-8"
|
||||
class="ml-4"
|
||||
@click="undoOperation(i)">
|
||||
<IconUndo
|
||||
class="text-stone-400"
|
||||
class="text-stone-600"
|
||||
:class="{
|
||||
invisible: !canOperationBeDeleted(op),
|
||||
}" />
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
<TransitionGroup name="slide_left">
|
||||
<PlaquetteBox
|
||||
v-for="(item, i) in plaquettes"
|
||||
|
||||
:key="i"
|
||||
is="button"
|
||||
@click="click(item)"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<template>
|
||||
<Component
|
||||
:is="is"
|
||||
class="flex overflow-hidden justify-center font-bold rounded border-stone-600 transition-opacity"
|
||||
class="flex overflow-hidden justify-center rounded border-stone-600"
|
||||
:class="[textSize]">
|
||||
<span
|
||||
class="self-center text-center"
|
||||
|
|
|
@ -13,15 +13,15 @@
|
|||
src: url('../fonts/manrope-v8-latin-regular.eot');
|
||||
/* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('../fonts/manrope-v8-latin-regular.eot?#iefix') format('embedded-opentype'),
|
||||
/* IE6-IE8 */
|
||||
url('../fonts/manrope-v8-latin-regular.woff2') format('woff2'),
|
||||
/* Super Modern Browsers */
|
||||
url('../fonts/manrope-v8-latin-regular.woff') format('woff'),
|
||||
/* Modern Browsers */
|
||||
url('../fonts/manrope-v8-latin-regular.ttf') format('truetype'),
|
||||
url('../fonts/manrope-v8-latin-regular.eot?#iefix')
|
||||
format('embedded-opentype'),
|
||||
/* IE6-IE8 */ url('../fonts/manrope-v8-latin-regular.woff2') format('woff2'),
|
||||
/* Super Modern Browsers */ url('../fonts/manrope-v8-latin-regular.woff')
|
||||
format('woff'),
|
||||
/* Modern Browsers */ url('../fonts/manrope-v8-latin-regular.ttf')
|
||||
format('truetype'),
|
||||
/* Safari, Android, iOS */
|
||||
url('../fonts/manrope-v8-latin-regular.svg#Manrope') format('svg');
|
||||
url('../fonts/manrope-v8-latin-regular.svg#Manrope') format('svg');
|
||||
/* Legacy iOS */
|
||||
}
|
||||
|
||||
|
@ -35,17 +35,40 @@
|
|||
/* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('../fonts/manrope-v8-latin-700.eot?#iefix') format('embedded-opentype'),
|
||||
/* IE6-IE8 */
|
||||
url('../fonts/manrope-v8-latin-700.woff2') format('woff2'),
|
||||
/* Super Modern Browsers */
|
||||
url('../fonts/manrope-v8-latin-700.woff') format('woff'),
|
||||
/* Modern Browsers */
|
||||
url('../fonts/manrope-v8-latin-700.ttf') format('truetype'),
|
||||
/* Safari, Android, iOS */
|
||||
url('../fonts/manrope-v8-latin-700.svg#Manrope') format('svg');
|
||||
/* IE6-IE8 */ url('../fonts/manrope-v8-latin-700.woff2') format('woff2'),
|
||||
/* Super Modern Browsers */ url('../fonts/manrope-v8-latin-700.woff')
|
||||
format('woff'),
|
||||
/* Modern Browsers */ url('../fonts/manrope-v8-latin-700.ttf')
|
||||
format('truetype'),
|
||||
/* Safari, Android, iOS */ url('../fonts/manrope-v8-latin-700.svg#Manrope')
|
||||
format('svg');
|
||||
/* Legacy iOS */
|
||||
}
|
||||
|
||||
/* ROUTE TRANSITION */
|
||||
|
||||
.route-move,
|
||||
.route-enter-active,
|
||||
.route-leave-active {
|
||||
transition: all .8s ease;
|
||||
}
|
||||
|
||||
.route-enter-from {
|
||||
opacity: 0;
|
||||
transform: translateX(100vw);
|
||||
}
|
||||
|
||||
.route-leave-to {
|
||||
opacity: 0;
|
||||
transform: translateX(-100vw);
|
||||
}
|
||||
|
||||
.route-leave-active {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
/* SLIDE LEFT */
|
||||
|
||||
.slide_left-move,
|
||||
.slide_left-enter-active,
|
||||
.slide_left-leave-active {
|
||||
|
@ -58,6 +81,12 @@
|
|||
transform: translateX(30px);
|
||||
}
|
||||
|
||||
/* .slide_left-leave-active {
|
||||
position: absolute;
|
||||
} */
|
||||
|
||||
/* SLIDE UP */
|
||||
|
||||
.slide_up-enter-active,
|
||||
.slide_up-leave-active {
|
||||
transition: all 0.5s ease;
|
||||
|
@ -85,4 +114,4 @@
|
|||
@apply w-fit p-2;
|
||||
@apply rounded border border-stone-600 hover:border-cyan-500 transition-opacity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,67 +1,65 @@
|
|||
<template>
|
||||
<AppHeader />
|
||||
<div class="w-full">
|
||||
<!-- Number to find -->
|
||||
<div class="p-1 mx-auto mb-4 w-fit text-cyan-500">
|
||||
<span class="text-4xl">{{ result ? result : '???' }}</span>
|
||||
</div>
|
||||
|
||||
<!-- Number to find -->
|
||||
<PlaquetteBox class="p-1 mx-auto mb-4 w-fit text-cyan-500">
|
||||
<span class="text-4xl">{{ result }}</span>
|
||||
</PlaquetteBox>
|
||||
<!-- Start button -->
|
||||
<!-- TODO: fix animation -->
|
||||
<Transition name="zero_height">
|
||||
<div
|
||||
class="text-center"
|
||||
v-if="gameState === GameState.Waiting">
|
||||
<div v-if="isDaily">
|
||||
Le défi quotidien vous propose un résultat différent chaque jour,
|
||||
commun à tous les joueurs.<br>
|
||||
</div>
|
||||
|
||||
<!-- Start button -->
|
||||
<!-- TODO: fix animation -->
|
||||
<Transition name="zero_height">
|
||||
<div
|
||||
class="text-center"
|
||||
v-if="gameState === GameState.Waiting">
|
||||
<div>
|
||||
Combinez les nombres imposés afin de trouver le résultat ci-dessus, ou
|
||||
de vous en approcher le plus possible.<br>
|
||||
Le compteur démarre quand vous cliquez sur le bouton.<br>Partagez vos
|
||||
meilleurs temps !
|
||||
<button
|
||||
@click="startGame"
|
||||
class="py-2 px-4 mt-4 btn">
|
||||
{{ t('startGame') }}
|
||||
</button>
|
||||
</div>
|
||||
</Transition>
|
||||
|
||||
<button
|
||||
@click="startGame"
|
||||
class="py-2 px-4 mt-4 btn">
|
||||
{{ t('startGame') }}
|
||||
</button>
|
||||
</div>
|
||||
</Transition>
|
||||
<!-- PLAQUETTES -->
|
||||
<PlaquettesList
|
||||
:plaquettes="shownPlaquettes"
|
||||
@click-number="selectNumber" />
|
||||
|
||||
<!-- PLAQUETTES -->
|
||||
<PlaquettesList
|
||||
:plaquettes="shownPlaquettes"
|
||||
@click-number="selectNumber" />
|
||||
<Transition name="slide_up">
|
||||
<div v-if="gameIsRunning">
|
||||
<!-- OPERATORS -->
|
||||
<OperatorsList @click="selectOperator" />
|
||||
|
||||
<Transition name="slide_up">
|
||||
<div v-if="gameIsRunning">
|
||||
<!-- OPERATORS -->
|
||||
<OperatorsList @click="selectOperator" />
|
||||
<!-- Divider -->
|
||||
<div class="my-4 mx-auto max-w-sm border-b" />
|
||||
|
||||
<!-- Divider -->
|
||||
<div class="my-4 mx-auto max-w-sm border-b" />
|
||||
<!-- List of Operations -->
|
||||
<OperationsList v-show="gameIsRunning" />
|
||||
</div>
|
||||
</Transition>
|
||||
|
||||
<!-- List of Operations -->
|
||||
<OperationsList v-show="gameIsRunning" />
|
||||
</div>
|
||||
</Transition>
|
||||
|
||||
<Transition name="slide_up">
|
||||
<div
|
||||
v-if="isEndGame"
|
||||
class="flex flex-row justify-evenly items-center mx-auto mt-8 max-w-sm">
|
||||
<span
|
||||
v-if="isResultPerfect"
|
||||
v-html="t('endGame.victoryLabel')" />
|
||||
<span
|
||||
v-else
|
||||
v-html="t('endGame.failureLabel')" />
|
||||
<button
|
||||
class="btn"
|
||||
@click="reboot">
|
||||
{{ t('playAgain') }}
|
||||
</button>
|
||||
</div>
|
||||
</Transition>
|
||||
<Transition name="slide_up">
|
||||
<div
|
||||
v-if="isEndGame"
|
||||
class="flex flex-row justify-evenly items-center mx-auto mt-8 max-w-sm">
|
||||
<span
|
||||
v-if="isResultPerfect"
|
||||
v-html="t('endGame.victoryLabel')" />
|
||||
<span
|
||||
v-else
|
||||
v-html="t('endGame.failureLabel')" />
|
||||
<button
|
||||
class="btn"
|
||||
@click="reboot">
|
||||
{{ t('playAgain') }}
|
||||
</button>
|
||||
</div>
|
||||
</Transition>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
|
@ -205,8 +203,13 @@ function reboot(): void {
|
|||
*/
|
||||
|
||||
onMounted(() => {
|
||||
reboot()
|
||||
gameState.value = GameState.Waiting
|
||||
// reboot()
|
||||
// gameState.value = GameState.Waiting
|
||||
result.value = 0
|
||||
setTimeout(() => {
|
||||
reboot()
|
||||
gameState.value = GameState.Waiting
|
||||
}, 800)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
<template>
|
||||
<div class="flex flex-col h-full text-center">
|
||||
<AppHeader />
|
||||
<div>
|
||||
Combinez les nombres imposés afin d'atteindre le résultat, ou de vous en
|
||||
approcher le plus possible.<br>
|
||||
<br>
|
||||
</div>
|
||||
<div class="flex flex-col grow gap-16 justify-center md:flex-row md:mt-16">
|
||||
<div class="flex flex-col grow p-1 w-full text-center">
|
||||
<div class="flex flex-col grow gap-16 justify-center md:mt-16">
|
||||
<div>
|
||||
Combinez les nombres imposés afin d'atteindre le résultat, ou de vous en
|
||||
approcher le plus possible.<br>
|
||||
<br>
|
||||
</div>
|
||||
<!-- Daily -->
|
||||
<div class="flex flex-col gap-4 items-center">
|
||||
<RouterLink
|
||||
to="/daily"
|
||||
class="text-3xl btn">
|
||||
class="text-2xl btn">
|
||||
{{ t('dailyGame') }}
|
||||
</RouterLink>
|
||||
<span>
|
||||
|
@ -24,7 +23,7 @@
|
|||
<div class="flex flex-col gap-4 items-center">
|
||||
<RouterLink
|
||||
to="/random"
|
||||
class="text-3xl btn">
|
||||
class="text-2xl btn">
|
||||
{{ t('randomGame') }}
|
||||
</RouterLink>
|
||||
Un nombre au hasard, pour le plaisir
|
||||
|
|
Loading…
Reference in New Issue
Block a user