Compare commits

...

29 Commits

Author SHA1 Message Date
alsaze
a7fe00dc75 огрничение кол-ва тостов
All checks were successful
Deploy / build (push) Successful in 1m0s
2025-12-17 21:40:09 +03:00
alsaze
3fd4ef72c6 add PromotionModal.vue
All checks were successful
Deploy / build (push) Successful in 58s
2025-12-16 14:44:49 +03:00
alsaze
e90368fc9d add PromotionModal.vue
All checks were successful
Deploy / build (push) Successful in 58s
2025-12-16 14:41:52 +03:00
alsaze
dc9208485c add PromotionModal.vue
All checks were successful
Deploy / build (push) Successful in 59s
2025-12-16 14:09:13 +03:00
alsaze
2b276c0c16 add PromotionModal.vue
All checks were successful
Deploy / build (push) Successful in 1m2s
2025-12-16 13:56:22 +03:00
alsaze
62a319ca47 env update
All checks were successful
Deploy / build (push) Successful in 55s
2025-12-15 15:02:55 +03:00
alsaze
091956ade4 remove prisma db, replace Rental to AT Golden
All checks were successful
Deploy / build (push) Successful in 2m24s
2025-12-15 14:03:16 +03:00
alsaze
9fc8bfa94d add transport in useMock.ts
Some checks failed
Deploy / build (push) Failing after 22s
2025-12-14 22:16:38 +03:00
alsaze
486ef55349 add nedvizhimost in useMock.ts
All checks were successful
Deploy / build (push) Successful in 3m3s
2025-12-14 21:43:14 +03:00
alsaze
6853d782a6 edit favicon
All checks were successful
Deploy / build (push) Successful in 55s
edit Contacts.vue
2025-12-11 13:22:14 +03:00
alsaze
2f0b72c387 add about-us.vue
All checks were successful
Deploy / build (push) Successful in 3m21s
2025-12-10 16:15:35 +03:00
alsaze
24237652db init prysma
All checks were successful
Deploy / build (push) Successful in 3m22s
2025-12-10 13:36:35 +03:00
alsaze
b6855bc2a7 Merge remote-tracking branch 'origin/master'
All checks were successful
Deploy / build (push) Successful in 50s
# Conflicts:
#	.env
2025-12-10 13:15:44 +03:00
alsaze
4699f2ed86 init prysma 2025-12-10 13:15:30 +03:00
alsaze
3123ff8727 init prysma 2025-12-10 13:15:22 +03:00
d22ee8c678 Merge pull request 'prysma' (#1) from prysma into master
All checks were successful
Deploy / build (push) Successful in 3m22s
Reviewed-on: #1
2025-12-10 09:57:50 +00:00
alsaze
51bcf9c690 init prysma 2025-12-10 12:55:47 +03:00
alsaze
6ab3a94483 init prysma 2025-12-09 22:47:26 +03:00
alsaze
e9144bd78c init prysma 2025-12-09 22:46:24 +03:00
alsaze
2fdeeb3520 init
All checks were successful
Deploy / build (push) Successful in 50s
2025-12-09 13:28:22 +03:00
alsaze
fb6df88366 init
All checks were successful
Deploy / build (push) Successful in 52s
2025-12-09 13:17:33 +03:00
alsaze
3747128a1b init
All checks were successful
Deploy / build (push) Successful in 1m13s
2025-12-09 00:56:07 +03:00
alsaze
3e3d9a1a2c init
All checks were successful
Deploy / build (push) Successful in 53s
2025-12-09 00:42:35 +03:00
alsaze
673738c234 init
All checks were successful
Deploy / build (push) Successful in 54s
2025-12-09 00:16:45 +03:00
alsaze
1a8d15e547 init
All checks were successful
Deploy / build (push) Successful in 52s
2025-12-09 00:09:09 +03:00
alsaze
38becd5e9b init
All checks were successful
Deploy / build (push) Successful in 59s
2025-12-08 17:04:51 +03:00
alsaze
c58fce240f init
Some checks are pending
Deploy / build (push) Has started running
2025-12-08 17:04:20 +03:00
alsaze
d1969e34dc init
All checks were successful
Deploy / build (push) Successful in 2m58s
2025-12-05 16:51:26 +03:00
alsaze
e8f3cd82a2 init
All checks were successful
Deploy / build (push) Successful in 50s
2025-12-04 15:53:55 +03:00
295 changed files with 2772 additions and 1124 deletions

3
.env
View File

@@ -1,4 +1,5 @@
VITE_BASE_URL=http://localhost:3000 VITE_BASE_URL=http://localhost:3000
VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2 VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
SMTP_USER=rentalservicekg@yandex.ru SMTP_USER=rentalservicekg@yandex.ru
SMTP_APP_PASSWORD=uljislsoihthciju SMTP_PASS=uljislsoihthciju
DATABASE_URL="file:./database.db"

View File

@@ -1,2 +1,5 @@
VITE_BASE_URL=http://localhost:3000 VITE_BASE_URL=http://localhost:3000
VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2 VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
SMTP_USER=rentalservicekg@yandex.ru
SMTP_PASS=uljislsoihthciju
DATABASE_URL="file:./database.db"

2
.gitignore vendored
View File

@@ -22,3 +22,5 @@ logs
.env .env
.env.* .env.*
!.env.example !.env.example
/generated/prisma

View File

@@ -14,7 +14,8 @@ ENV PORT=80
ENV VITE_BASE_URL=https://rental.koptilnya.xyz ENV VITE_BASE_URL=https://rental.koptilnya.xyz
ENV VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2 ENV VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
ENV SMTP_USER=rentalservicekg@yandex.ru ENV SMTP_USER=rentalservicekg@yandex.ru
ENV SMTP_APP_PASSWORD=uljislsoihthciju ENV SMTP_PASS=uljislsoihthciju
ENV DATABASE_URL="file:./database.db"
EXPOSE 80 EXPOSE 80

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -25,12 +25,14 @@
scrollbar-color: rgba(128, 128, 128, 0.5) transparent; scrollbar-color: rgba(128, 128, 128, 0.5) transparent;
} }
body {
-ms-overflow-style: -ms-autohiding-scrollbar;
}
html { html {
scroll-behavior: smooth; scroll-behavior: smooth;
overflow: visible !important;
}
body {
overflow: visible !important;
padding-right: 0 !important;
} }
//swiper //swiper
@@ -61,3 +63,39 @@ html {
bottom: 200px !important; bottom: 200px !important;
--swiper-pagination-bullet-size: 8px --swiper-pagination-bullet-size: 8px
} }
.swiper-button-prev,
.swiper-button-next {
width: 40px;
height: 40px;
background: #1e293b;
border-radius: 50%;
}
.swiper-navigation-icon{
display: none;
}
.swiper-button-prev::after,
.swiper-button-next::after {
content: "";
display: block;
width: 20px;
height: 20px;
mask-size: contain;
mask-repeat: no-repeat;
mask-position: center;
background: white;
}
/* Левая стрелка */
.swiper-button-prev::after {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 18l-6-6 6-6'/%3E%3C/svg%3E");
}
/* Правая стрелка */
.swiper-button-next::after {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18l6-6-6-6'/%3E%3C/svg%3E");
}

