feat: add delay before showing dialogs and enhance item card styles for better user feedback
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 1m11s
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 1m11s
This commit is contained in:
@@ -213,12 +213,16 @@ const triggerReward = (reward: RewardStatus) => {
|
|||||||
|
|
||||||
if (reward.redeeming) {
|
if (reward.redeeming) {
|
||||||
dialogReward.value = reward
|
dialogReward.value = reward
|
||||||
showCancelDialog.value = true
|
setTimeout(() => {
|
||||||
|
showCancelDialog.value = true
|
||||||
|
}, 150)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (reward.points_needed <= 0) {
|
if (reward.points_needed <= 0) {
|
||||||
dialogReward.value = reward
|
dialogReward.value = reward
|
||||||
showRewardDialog.value = true
|
setTimeout(() => {
|
||||||
|
showRewardDialog.value = true
|
||||||
|
}, 150)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -563,7 +563,9 @@ const triggerTask = (task: Task) => {
|
|||||||
showPendingRewardDialog.value = true
|
showPendingRewardDialog.value = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
showConfirm.value = true
|
setTimeout(() => {
|
||||||
|
showConfirm.value = true
|
||||||
|
}, 150)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cancelRewardById(rewardId: string) {
|
async function cancelRewardById(rewardId: string) {
|
||||||
@@ -629,7 +631,9 @@ const triggerReward = (reward: RewardStatus) => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
selectedReward.value = reward
|
selectedReward.value = reward
|
||||||
showRewardConfirm.value = true
|
setTimeout(() => {
|
||||||
|
showRewardConfirm.value = true
|
||||||
|
}, 150)
|
||||||
}
|
}
|
||||||
|
|
||||||
const confirmTriggerReward = async () => {
|
const confirmTriggerReward = async () => {
|
||||||
|
|||||||
@@ -178,7 +178,11 @@ onBeforeUnmount(() => {
|
|||||||
<div
|
<div
|
||||||
v-for="item in items"
|
v-for="item in items"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
:class="['item-card', props.getItemClass?.(item)]"
|
:class="[
|
||||||
|
'item-card',
|
||||||
|
props.getItemClass?.(item),
|
||||||
|
{ 'item-ready': props.readyItemId === item.id },
|
||||||
|
]"
|
||||||
:ref="(el) => (itemRefs[item.id] = el)"
|
:ref="(el) => (itemRefs[item.id] = el)"
|
||||||
@click.stop="handleClicked(item)"
|
@click.stop="handleClicked(item)"
|
||||||
>
|
>
|
||||||
@@ -279,11 +283,25 @@ onBeforeUnmount(() => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
user-select: none; /* Prevent image selection */
|
user-select: none; /* Prevent image selection */
|
||||||
|
-webkit-tap-highlight-color: transparent; /* Suppress native mobile tap flash */
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-card:hover {
|
/* Only apply hover lift on true pointer (non-touch) devices */
|
||||||
transform: translateY(-4px);
|
@media (hover: hover) {
|
||||||
box-shadow: var(--item-card-hover-shadow, 0 8px 20px rgba(0, 0, 0, 0.12));
|
.item-card:hover {
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: var(--item-card-hover-shadow, 0 8px 20px rgba(0, 0, 0, 0.12));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Brief press feedback on touch devices */
|
||||||
|
.item-card:active {
|
||||||
|
transform: scale(0.97);
|
||||||
|
transition: transform 0.08s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card.item-ready {
|
||||||
|
animation: ready-glow 0.25s ease forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
.edit-button {
|
.edit-button {
|
||||||
|
|||||||
Reference in New Issue
Block a user