edit overflow: hidden

This commit is contained in:
2026-06-14 17:28:19 +03:30
parent 3d8590ba66
commit ddc24612cb
6 changed files with 66 additions and 39 deletions
+25 -16
View File
@@ -160,25 +160,32 @@
</dl> </dl>
<p v-if="bookingError" class="mt-4 text-sm text-red-600">{{ bookingError }}</p> <p v-if="bookingError" class="mt-4 text-sm text-red-600">{{ bookingError }}</p>
</div> </div>
<div
class="hidden flex-wrap items-center justify-between gap-3 lg:flex"
>
<AppButton variant="ghost" class="!w-auto" @click="goBack">
مرحله قبل
</AppButton>
<AppButton
class="!w-auto min-w-[140px]"
:disabled="!canProceed"
:loading="bookingLoading && currentStep === 5"
@click="goNext"
>
{{ nextButtonLabel }}
</AppButton>
</div>
</div> </div>
</div> </div>
<div
v-if="showDesktopActions"
class="hidden flex-wrap items-center justify-between gap-3 lg:flex"
>
<AppButton
v-if="currentStep > 1"
variant="ghost"
class="!w-auto"
@click="goBack"
>
مرحله قبل
</AppButton>
<div v-else aria-hidden="true" />
<AppButton
class="!w-auto min-w-[140px]"
:disabled="!canProceed"
:loading="bookingLoading && currentStep === 5"
@click="goNext"
>
{{ nextButtonLabel }}
</AppButton>
</div>
<div <div
v-if="showMobileActions" v-if="showMobileActions"
class="fixed inset-x-0 bottom-16 z-20 border-t border-border bg-surface/95 backdrop-blur lg:hidden" class="fixed inset-x-0 bottom-16 z-20 border-t border-border bg-surface/95 backdrop-blur lg:hidden"
@@ -422,6 +429,8 @@ const showMobileActions = computed(
!(currentStep.value > 2 && !auth.isLoggedIn), !(currentStep.value > 2 && !auth.isLoggedIn),
); );
const showDesktopActions = showMobileActions;
const canProceed = computed(() => { const canProceed = computed(() => {
if (currentStep.value === 1) { if (currentStep.value === 1) {
return classStepRequired.value ? Boolean(selectedClassId.value) : true; return classStepRequired.value ? Boolean(selectedClassId.value) : true;
@@ -24,8 +24,10 @@ import HomeFeatureBar from '@/components/home/HomeFeatureBar.vue';
import HomeHeroSection from '@/components/home/HomeHeroSection.vue'; import HomeHeroSection from '@/components/home/HomeHeroSection.vue';
import HomeServicesSection from '@/components/home/HomeServicesSection.vue'; import HomeServicesSection from '@/components/home/HomeServicesSection.vue';
import DesktopSiteLayout from '@/layouts/DesktopSiteLayout.vue'; import DesktopSiteLayout from '@/layouts/DesktopSiteLayout.vue';
import { useAuthStore } from '@/stores/auth';
import { useTenantStore } from '@/stores/tenant'; import { useTenantStore } from '@/stores/tenant';
import type { LandingServiceItem } from '@/types/landing'; import type { LandingServiceItem } from '@/types/landing';
import { bookingDestination } from '@/utils/auth-redirect';
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
@@ -38,6 +40,7 @@ const props = withDefaults(
); );
const router = useRouter(); const router = useRouter();
const auth = useAuthStore();
const tenant = useTenantStore(); const tenant = useTenantStore();
const { singleBusinessId } = storeToRefs(tenant); const { singleBusinessId } = storeToRefs(tenant);
@@ -58,10 +61,6 @@ function goToBooking() {
return; return;
} }
void router.push({ void router.push(bookingDestination(id, auth.isLoggedIn, 'services'));
name: 'app-business-detail',
params: { id },
hash: '#services',
});
} }
</script> </script>
+1 -1
View File
@@ -1,7 +1,7 @@
<template> <template>
<div class="app-shell-root min-h-[100dvh] w-full bg-surface-2 lg:bg-surface-3"> <div class="app-shell-root min-h-[100dvh] w-full bg-surface-2 lg:bg-surface-3">
<div <div
class="app-shell-frame mx-auto flex h-[100dvh] max-h-[100dvh] w-full min-w-0 max-w-full flex-col overflow-hidden bg-surface shadow-xl shadow-black/5 dark:shadow-black/30 max-w-app lg:max-w-none lg:shadow-none" class="app-shell-frame mx-auto flex w-full min-w-0 max-w-full flex-col bg-surface shadow-xl shadow-black/5 dark:shadow-black/30 max-w-app max-lg:h-[100dvh] max-lg:max-h-[100dvh] max-lg:overflow-hidden lg:min-h-dvh lg:shadow-none"
> >
<slot /> <slot />
</div> </div>
+11 -13
View File
@@ -29,11 +29,9 @@
scrollbar-width: none; scrollbar-width: none;
-ms-overflow-style: none; -ms-overflow-style: none;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
height: 100%;
overflow: hidden;
} }
@supports (-webkit-touch-callout: none) { @media (max-width: 1023px) {
html, html,
body, body,
#app { #app {
@@ -41,15 +39,17 @@
overflow: hidden; overflow: hidden;
} }
.app-shell-root { @supports (-webkit-touch-callout: none) {
min-height: 100%; .app-shell-root {
min-height: -webkit-fill-available; min-height: 100%;
} min-height: -webkit-fill-available;
}
.app-shell-frame { .app-shell-frame {
height: 100%; height: 100%;
max-height: 100%; max-height: 100%;
min-height: -webkit-fill-available; min-height: -webkit-fill-available;
}
} }
} }
@@ -88,7 +88,5 @@
#app { #app {
min-height: 100dvh; min-height: 100dvh;
height: 100%;
overflow: hidden;
} }
} }
+23
View File
@@ -17,3 +17,26 @@ export function loginRouteWithRedirect(redirectPath: string) {
query: { redirect: redirectPath }, query: { redirect: redirectPath },
}; };
} }
export function businessBookingPath(businessId: string, hash?: string) {
const normalizedHash = hash?.replace(/^#/, '');
const base = `/app/businesses/${businessId}`;
return normalizedHash ? `${base}#${normalizedHash}` : base;
}
export function bookingDestination(
businessId: string,
isLoggedIn: boolean,
hash?: string,
) {
if (!isLoggedIn) {
return loginRouteWithRedirect(businessBookingPath(businessId, hash));
}
const normalizedHash = hash?.replace(/^#/, '');
return {
name: 'app-business-detail' as const,
params: { id: businessId },
...(normalizedHash ? { hash: normalizedHash } : {}),
};
}
+2 -4
View File
@@ -47,6 +47,7 @@ import { useAuthStore } from '@/stores/auth';
import { useTenantStore } from '@/stores/tenant'; import { useTenantStore } from '@/stores/tenant';
import type { LandingServiceItem } from '@/types/landing'; import type { LandingServiceItem } from '@/types/landing';
import { fetchLandingServices } from '@/utils/landing-services'; import { fetchLandingServices } from '@/utils/landing-services';
import { bookingDestination } from '@/utils/auth-redirect';
const isDesktop = useMediaQuery('(min-width: 1024px)'); const isDesktop = useMediaQuery('(min-width: 1024px)');
const router = useRouter(); const router = useRouter();
@@ -96,10 +97,7 @@ function goToBooking() {
const id = tenant.singleBusinessId; const id = tenant.singleBusinessId;
if (!id) return; if (!id) return;
void router.push({ void router.push(bookingDestination(id, auth.isLoggedIn));
name: 'app-business-detail',
params: { id },
});
} }
watch(showSingleBusinessLanding, (show) => { watch(showSingleBusinessLanding, (show) => {