82
components/BaseFooter.vue Normal file
View File

@@ -0,0 +1,82 @@
<template>
<UFooter
class="border-t border-default mt-10"
:ui="{
center: 'w-full',
}"
>
<div class="w-full py-6 grid grid-cols-1 md:grid-cols-4 gap-10 text-sm">
<div id="footer-contacts">
<h3 class="font-semibold text-base mb-3">
Контакты
</h3>
<ul class="space-y-2 opacity-80">
<li>
<span class="font-medium">Телефон:</span><br>
<a href="tel:+996504280490" class="hover:opacity-100 opacity-70">
+9 (965) 042-80-490
</a>
</li>
<li>
<span class="font-medium">Email:</span><br>
<a href="mailto:atgoldenkg@gmail.com" class="hover:opacity-100 opacity-70">
atgoldenkg@gmail.com
</a>
</li>
<li>
<span class="font-medium">Адрес:</span><br>
<p class="opacity-70">
Адрес Бишкек, Свердловский район,
ул. Ибраимова, дом 115/4
</p>
</li>
</ul>
</div>
<div id="footer-contacts">
<h3 class="font-semibold text-base mb-3">
Реквизиты
</h3>
<ul class="space-y-2 opacity-80">
<li>
<p class="opacity-70">
Общество с ограниченной ответственностью "АТ Голден"
</p>
</li>
<li>
<p class="opacity-70">
ИНН 00406202010276
</p>
</li>
<li>
<p class="opacity-70">
Регистрационный номер 190962-3301-ООО
</p>
</li>
</ul>
</div>
<div>
<h3 class="font-semibold text-base mb-3">
Навигация
</h3>
<ul class="space-y-2 opacity-80">
<li><a href="/" class="hover:opacity-100 opacity-70">Главная</a></li>
<li><a href="/nedvizhimost" class="hover:opacity-100 opacity-70">Недвижимость</a></li>
<li><a href="/transport" class="hover:opacity-100 opacity-70">Авто</a></li>
<li><a href="/about-us" class="hover:opacity-100 opacity-70">О нас</a></li>
</ul>
</div>
<div class="md:text-right opacity-70 flex flex-col justify-between">
<div class="text-lg font-bold">
AT Golden
</div>
<div class="mt-4 md:mt-0">
© {{ new Date().getFullYear() }} AT Golden.
Все права защищены.
</div>
</div>
</div>
</UFooter>
</template>

View File

@@ -52,6 +52,7 @@ function desktopAnimation() {
trigger: benefitsRef.value, trigger: benefitsRef.value,
start: 'top 80%', start: 'top 80%',
toggleActions: 'play none none reverse', toggleActions: 'play none none reverse',
once: true,
}, },
}) })
@@ -94,7 +95,7 @@ const benefits = [
{ {
icon: '🏆', icon: '🏆',
title: 'Опыт и экспертиза', title: 'Опыт и экспертиза',
description: 'Более 10 лет на рынке консьерж-услуг', description: 'Более 5 лет на рынке консьерж-услуг',
}, },
] ]

View File

