fix resultat
This commit is contained in:
parent
e53eaef552
commit
1fc5628861
@ -57,6 +57,13 @@ class CardController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function cartResult()
|
||||||
|
{
|
||||||
|
return Inertia::render('cards/resultat', [
|
||||||
|
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function freeCartResult($id)
|
public function freeCartResult($id)
|
||||||
{
|
{
|
||||||
$card = $this->cardRepository->find($id);
|
$card = $this->cardRepository->find($id);
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
import CardShuffleTemplate from '@/components/template/CardShuffleTemplate.vue';
|
import CardShuffleTemplate from '@/components/template/CardShuffleTemplate.vue';
|
||||||
import { Card } from '@/types/cart';
|
import { Card } from '@/types/cart';
|
||||||
import { router } from '@inertiajs/vue3';
|
import { router } from '@inertiajs/vue3';
|
||||||
import { ref, watchEffect, computed } from 'vue';
|
import { computed, ref, watchEffect } from 'vue';
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
drawCount?: number; // Optional: number of cards expected to be drawn
|
drawCount?: number; // Optional: number of cards expected to be drawn
|
||||||
@ -19,6 +19,7 @@ const isDrawing = ref(false);
|
|||||||
const drawingIndex = ref<number | null>(null);
|
const drawingIndex = ref<number | null>(null);
|
||||||
const revealedCards = ref<Card[]>([]);
|
const revealedCards = ref<Card[]>([]);
|
||||||
const isFlipped = ref<boolean[]>([]);
|
const isFlipped = ref<boolean[]>([]);
|
||||||
|
const isRestacking = ref(false);
|
||||||
|
|
||||||
const remainingDeckSize = computed(() => Math.max(0, deckSize - revealedCards.value.length));
|
const remainingDeckSize = computed(() => Math.max(0, deckSize - revealedCards.value.length));
|
||||||
|
|
||||||
@ -27,7 +28,7 @@ const startDraw = (index: number) => {
|
|||||||
isDrawing.value = true;
|
isDrawing.value = true;
|
||||||
drawingIndex.value = index;
|
drawingIndex.value = index;
|
||||||
|
|
||||||
const DRAW_DURATION = 800; // keep in sync with CSS transition timing
|
const DRAW_DURATION = 1000; // keep in sync with CSS animation duration
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const nextCard = props.drawnCards![revealedCards.value.length];
|
const nextCard = props.drawnCards![revealedCards.value.length];
|
||||||
if (nextCard) {
|
if (nextCard) {
|
||||||
@ -36,6 +37,12 @@ const startDraw = (index: number) => {
|
|||||||
}
|
}
|
||||||
// Restack after drawing
|
// Restack after drawing
|
||||||
isSpread.value = false;
|
isSpread.value = false;
|
||||||
|
// brief bounce to emphasize restack
|
||||||
|
isRestacking.value = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
isRestacking.value = false;
|
||||||
|
}, 600);
|
||||||
|
|
||||||
drawingIndex.value = null;
|
drawingIndex.value = null;
|
||||||
isDrawing.value = false;
|
isDrawing.value = false;
|
||||||
}, DRAW_DURATION);
|
}, DRAW_DURATION);
|
||||||
@ -57,6 +64,10 @@ const handleDeckClick = () => {
|
|||||||
} else {
|
} else {
|
||||||
// No cards left to draw, just restack
|
// No cards left to draw, just restack
|
||||||
isSpread.value = false;
|
isSpread.value = false;
|
||||||
|
isRestacking.value = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
isRestacking.value = false;
|
||||||
|
}, 600);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -146,17 +157,11 @@ defineExpose({ setDrawnCards });
|
|||||||
<transition class="card-stack-fade">
|
<transition class="card-stack-fade">
|
||||||
<div
|
<div
|
||||||
class="card-stack relative mt-4 mb-4 flex h-[500px] w-[300px] items-center justify-center"
|
class="card-stack relative mt-4 mb-4 flex h-[500px] w-[300px] items-center justify-center"
|
||||||
:class="{ spread: isSpread, drawing: isDrawing }"
|
:class="{ spread: isSpread, drawing: isDrawing, restacking: isRestacking }"
|
||||||
@click="handleDeckClick"
|
@click="handleDeckClick"
|
||||||
v-show="!drawnCards || revealedCards.length < drawnCards.length"
|
v-show="!drawnCards || revealedCards.length < drawnCards.length"
|
||||||
>
|
>
|
||||||
<div
|
<div v-for="i in remainingDeckSize" :key="i" class="card" :style="getCardStyle(i)" @click="onCardClick(i, $event)">
|
||||||
v-for="i in remainingDeckSize"
|
|
||||||
:key="i"
|
|
||||||
class="card"
|
|
||||||
:style="getCardStyle(i)"
|
|
||||||
@click="onCardClick(i, $event)"
|
|
||||||
>
|
|
||||||
<div class="card-back">
|
<div class="card-back">
|
||||||
<div class="card-inner-content">
|
<div class="card-inner-content">
|
||||||
<img src="cards/1.png" alt="Card Back" class="card-back-image" />
|
<img src="cards/1.png" alt="Card Back" class="card-back-image" />
|
||||||
@ -297,7 +302,23 @@ defineExpose({ setDrawnCards });
|
|||||||
}
|
}
|
||||||
|
|
||||||
.card-stack.drawing {
|
.card-stack.drawing {
|
||||||
animation: card-drawing 1.5s ease-in-out;
|
animation: card-drawing 1s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restack bounce animation to emphasize stack collapse */
|
||||||
|
.card-stack.restacking {
|
||||||
|
animation: stack-restack 0.5s ease-out;
|
||||||
|
}
|
||||||
|
@keyframes stack-restack {
|
||||||
|
0% {
|
||||||
|
transform: translateY(-8px) rotateX(3deg) rotateY(-3deg);
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
transform: translateY(2px) rotateX(-1deg) rotateY(1deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(0) rotateX(0) rotateY(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Back des cartes */
|
/* Back des cartes */
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<div
|
<div
|
||||||
class="h-56 w-36 sm:h-64 sm:w-40 md:h-72 md:w-48 flex-shrink-0 rounded-md bg-cover bg-center bg-no-repeat transition-transform duration-300 hover:scale-105"
|
class="h-56 w-36 sm:h-64 sm:w-40 md:h-72 md:w-48 flex-shrink-0 rounded-md bg-cover bg-center bg-no-repeat transition-transform duration-300 hover:scale-105"
|
||||||
:style="{
|
:style="{
|
||||||
'background-image': `url('${imageUrl}')`,
|
'background-image': `url(/cards/${cardNumber + 1}.png)`,
|
||||||
'box-shadow': '0 0 15px 5px rgba(215, 186, 141, 0.3)',
|
'box-shadow': '0 0 15px 5px rgba(215, 186, 141, 0.3)',
|
||||||
transform: orientation === 'reversed' ? 'rotate(180deg)' : 'none'
|
transform: orientation === 'reversed' ? 'rotate(180deg)' : 'none'
|
||||||
}"
|
}"
|
||||||
@ -28,9 +28,9 @@
|
|||||||
<h3 class="text-midnight-blue text-xl sm:text-2xl font-bold leading-tight">
|
<h3 class="text-midnight-blue text-xl sm:text-2xl font-bold leading-tight">
|
||||||
{{ name }}
|
{{ name }}
|
||||||
</h3>
|
</h3>
|
||||||
<p class="text-midnight-blue/80 text-sm sm:text-base leading-relaxed">
|
<div class="text-midnight-blue/80 text-sm sm:text-base leading-relaxed" v-html="description">
|
||||||
{{ description }}
|
|
||||||
</p>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -79,7 +79,7 @@ onMounted(async () => {
|
|||||||
<card-result
|
<card-result
|
||||||
v-for="(card, index) in cards"
|
v-for="(card, index) in cards"
|
||||||
:key="card.id || index"
|
:key="card.id || index"
|
||||||
:card-number="index + 1"
|
:card-number="card.id"
|
||||||
:name="card.name"
|
:name="card.name"
|
||||||
:image-url="card.image_url"
|
:image-url="card.image_url"
|
||||||
:orientation="card.orientation"
|
:orientation="card.orientation"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user