feat: visualize swipe back
This commit is contained in:
@@ -21,6 +21,45 @@
|
|||||||
|
|
||||||
<CartButton v-if="settings.store_enabled"/>
|
<CartButton v-if="settings.store_enabled"/>
|
||||||
<Dock v-if="isAppDockShown"/>
|
<Dock v-if="isAppDockShown"/>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="swiperBack.isActive.value"
|
||||||
|
class="fixed top-1/2 left-0 z-50
|
||||||
|
w-16
|
||||||
|
-translate-y-1/2
|
||||||
|
-translate-x-12
|
||||||
|
text-primary-content
|
||||||
|
flex items-center justify-end
|
||||||
|
shadow-xl
|
||||||
|
border-r
|
||||||
|
border-t
|
||||||
|
border-b
|
||||||
|
rounded-br-lg
|
||||||
|
rounded-tr-lg
|
||||||
|
py-2
|
||||||
|
"
|
||||||
|
:class="{
|
||||||
|
'bg-primary': swiperBack.deltaX.value < swiperBack.ACTIVATION_THRESHOLD,
|
||||||
|
'bg-accent': swiperBack.deltaX.value >= swiperBack.ACTIVATION_THRESHOLD,
|
||||||
|
}"
|
||||||
|
:style="{ transform: `translate(${easeOut(swiperBack.deltaX.value/10, 30)}px, -50%)` }"
|
||||||
|
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-8 h-8"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M8.25 9V5.25A2.25 2.25 0 0 1 10.5 3h6a2.25 2.25 0 0 1 2.25 2.25v13.5A2.25 2.25 0 0 1 16.5 21h-6a2.25 2.25 0 0 1-2.25-2.25V15m-3 0-3-3m0 0 3-3m-3 3H15"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -66,7 +105,7 @@ const haptic = window.Telegram.WebApp.HapticFeedback;
|
|||||||
const drawerOpen = ref(false);
|
const drawerOpen = ref(false);
|
||||||
|
|
||||||
// Инициализация жеста Swipe Back (без визуального индикатора)
|
// Инициализация жеста Swipe Back (без визуального индикатора)
|
||||||
useSwipeBack();
|
const swiperBack = useSwipeBack();
|
||||||
|
|
||||||
const routesToHideAppDock = [
|
const routesToHideAppDock = [
|
||||||
'product.show',
|
'product.show',
|
||||||
@@ -75,6 +114,12 @@ const routesToHideAppDock = [
|
|||||||
'filters',
|
'filters',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function easeOut(value, max) {
|
||||||
|
const x = Math.min(Math.abs(value) / max, 1)
|
||||||
|
const eased = 1 - (1 - x) ** 3
|
||||||
|
return Math.sign(value) * eased * max
|
||||||
|
}
|
||||||
|
|
||||||
const isAppDockShown = computed(() => {
|
const isAppDockShown = computed(() => {
|
||||||
if (routesToHideAppDock.indexOf(route.name) === -1) {
|
if (routesToHideAppDock.indexOf(route.name) === -1) {
|
||||||
// Скрываем Dock, если клавиатура открыта на странице поиска
|
// Скрываем Dock, если клавиатура открыта на странице поиска
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export function useSwipeBack() {
|
|||||||
|
|
||||||
// Конфигурация
|
// Конфигурация
|
||||||
const EDGE_THRESHOLD = 20; // Расстояние от левого края для активации (px)
|
const EDGE_THRESHOLD = 20; // Расстояние от левого края для активации (px)
|
||||||
const ACTIVATION_THRESHOLD = 40; // Пороговое расстояние для активации (px)
|
const ACTIVATION_THRESHOLD = 80; // Пороговое расстояние для активации (px)
|
||||||
const MAX_DELTA = 80; // Максимальное расстояние для расчета прогресса (px)
|
const MAX_DELTA = 80; // Максимальное расстояние для расчета прогресса (px)
|
||||||
|
|
||||||
let touchStartX = 0;
|
let touchStartX = 0;
|
||||||
@@ -198,6 +198,7 @@ export function useSwipeBack() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
isTracking,
|
||||||
isActive,
|
isActive,
|
||||||
deltaX,
|
deltaX,
|
||||||
progress,
|
progress,
|
||||||
|
|||||||
Reference in New Issue
Block a user