@@ -11,7 +11,7 @@
</div> </div>
<div class="text-2xl font-semibold"> <div class="text-2xl font-semibold">
Начните работу с Rental Начните работу с AT Golden
</div> </div>
<div class="text-base text-gray-300 mt-2"> <div class="text-base text-gray-300 mt-2">
@@ -25,7 +25,7 @@
:key="contact.label" :key="contact.label"
class="flex items-center gap-4" class="flex items-center gap-4"
> >
<div class="bg-gray-800 p-3 rounded-lg"> <div class="bg-gray-800 p-4 flex items-center rounded-lg">
<UIcon :name="contact.icon" /> <UIcon :name="contact.icon" />
</div> </div>
@@ -46,7 +46,7 @@
<form name="contacts" method="POST" @submit.prevent="onSubmit"> <form name="contacts" method="POST" @submit.prevent="onSubmit">
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
Как к вам обращаться Как к вам обращаться ?
<UInput <UInput
id="name" id="name"
v-model="name" v-model="name"
@@ -81,7 +81,7 @@
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
Что вас интересует? Что вас интересует ?
<div> <div>
<USelect <USelect
id="service" id="service"
@@ -91,7 +91,9 @@
:items="services" :items="services"
class="w-full" class="w-full"
size="xl" size="xl"
placeholder="выберите услугу" placeholder="Выберите услугу"
:ui="{ content: 'max-h-70' }"
:overlay="{ scrollLock: false }"
/> />
<div v-if="errors?.service" style="color: #ff6467"> <div v-if="errors?.service" style="color: #ff6467">
@@ -108,7 +110,7 @@
v-bind="commentAttrs" v-bind="commentAttrs"
name="comment" name="comment"
size="xl" size="xl"
placeholder="расскажите о ваших требованиях.." placeholder="Расскажите о ваших требованиях..."
/> />
</div> </div>
@@ -130,40 +132,53 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { useSessionStorage } from '@vueuse/core'
const toast = useToast() const toast = useToast()
const route = useRoute()
const contacts = [ const contacts = [
{ {
label: 'Телефон', label: 'Телефон',
value: '+7 (495) 123-45-67', value: '+9 (965) 042-80-490',
icon: 'i-lucide:phone', icon: 'i-lucide:phone',
}, },
{ {
label: 'Email', label: 'Email',
value: 'info@rental-concierge.com', value: 'atgoldenkg@gmail.com',
icon: 'i-lucide:mail', icon: 'i-lucide:mail',
}, },
{ {
label: 'Адрес', label: 'Адрес',
value: 'Москва, Тверская улица, 1', value: 'Адрес Бишкек, Свердловский район ул. Ибраимова, дом 115/4',
icon: 'i-lucide:map-pin', icon: 'i-lucide:map-pin',
}, },
] ]
const services = [ const services = [
'покупка авто', 'Покупка авто',
'продажа авто', 'Продажа авто',
'аренда авто', 'Аренда авто',
'покупка недвижимости', 'Покупка недвижимости',
'продажа недвижимости', 'Продажа недвижимости',
'аренда недвижимости', 'Аренда недвижимости',
] ]
const state = useSessionStorage('contacts', {
contacts:
{
name: '',
phone: '',
service: '',
comment: '',
},
})
const { errors, handleSubmit, defineField } = useForm({ const { errors, handleSubmit, defineField } = useForm({
initialValues: { initialValues: {
name: '', name: '',
phone: '', phone: '',
service: '', service: state?.value?.contacts?.service || '',
comment: '', comment: '',
}, },
validationSchema: { validationSchema: {
@@ -201,7 +216,10 @@ const [comment, commentAttrs] = defineField('comment')
const onSubmit = handleSubmit(async (values) => { const onSubmit = handleSubmit(async (values) => {
const res = await $fetch('/api/send_mail', { const res = await $fetch('/api/send_mail', {
method: 'POST', method: 'POST',
body: values, body: {
...values,
route: route.path,
},
}) })
if (res.ok) { if (res.ok) {
@@ -210,6 +228,11 @@ const onSubmit = handleSubmit(async (values) => {
}) })
} }
}) })
watch(() => state.value, () => {
if (state.value.contacts.service)
service.value = state.value.contacts.service
})
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@@ -12,6 +12,7 @@
:key="item.title" :key="item.title"
class="how-work" class="how-work"
:ui="cardUi" :ui="cardUi"
variant="subtle"
> >
<div class="how-work__number"> <div class="how-work__number">
{{ item.number }} {{ item.number }}
@@ -59,6 +60,7 @@ function desktopAnimation() {
trigger: howWorksRef.value, trigger: howWorksRef.value,
start: 'top 50%', start: 'top 50%',
toggleActions: 'play none none reverse', toggleActions: 'play none none reverse',
once: true,
}, },
}) })
@@ -120,7 +122,7 @@ const items = [
.how-work { .how-work {
&__number { &__number {
font-size: 48px; font-size: 48px;
opacity: 0.1; opacity: 0.3;
font-weight: 600; font-weight: 600;
} }

View File

@@ -1,50 +1,138 @@
<template> <template>
<div id="variations" class="main-carusel"> <div id="variations" class="main-carousel">
<h2>Актуальные варианты</h2> <h2>{{ title }}</h2>
<UCarousel <Swiper
v-slot="{ item }" :modules="[Navigation, Autoplay]"
arrows :loop="true"
:items="previewItems" :autoplay="{ delay: 2000 }"
:ui="{ item: 'basis-1/2 sm:basis-1/3 md:basis-1/4 lg:basis-1/5 xl:basis-1/6' }" :navigation="true"
class="w-full" :slides-per-view="1.2"
:space-between="16"
:breakpoints="{
640: { slidesPerView: 2 },
768: { slidesPerView: 3 },
1024: { slidesPerView: 4 },
1280: { slidesPerView: 5 },
}"
> >
<div class="variants"> <SwiperSlide
<NuxtLink :to="`/post/${item.id}`"> v-for="slide in mixedSlides"
<img :src="item?.previewImage?.src" :alt="item?.previewImage?.src"> :key="slide.id"
</NuxtLink> class="main-carousel__variant"
</div> >
</UCarousel> <template v-if="!slide.isText">
<NuxtLink :to="`/post/${slide.id}`">
<img :src="slide.previewImage.src" :alt="slide.shortTitle">
<div class="main-carousel__type text-sm">
{{ $t(slide.type) }}
</div>
<p class="text-sm">
{{ slide.shortTitle }}
</p>
</NuxtLink>
</template>
<template v-else>
<NuxtLink
href="#contacts"
class="main-carousel__text-slide"
>
{{ slide.text }}
</NuxtLink>
</template>
</SwiperSlide>
</Swiper>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Autoplay, Navigation } from 'swiper/modules'
import { Swiper, SwiperSlide } from 'swiper/vue'
import { computed } from 'vue'
import 'swiper/css'
import 'swiper/css/navigation'
interface PreviewItem { interface PreviewItem {
id: number id: number
shortTitle: string
type: string
previewImage: { previewImage: {
src: string src: string
} }
} }
defineProps<{ previewItems: PreviewItem[] }>() const props = defineProps<{ title?: 'Актуальные варианты', previewItems: PreviewItem[] }>()
const mixedSlides = computed(() => {
const result: Array<
PreviewItem | { isText: true, text: string }
> = []
props.previewItems.forEach((item, index) => {
result.push(item)
const count = index + 1
if (count % 6 === 0) {
result.push({
isText: true,
text: 'Хочешь больше вариантов?',
})
return
}
if (count % 3 === 0) {
result.push({
isText: true,
text: 'Не нашёл подходящий вариант?',
})
}
})
return result
})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.main-carusel { .main-carousel {
height: 300px; height: 380px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 16px;
}
.variants { &__variant {
cursor: pointer; position: relative;
height: 100%; cursor: pointer;
img { img {
border-radius: 12px; border-radius: 12px;
height: 300px;
width: 100%;
object-fit: cover;
}
}
&__text-slide {
height: 300px; height: 300px;
object-fit: cover; display: flex;
align-items: center;
justify-content: center;
border-radius: 12px;
background: #334155;
color: white;
padding: 16px;
text-align: center;
font-size: 18px;
}
&__type {
position: absolute;
top: 4px;
left: 4px;
padding: 4px 6px;
background: #1e293b;
border-radius: 8px;
} }
} }
</style> </style>

View File

@@ -1,6 +1,8 @@
<template> <template>
<h2>Где вы будете жить</h2> <div>
<p>{{ marker.subtitle }}</p> <h2>Где вы будете жить</h2>
<p>{{ marker.subtitle }}</p>
</div>
<YandexMap <YandexMap
:settings="{ location }" :settings="{ location }"

View File

@@ -0,0 +1,117 @@
<template>
<UModal
v-model:open="open"
:ui="modalUi"
title="Авто из Кыргызстана - под ключ !"
scrollable
>
<template #body>
<div class="promotion-modal">
<div class="grid gap-4 sm:grid-cols-2">
<UCard
v-for="car in cars"
:key="car.mark"
class="backdrop-blur-md bg-white/10 border border-white/20"
>
<template #header>
<div class="flex items-center gap-3">
<UIcon name="i-lucide-car" class="text-xl" />
<h3 class="text-lg font-semibold">
{{ car.mark }}
</h3>
</div>
</template>
<div class="flex flex-wrap gap-2">
<span
v-for="model in car.models"
:key="model"
class="
px-3 py-1 text-sm
rounded-full
bg-white/15
hover:bg-white/25
cursor-pointer
transition
"
>
{{ model }}
</span>
</div>
</UCard>
</div>
<UAccordion v-model="active" :items="items" />
<UButton size="xl" href="#contacts" @click="openContacts()">
Подробнее
</UButton>
</div>
</template>
</UModal>
</template>
<script setup lang="ts">
import type { AccordionItem } from '@nuxt/ui'
import { useSessionStorage } from '@vueuse/core'
const open = defineModel('modelValue', { type: Boolean, default: true })
const active = ref()
const modalUi = {
content:
'bg-[linear-gradient(rgba(0,0,0,0.5),rgba(0,0,0,0.5)),url(/changan.jpg)] bg-cover bg-center bg-no-repeat',
}
const items: AccordionItem[] = [
{
label: 'Подбор автомобиля',
icon: 'i-lucide-car',
content: 'Помощь в выборе автомобиля, консультация независимого эксперта.',
},
{
label: 'Юридическое оформление',
icon: 'i-lucide-file-text',
content: 'Оформление покупки с учетом требований действующего законодательства.',
},
{
label: 'Доставка и страхование',
icon: 'i-lucide-truck',
content: 'Организация доставки автомобиля и страхового сопровождения.',
},
]
const cars = [
{
mark: 'Changan',
models: ['CS55PLUS', 'UNI-K', 'X5 PLUS', 'UNI-Z', 'Deepel', 'Другие'],
},
{
mark: 'Geely',
models: ['Monharo', 'Emgrand', 'Galaxy Starship 7', 'Atlsa', 'Другие'],
},
]
const state = useSessionStorage('contacts', {
contacts:
{
name: '',
phone: '',
service: '',
comment: '',
},
})
function openContacts() {
open.value = false
state.value.contacts.service = 'покупка авто'
}
</script>
<style lang="scss">
.promotion-modal {
display: flex;
flex-direction: column;
gap: 20px;
}
</style>

View File

@@ -2,7 +2,7 @@
<UPageSection <UPageSection
id="services" id="services"
title="Что мы предлагаем" title="Что мы предлагаем"
description="Полный спектр консьерж-услуг для работы с недвижимостью и автомобилями" description="Полный спектр консьерж-услуг для работы с недвижимостью и автомобилями в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген)"
:ui="{ container: '!p-0' }" :ui="{ container: '!p-0' }"
> >
<template #body> <template #body>
@@ -70,6 +70,7 @@ function servicesAnimation() {
trigger: card, trigger: card,
start: 'top 70%', start: 'top 70%',
toggleActions: 'play none none reverse', toggleActions: 'play none none reverse',
once: true,
}, },
}) })
}) })

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,4 @@
{ {
"sale": "sale",
"rent": "rent"
} }

View File

@@ -1,3 +1,4 @@
{ {
"sale": "Продажа",
"rent": "Аренда"
} }

View File

@@ -1,11 +1,11 @@
<template> <template>
<div class="layout"> <div class="layout">
<UHeader <UHeader
title="Rental" title="AT Golden"
:toggle="false" :toggle="false"
:ui="{ :ui="{
root: 'fixed bg-transparent w-full', root: 'fixed bg-transparent w-full',
left: 'relative flex items-center w-full', left: 'relative flex items-center w-full justify-between',
container: 'gap-0', container: 'gap-0',
right: 'hidden', right: 'hidden',
}" }"
@@ -13,9 +13,20 @@
<template #left> <template #left>
<Icon class="cursor-pointer w-6 h-6" name="lucide:arrow-left" @click="routerBack()" /> <Icon class="cursor-pointer w-6 h-6" name="lucide:arrow-left" @click="routerBack()" />
<NuxtLink to="/" class="absolute left-1/2 transform -translate-x-1/2 text-lg"> <NuxtLink to="/" class="absolute left-1/2 transform -translate-x-1/2 text-lg flex items-center gap-2">
Rental <Icon name="my-icon:main-logo" :style="{ fontSize: isMobile ? '34px' : '48px' }" />
AT Golden
</NuxtLink> </NuxtLink>
<transition name="fade">
<UButton
v-if="showContactBar && !isMobile"
class="justify-center"
href="#contacts"
size="xl"
label="Свяжитесь с нами"
/>
</transition>
</template> </template>
</UHeader> </UHeader>
@@ -23,22 +34,21 @@
<slot /> <slot />
</UMain> </UMain>
<UFooter class="footer"> <BaseFooter v-if="!isMobile" />
<div class="flex flex-col md:flex-row items-center text-sm opacity-70">
<div>
© {{ new Date().getFullYear() }} Rental. Все права защищены.
</div>
</div>
</UFooter>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { useMediaQuery } from '@vueuse/core'
import BaseFooter from '~/components/BaseFooter.vue'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const isMobile = useMediaQuery('(max-width: 1280px)')
const { cartById } = useMock() const { cartById } = useMock()
const cart = cartById(route?.params?.id) const cart = cartById(route?.params?.id)
const showContactBar = useState('showContactBar', () => false)
function routerBack() { function routerBack() {
const newRoute = `/${cart?.category}#variations` const newRoute = `/${cart?.category}#variations`
@@ -47,6 +57,15 @@ function routerBack() {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: 0.3s;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
.footer { .footer {
@include mobile { @include mobile {
display: none; display: none;

View File

@@ -2,7 +2,7 @@
<div class="layout"> <div class="layout">
<ClientOnly> <ClientOnly>
<UHeader <UHeader
title="Rental" title="AT Golden"
:toggle="false" :toggle="false"
:ui="{ :ui="{
root: 'fixed bg-transparent w-full', root: 'fixed bg-transparent w-full',
@@ -12,16 +12,24 @@
}" }"
> >
<template #left> <template #left>
<div class="text-lg"> <NuxtLink to="/" class="text-lg flex items-center gap-2">
Rental <Icon name="my-icon:main-logo" :style="{ fontSize: isMobile ? '34px' : '48px' }" />
</div> <div v-if="!isMobile">
AT Golden
</div>
</NuxtLink>
<div class="absolute left-1/2 transform -translate-x-1/2"> <div class="absolute left-1/2 transform -translate-x-1/2">
<UTabs v-model="activeTab" :size="isMobile ? 'md' : 'xl'" :content="false" :items="tabs" /> <UTabs v-model="activeTab" :size="isMobile ? 'md' : 'xl'" :content="false" :items="tabs" />
</div> </div>
<!-- <UColorModeButton /> -->
<div class="ml-auto"> <div class="ml-auto">
<UButton href="#contacts" :size="isMobile ? 'md' : 'xl'" label="Связаться" /> <UButton
:href="route.path.startsWith('/about-us') ? '/' : '#contacts'"
:size="isMobile ? 'md' : 'xl'"
:label="route.path.startsWith('/about-us') ? 'Вернуться' : 'Связаться'"
/>
</div> </div>
</template> </template>
</UHeader> </UHeader>
@@ -31,25 +39,26 @@
<slot /> <slot />
</UMain> </UMain>
<UFooter> <BaseFooter />
<div class="flex flex-col md:flex-row items-center text-sm opacity-70">
<div> <PromotionModal v-model="open" />
© {{ new Date().getFullYear() }} Rental. Все права защищены.
</div>
</div>
</UFooter>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import type { TabsItem } from '@nuxt/ui' import type { TabsItem } from '@nuxt/ui'
import { useMediaQuery } from '@vueuse/core' import { useMediaQuery } from '@vueuse/core'
import BaseFooter from '~/components/BaseFooter.vue'
import PromotionModal from '~/components/PromotionModal.vue'
const isMobile = useMediaQuery('(max-width: 1280px)') const isMobile = useMediaQuery('(max-width: 1280px)')
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const open = ref(false)
const toast = useToast()
const tabs = computed<TabsItem[]>(() => [ const tabs = computed<TabsItem[]>(() => [
{ {
label: isMobile.value ? '' : 'Главная', label: isMobile.value ? '' : 'Главная',
@@ -71,6 +80,31 @@ const tabs = computed<TabsItem[]>(() => [
}, },
]) ])
function showToast() {
if (toast?.toasts?.value?.length > 0) {
return
}
toast.add({
title: 'Уникальное предложение !',
description: 'Покупка машины под ключ, Кыргызстан',
duration: 30000,
actions: [{
icon: 'i-lucide-car',
label: 'Подробнее',
color: 'neutral',
variant: 'outline',
onClick: () => {
open.value = true
},
}],
})
}
onMounted(() => {
showToast()
})
const activeTab = ref(route?.path.split('/')[1] || '/') const activeTab = ref(route?.path.split('/')[1] || '/')
watch(() => activeTab.value, () => { watch(() => activeTab.value, () => {
@@ -85,6 +119,6 @@ watch(() => route?.path, () => {
return return
} }
activeTab.value = routerPath activeTab.value = routerPath || '/'
}) })
</script> </script>

View File

@@ -26,6 +26,13 @@ export default defineNuxtConfig({
apikey: process.env.VITE_YANDEX_MAPS_KEY, apikey: process.env.VITE_YANDEX_MAPS_KEY,
}, },
css: ['~/assets/css/main.css', '~/assets/scss/main.scss'], css: ['~/assets/css/main.css', '~/assets/scss/main.scss'],
colorMode: {
preference: 'dark',
fallback: 'dark',
storageKey: 'color-mode',
classSuffix: '',
dataValue: 'dark',
},
build: { build: {
transpile: ['gsap'], transpile: ['gsap'],
}, },
@@ -40,6 +47,9 @@ export default defineNuxtConfig({
}, },
app: { app: {
head: { head: {
link: [
{ rel: 'icon', type: 'image/svg+xml', href: '/main-logo.svg' },
],
meta: [ meta: [
{ {
name: 'viewport', name: 'viewport',
@@ -60,4 +70,12 @@ export default defineNuxtConfig({
fonts: { fonts: {
provider: 'google', provider: 'google',
}, },
icon: {
customCollections: [
{
prefix: 'my-icon',
dir: './assets/my-icons',
},
],
},
}) })

View File

@@ -20,11 +20,14 @@
"@nuxt/ui": "^4.0.1", "@nuxt/ui": "^4.0.1",
"@nuxtjs/i18n": "^10.0.4", "@nuxtjs/i18n": "^10.0.4",
"@tanstack/vue-query-devtools": "^5.87.1", "@tanstack/vue-query-devtools": "^5.87.1",
"@types/better-sqlite3": "^7.6.13",
"@types/node": "^24.10.2",
"@vee-validate/nuxt": "^4.15.1", "@vee-validate/nuxt": "^4.15.1",
"@vueuse/core": "^13.1.0", "@vueuse/core": "^13.1.0",
"axios": "^1.12.2", "axios": "^1.12.2",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"decimal.js": "^10.5.0", "decimal.js": "^10.5.0",
"dotenv": "^17.2.3",
"gsap": "3.13", "gsap": "3.13",
"maska": "^3.2.0", "maska": "^3.2.0",
"nodemailer": "^7.0.11", "nodemailer": "^7.0.11",

80
pages/about-us.vue Normal file
View File

@@ -0,0 +1,80 @@
<template>
<UPageHero
title="О нас"
description="Общество с ограниченной ответственностью «АТ Голден» — современный консьерж-сервис по недвижимости и автомобилям в Кыргызстане."
:ui="{
container: '!p-0 !pt-[160px] !sm:pt-[96px]',
}"
/>
<UContainer class="flex flex-col gap-16 mt-16">
<div class="flex flex-col gap-6 text-lg sm:text-xl">
<p>
Общество с ограниченной ответственностью «АТ Голден» это современный консьерж-сервис, созданный для того, чтобы сделать услуги по подбору недвижимости и автомобилей доступными каждому. Мы работаем по всему Кыргызстану, включая Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген, обеспечивая удобное и безопасное сопровождение сделок в любом из этих городов.
</p>
<p>
Наша компания действует по принципу «под ключ»: мы полностью берём на себя поиск, проверку объектов, юридическое сопровождение и оформление документов. Вам не нужно вникать в сложные детали рынка и бюрократические процессы команда профессионалов заботится о каждом этапе, чтобы сэкономить ваше время и исключить риски.
</p>
<p>
АТ Голден это надёжность, прозрачность и индивидуальный подход. Мы ценим доверие наших клиентов и стремимся к тому, чтобы каждая сделка проходила максимально комфортно, уверенно и безопасно.
</p>
</div>
<UCard>
<h2 class="text-2xl font-semibold mb-2">
Наши реквизиты:
</h2>
<p>ООО «АТ Голден»</p>
<p>ИНН: 00406202010276</p>
<p>Регистрационный номер: 190962-3301-ООО</p>
<p>Адрес: г. Бишкек, Свердловский район, ул. Ибраимова, дом 115/4</p>
<a href="tel:+996700115500" class="hover:opacity-100 opacity-70">Телефон: +9 (965) 042-80-490</a>
</UCard>
<div class="flex flex-col sm:flex-row gap-4 justify-between">
<a
href="/Политикаонфиденциальности_АТолден.pdf"
target="_blank"
>
<UCard variant="subtle">
Политика конфиденциальности
</UCard>
</a>
<a
href="/Пользовательское_соглашение_АТолден.pdf"
target="_blank"
>
<UCard variant="subtle">
Пользовательское соглашение
</UCard>
</a>
</div>
</UContainer>
</template>
<script setup lang="ts">
useHead({
title: 'О нас — АТ Голден, консьерж-сервис недвижимости и автомобилей в Кыргызстане',
meta: [
{
name: 'description',
content: 'Общество с ограниченной ответственностью «АТ Голден» — современный консьерж-сервис по подбору недвижимости и автомобилей в Кыргызстане. Надёжное сопровождение сделок в Бишкеке, Оше, Джалал-Абаде, Караколе и других городах.',
},
{
name: 'keywords',
content: 'АТ Голден, консьерж-сервис, недвижимость Кыргызстан, автомобили Кыргызстан, услуги под ключ, юридическое сопровождение, безопасные сделки, Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак, Узген',
},
{
property: 'og:title',
content: 'О нас — АТ Голден, консьерж-сервис недвижимости и автомобилей в Кыргызстане',
},
{
property: 'og:description',
content: 'Общество с ограниченной ответственностью «АТ Голден» — современный консьерж-сервис по подбору недвижимости и автомобилей в Кыргызстане. Надёжное сопровождение сделок в Бишкеке, Оше, Джалал-Абаде, Караколе и других городах.',
},
],
})
</script>

View File

@@ -2,14 +2,17 @@
<div class="index-page"> <div class="index-page">
<UPageHero <UPageHero
title="Консьерж-сервис - доступный каждому" title="Консьерж-сервис - доступный каждому"
:description="`Недвижимость и авто под ключ\nМы берем на себя все заботы по поиску, проверке и оформлению недвижимости и автомобилей. Экономьте время — доверьтесь профессионалам.`" description="Недвижимость и авто под ключ в Кыргызстане. Мы берем на себя все заботы по поиску, проверке и оформлению недвижимости и автомобилей. Экономьте время — доверьтесь профессионалам."
class="index-page__hero" class="index-page__hero"
:ui="{
description: 'text-lg sm:text-xl/8 text-property',
}"
> >
<template #footer> <template #footer>
<div class="flex gap-2 place-content-center h-[48px]"> <div class="flex gap-2 place-content-center h-[48px]">
<UButton <UButton
size="xl" size="xl"
label="Узанть больше" label="Узнать больше"
href="#services" href="#services"
/> />
@@ -36,6 +39,18 @@
</div> </div>
</template> </template>
<script setup lang="ts">
useHead({
title: 'АТ Голден — доступный консьерж-сервис для авто и недвижимости в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген)',
meta: [
{ name: 'description', content: 'Поиск, проверка и оформление недвижимости и автомобилей в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген). АТ Голден — доступный консьерж-сервис, который заботится о каждом этапе сделки. Надёжно, безопасно, профессионально.' },
{ name: 'keywords', content: 'консьерж-сервис, услуги для авто, услуги для недвижимости, покупка авто, продажа авто, оформление авто, проверка авто, недвижимость Кыргызстан, покупка недвижимости, продажа недвижимости, оформление недвижимости, Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак, Узген, безопасные сделки, профессиональный сервис' },
{ property: 'og:title', content: 'АТ Голден — доступный консьерж-сервис для авто и недвижимости в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген)' },
{ property: 'og:description', content: 'Поиск, проверка и оформление недвижимости и автомобилей в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген). АТ Голден — доступный консьерж-сервис, который заботится о каждом этапе сделки. Надёжно, безопасно, профессионально.' },
],
})
</script>
<style lang="scss"> <style lang="scss">
.index-page { .index-page {
display: flex; display: flex;

View File

@@ -2,8 +2,11 @@
<div class="nedvizhimost-page"> <div class="nedvizhimost-page">
<UPageHero <UPageHero
title="Недвижимость вашей мечты" title="Недвижимость вашей мечты"
:description="`Помогаем найти, купить или продать недвижимость с полным\n юридическим сопровождением и гарантией безопасности сделки.`" description="Помогаем найти, купить или продать недвижимость с полным юридическим сопровождением и гарантией безопасности сделки в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген)."
class="nedvizhimost-page__hero" class="nedvizhimost-page__hero"
:ui="{
description: 'text-lg sm:text-xl/8 text-property',
}"
> >
<template #footer> <template #footer>
<div class="flex gap-2 place-content-center h-[48px]"> <div class="flex gap-2 place-content-center h-[48px]">
@@ -88,6 +91,22 @@ const services = [
const { cartByCategory } = useMock() const { cartByCategory } = useMock()
const previewItems = computed(() => cartByCategory('nedvizhimost')) const previewItems = computed(() => cartByCategory('nedvizhimost'))
useHead({
title: 'Недвижимость в Кыргызстане — покупка, продажа и аренда с полным сопровождением',
meta: [
{
name: 'description',
content: 'АТ Голден помогает найти, купить, продать или арендовать недвижимость в Бишкеке, Оше, Джалал-Абаде, Караколе и других городах Кыргызстана. Полное юридическое сопровождение и безопасные сделки.',
},
{
name: 'keywords',
content: 'недвижимость Кыргызстан, покупка недвижимости, продажа недвижимости, аренда жилья, коммерческая недвижимость, квартиры, дома, апартаменты, безопасные сделки, юридическая проверка, сопровождение сделок, Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак, Узген',
},
{ property: 'og:title', content: 'Недвижимость в Кыргызстане — покупка, продажа и аренда с полным сопровождением' },
{ property: 'og:description', content: 'АТ Голден помогает найти, купить, продать или арендовать недвижимость в Бишкеке, Оше, Джалал-Абаде, Караколе и других городах Кыргызстана. Полное юридическое сопровождение и безопасные сделки.' },
],
})
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@@ -25,12 +25,16 @@
<p>{{ cart?.title }}</p> <p>{{ cart?.title }}</p>
<div> <div>
<p>Описание:</p> <p>Описание:</p>
<p>{{ cart?.description }}</p> <p class="whitespace-pre-line" v-html="cart?.description" />
</div> </div>
<MapView v-if="cart?.coordinates" :marker="marker" /> <MapView v-if="cart?.coordinates" :marker="marker" />
<MainCarusel title="Похожие варианты" :preview-items="previewItems" />
<Contacts /> <Contacts />
<BaseFooter />
</div> </div>
</template> </template>
</UDrawer> </UDrawer>
@@ -43,13 +47,37 @@
<Gallery :preview-image="cart?.previewImage" :images="cart?.images" /> <Gallery :preview-image="cart?.previewImage" :images="cart?.images" />
<div> <div ref="descriptionRef" class="post-page__description">
Описание: <div>
<p>{{ cart?.description }}</p> Описание:
<p class="whitespace-pre-line" v-html="cart?.description" />
</div>
<UCard
variant="subtle"
class="post-page__action"
title="Action"
>
<div>
Хотите узнать больше или оформить бронирование?<br>
Напишите нам мы с удовольствием подскажем всё, что нужно.
</div>
<template #footer>
<UButton
class="w-full flex justify-center"
href="#contacts"
size="xl"
label="Свяжитесь с нами"
/>
</template>
</UCard>
</div> </div>
<MapView v-if="cart?.coordinates" :marker="marker" /> <MapView v-if="cart?.coordinates" :marker="marker" />
<MainCarusel title="Похожие варианты" :preview-items="previewItems" />
<Contacts /> <Contacts />
</div> </div>
</UContainer> </UContainer>
@@ -62,6 +90,7 @@ import { computed, shallowRef } from 'vue'
import Gallery from '~/components/Gallery.vue' import Gallery from '~/components/Gallery.vue'
const open = ref(false) const open = ref(false)
const descriptionRef = shallowRef<HTMLElement | null>(null)
const target = shallowRef<HTMLElement | null>(null) const target = shallowRef<HTMLElement | null>(null)
const targetHeight = computed(() => target.value?.offsetHeight) const targetHeight = computed(() => target.value?.offsetHeight)
const targetDrawer = shallowRef<HTMLElement | null>(null) const targetDrawer = shallowRef<HTMLElement | null>(null)
@@ -69,14 +98,17 @@ const targetDrawerHeight = computed(() => targetDrawer.value?.offsetHeight)
const { y } = useScroll(targetDrawer) const { y } = useScroll(targetDrawer)
const isMobile = useMediaQuery('(max-width: 1024px)') const isMobile = useMediaQuery('(max-width: 1024px)')
const route = useRoute() const route = useRoute()
const showContactBar = useState('showContactBar')
const { cartById } = useMock() const { cartById, cartByCategory } = useMock()
const cart = cartById(route.params.id) const cart = cartById(route.params.id)
const marker = computed(() => ({ const marker = computed(() => ({
coordinates: cart?.coordinates ?? [0, 0], coordinates: cart?.coordinates ?? [0, 0],
subtitle: cart?.address, subtitle: cart?.address,
})) }))
const previewItems = computed(() => cartByCategory(cart?.category))
const { lengthY } = useSwipe( const { lengthY } = useSwipe(
target, target,
{ {
@@ -106,16 +138,57 @@ definePageMeta({
}) })
onMounted(() => { onMounted(() => {
const el = descriptionRef.value
if (!el)
return
const observer = new IntersectionObserver(
(entries) => {
const entry = entries[0]
showContactBar.value = !entry.isIntersecting
},
{
threshold: 0.1,
},
)
observer.observe(el)
if (isMobile.value) { if (isMobile.value) {
document.body.style.overflow = 'hidden' document.body.style.overflow = 'hidden'
} }
}) })
onUnmounted(() => { onUnmounted(() => {
showContactBar.value = false
if (isMobile.value) { if (isMobile.value) {
document.body.style.overflow = '' document.body.style.overflow = ''
} }
}) })
useHead({
title: `${cart?.title} — подробная информация и услуги от АТ Голден`,
meta: [
{
name: 'description',
content: `${cart?.title} доступен через АТ Голден. ${cart?.description.replace(/<[^>]+(>|$)/g, '').slice(0, 160)}. Полное сопровождение сделки, юридическая проверка и безопасное оформление.`,
},
{
name: 'keywords',
content: `${cart?.category}, ${cart?.title}, аренда ${cart?.category}, покупка ${cart?.category}, продажа ${cart?.category}, проверка документов, безопасная сделка, АТ Голден, Кыргызстан, Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак, Узген`,
},
{
property: 'og:title',
content: `${cart?.title} — подробная информация и услуги от АТ Голден`,
},
{
property: 'og:description',
content: `${cart?.title} доступен через АТ Голден. ${cart?.description.replace(/<[^>]+(>|$)/g, '').slice(0, 160)}. Полное сопровождение сделки, юридическая проверка и безопасное оформление.`,
},
],
})
</script> </script>
<style lang="scss"> <style lang="scss">
@@ -124,7 +197,7 @@ onUnmounted(() => {
margin-top: calc(64px + 26px); margin-top: calc(64px + 26px);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 24px;
@include mobile { @include mobile {
margin-top: 0; margin-top: 0;
@@ -159,5 +232,22 @@ onUnmounted(() => {
gap: 16px; gap: 16px;
} }
} }
&__description {
flex-shrink: 1;
position: relative;
display: flex;
flex-direction: row;
gap: 20px;
justify-content: space-between;
}
&__action {
height: fit-content;
flex-shrink: 0;
position: sticky;
top: calc(64px + 26px);
width: 300px;
}
} }
</style> </style>

View File

@@ -2,8 +2,11 @@
<div class="transport-page"> <div class="transport-page">
<UPageHero <UPageHero
title="Премиум автомобили под ключ" title="Премиум автомобили под ключ"
:description="`Аренда, покупка и продажа автомобилей премиум-класса с полным\n сервисным сопровождением и гарантией качества.`" description="Аренда, покупка и продажа автомобилей премиум-класса с полным сервисным сопровождением и гарантией качества в Кыргызстане (Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак и Узген)."
class="transport-page__hero" class="transport-page__hero"
:ui="{
description: 'text-lg sm:text-xl/8 text-property',
}"
> >
<template #footer> <template #footer>
<div class="flex gap-2 place-content-center h-[48px]"> <div class="flex gap-2 place-content-center h-[48px]">
@@ -84,6 +87,26 @@ const services = [
const { cartByCategory } = useMock() const { cartByCategory } = useMock()
const previewItems = computed(() => cartByCategory('transport')) const previewItems = computed(() => cartByCategory('transport'))
useHead({
title: 'Премиум автомобили в Кыргызстане — аренда, покупка и продажа с полным сопровождением',
meta: [
{
name: 'description',
content: 'АТ Голден предлагает аренду, покупку и продажу автомобилей премиум-класса в Бишкеке, Оше, Джалал-Абаде, Караколе и других городах Кыргызстана. Полное сервисное сопровождение, юридическая проверка и безопасность сделок.',
},
{
name: 'keywords',
content: 'автомобили премиум-класса, аренда авто, краткосрочная аренда, долгосрочная аренда, покупка автомобиля, продажа автомобиля, проверка юридической чистоты, техническая экспертиза, безопасные сделки, сопровождение сделки, доставка авто, страховка авто, Бишкек, Ош, Джалал-Абад, Каракол, Балыкчы, Талас, Токмак, Узген',
},
{ property: 'og:title', content: 'Премиум автомобили в Кыргызстане — аренда, покупка и продажа с полным сопровождением' },
{ property: 'og:description', content: 'АТ Голден предлагает аренду, покупку и продажу автомобилей премиум-класса в Бишкеке, Оше, Джалал-Абаде, Караколе и других городах Кыргызстана. Полное сервисное сопровождение, юридическая проверка и безопасность сделок.' },
],
})
definePageMeta({
layout: 'default',
})
</script> </script>
<style lang="scss"> <style lang="scss">

BIN
public/alla_1.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
public/alla_10.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
public/alla_11.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
public/alla_12.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
public/alla_13.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
public/alla_14.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
public/alla_15.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
public/alla_16.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
public/alla_17.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
public/alla_18.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
public/alla_19.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
public/alla_2.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
public/alla_3.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
public/alla_4.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
public/alla_5.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
public/alla_6.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
public/alla_7.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
public/alla_8.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
public/alla_9.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

BIN
public/archa_1.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

BIN
public/archa_10.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
public/archa_11.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
public/archa_2.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
public/archa_3.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

BIN
public/archa_4.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
public/archa_5.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
public/archa_6.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
public/archa_7.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

BIN
public/archa_8.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
public/archa_9.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
public/bbbenz_1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

BIN
public/bbbenz_2.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

BIN
public/bbbenz_3.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

BIN
public/bbbenz_4.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

BIN
public/bbbenz_5.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
public/bbbenz_6.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
public/bbbenz_7.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
public/bbbenz_8.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

BIN
public/bmb6_1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
public/bmb6_10.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

BIN
public/bmb6_11.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
public/bmb6_12.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
public/bmb6_13.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

BIN
public/bmb6_2.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
public/bmb6_3.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
public/bmb6_4.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
public/bmb6_5.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
public/bmb6_6.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
public/bmb6_7.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

BIN
public/bmb6_8.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
public/bmb6_9.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
public/bmv888_1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
public/bmv888_10.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
public/bmv888_11.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

BIN
public/bmv888_2.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

BIN
public/bmv888_3.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

BIN
public/bmv888_4.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
public/bmv888_5.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Some files were not shown because too many files have changed in this diff Show More