Compare commits

..

16 Commits

Author SHA1 Message Date
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
alsaze
3c4ec7aada init
All checks were successful
Deploy / build (push) Successful in 2m27s
2025-12-04 14:45:37 +03:00
alsaze
faf95ec89c init 2025-12-04 13:45:18 +03:00
alsaze
0901ac574c init 2025-12-04 13:37:16 +03:00
182 changed files with 4312 additions and 566 deletions

13
.env
View File

@@ -1,2 +1,15 @@
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_APP_PASSWORD=uljislsoihthciju
# This was inserted by `prisma init`:
# Environment variables declared in this file are NOT automatically loaded by Prisma.
# Please add `import "dotenv/config";` to your `prisma.config.ts` file, or use the Prisma CLI with Bun
# to load environment variables from .env files: https://pris.ly/prisma-config-env-vars.
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
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

@@ -13,6 +13,9 @@ COPY --from=build /app/.output/ ./
ENV PORT=80 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_APP_PASSWORD=uljislsoihthciju
EXPOSE 80 EXPOSE 80

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");
}

55
components/BaseFooter.vue Normal file
View File

@@ -0,0 +1,55 @@
<template>
<UFooter
class="border-t border-gray-200 mt-10"
:ui="{
center: 'w-full',
}"
>
<div class="w-full py-6 grid grid-cols-1 md:grid-cols-3 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:+74951234567" class="hover:opacity-100 opacity-70">
+7 (495) 123-45-67
</a>
</li>
<li>
<span class="font-medium">Email:</span><br>
<a href="mailto:info@rental-concierge.com" class="hover:opacity-100 opacity-70">
info@rental-concierge.com
</a>
</li>
<li>
<span class="font-medium">Адрес:</span><br>
Москва, Тверская улица, 1
</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>
</ul>
</div>
<div class="md:text-right opacity-70 flex flex-col justify-between">
<div class="text-lg font-bold">
Rental
</div>
<div class="mt-4 md:mt-0">
© {{ new Date().getFullYear() }} Rental.
Все права защищены.
</div>
</div>
</div>
</UFooter>
</template>

View File

@@ -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>
@@ -43,9 +43,7 @@
</div> </div>
<UCard variant="subtle" class="w-full" :ui="{ root: 'max-w-[500px]' }"> <UCard variant="subtle" class="w-full" :ui="{ root: 'max-w-[500px]' }">
<form name="contacts" method="POST" netlify @submit.prevent="onSubmit"> <form name="contacts" method="POST" @submit.prevent="onSubmit">
<input type="hidden" name="form-name" value="contacts">
<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">
Как к вам обращаться Как к вам обращаться
@@ -94,6 +92,8 @@
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">
@@ -133,6 +133,7 @@
<script setup lang="ts"> <script setup lang="ts">
const toast = useToast() const toast = useToast()
const route = useRoute()
const contacts = [ const contacts = [
{ {
@@ -201,20 +202,19 @@ const [service, serviceAttrs] = defineField('service')
const [comment, commentAttrs] = defineField('comment') const [comment, commentAttrs] = defineField('comment')
const onSubmit = handleSubmit(async (values) => { const onSubmit = handleSubmit(async (values) => {
const payload = new FormData() const res = await $fetch('/api/send_mail', {
payload.append('form-name', 'contacts')
Object.entries(values).forEach(([key, value]) => {
payload.append(key, value as any)
})
await fetch('/', {
method: 'POST', method: 'POST',
body: payload, body: {
...values,
route: route.path,
},
}) })
if (res.ok) {
toast.add({ toast.add({
title: 'Заявка успешно отправлена!', title: 'Заявка успешно отправлена!',
}) })
}
}) })
</script> </script>

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"
>
<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> </div>
</UCarousel> <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 {
position: relative;
cursor: pointer; cursor: pointer;
height: 100%;
img { img {
border-radius: 12px; border-radius: 12px;
height: 300px; height: 300px;
width: 100%;
object-fit: cover; object-fit: cover;
} }
}
&__text-slide {
height: 300px;
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>
<div>
<h2>Где вы будете жить</h2> <h2>Где вы будете жить</h2>
<p>{{ marker.subtitle }}</p> <p>{{ marker.subtitle }}</p>
</div>
<YandexMap <YandexMap
:settings="{ location }" :settings="{ location }"

File diff suppressed because it is too large Load Diff

BIN
database.db Normal file

Binary file not shown.

View File

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

View File

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

View File

@@ -5,7 +5,7 @@
: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',
}" }"
@@ -16,6 +16,16 @@
<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">
Rental Rental
</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 +33,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 +56,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

@@ -1,5 +1,6 @@
<template> <template>
<div class="layout"> <div class="layout">
<ClientOnly>
<UHeader <UHeader
title="Rental" title="Rental"
:toggle="false" :toggle="false"
@@ -11,37 +12,34 @@
}" }"
> >
<template #left> <template #left>
<div class="text-lg"> <NuxtLink to="/" class="text-lg">
Rental Rental
</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="#contacts" :size="isMobile ? 'md' : 'xl'" label="Связаться" />
</div> </div>
</template> </template>
</UHeader> </UHeader>
</ClientOnly>
<UMain> <UMain>
<slot /> <slot />
</UMain> </UMain>
<UFooter> <BaseFooter />
<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 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'
const isMobile = useMediaQuery('(max-width: 1280px)') const isMobile = useMediaQuery('(max-width: 1280px)')
@@ -83,6 +81,6 @@ watch(() => route?.path, () => {
return return
} }
activeTab.value = routerPath activeTab.value = routerPath || '/'
}) })
</script> </script>

View File

@@ -5,7 +5,7 @@ import { process } from 'std-env'
const { resolve } = createResolver(import.meta.url) const { resolve } = createResolver(import.meta.url)
export default defineNuxtConfig({ export default defineNuxtConfig({
ssr: false, ssr: true,
compatibilityDate: '2025-05-15', compatibilityDate: '2025-05-15',
devtools: { enabled: true }, devtools: { enabled: true },
modules: [ modules: [
@@ -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'],
}, },

View File

@@ -14,20 +14,28 @@
}, },
"dependencies": { "dependencies": {
"@nuxt/content": "^3.7.1", "@nuxt/content": "^3.7.1",
"gsap": "3.13",
"@nuxt/fonts": "0.11.4", "@nuxt/fonts": "0.11.4",
"@nuxt/icon": "1.15.0", "@nuxt/icon": "1.15.0",
"@nuxt/image": "1.10.0", "@nuxt/image": "1.10.0",
"@nuxt/ui": "^4.0.1", "@nuxt/ui": "^4.0.1",
"@nuxtjs/i18n": "^10.0.4", "@nuxtjs/i18n": "^10.0.4",
"@prisma/adapter-better-sqlite3": "^7.1.0",
"@prisma/adapter-libsql": "^7.1.0",
"@prisma/client": "^7.1.0",
"@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",
"maska": "^3.2.0", "maska": "^3.2.0",
"nodemailer": "^7.0.11",
"nuxt": "^4.1.3", "nuxt": "^4.1.3",
"prisma": "^7.1.0",
"swiper": "^12.0.2", "swiper": "^12.0.2",
"typescript": "^5.6.3", "typescript": "^5.6.3",
"vue": "^3.5.17", "vue": "^3.5.17",

View File

@@ -36,6 +36,12 @@
</div> </div>
</template> </template>
<script setup lang="ts">
useHead({
title: 'Rental - консьерж-сервис',
})
</script>
<style lang="scss"> <style lang="scss">
.index-page { .index-page {
display: flex; display: flex;

View File

@@ -88,6 +88,10 @@ const services = [
const { cartByCategory } = useMock() const { cartByCategory } = useMock()
const previewItems = computed(() => cartByCategory('nedvizhimost')) const previewItems = computed(() => cartByCategory('nedvizhimost'))
useHead({
title: 'Rental - недвижимость',
})
</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 ref="descriptionRef" class="post-page__description">
<div> <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,39 @@ 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: `Rental - ${cart?.title}`,
})
</script> </script>
<style lang="scss"> <style lang="scss">
@@ -124,7 +179,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 +214,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

@@ -84,6 +84,10 @@ const services = [
const { cartByCategory } = useMock() const { cartByCategory } = useMock()
const previewItems = computed(() => cartByCategory('transport')) const previewItems = computed(() => cartByCategory('transport'))
useHead({
title: 'Rental - автомобили',
})
</script> </script>
<style lang="scss"> <style lang="scss">

14
prisma.config.ts Normal file
View File

@@ -0,0 +1,14 @@
import { defineConfig, env } from 'prisma/config'
// This file was generated by Prisma and assumes you have installed the following:
// npm install --save-dev prisma dotenv
import 'dotenv/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
})

View File

@@ -0,0 +1,24 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file should be your main import to use Prisma-related types and utilities in a browser.
* Use it to get access to models, enums, and input types.
*
* This file does not contain a `PrismaClient` class, nor several other helpers that are intended as server-side only.
* See `client.ts` for the standard, server-side entry point.
*
* 🟢 You can import this file directly.
*/
import * as Prisma from './internal/prismaNamespaceBrowser'
export { Prisma }
export * as $Enums from './enums'
export * from './enums';
/**
* Model User
*
*/
export type User = Prisma.UserModel

View File

@@ -0,0 +1,46 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.
* If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.
*
* 🟢 You can import this file directly.
*/
import * as process from 'node:process'
import * as path from 'node:path'
import { fileURLToPath } from 'node:url'
globalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))
import * as runtime from "@prisma/client/runtime/client"
import * as $Enums from "./enums"
import * as $Class from "./internal/class"
import * as Prisma from "./internal/prismaNamespace"
export * as $Enums from './enums'
export * from "./enums"
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient()
* // Fetch zero or more Users
* const users = await prisma.user.findMany()
* ```
*
* Read more in our [docs](https://pris.ly/d/client).
*/
export const PrismaClient = $Class.getPrismaClientClass()
export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>
export { Prisma }
/**
* Model User
*
*/
export type User = Prisma.UserModel

View File

@@ -0,0 +1,272 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file exports various common sort, input & filter types that are not directly linked to a particular model.
*
* 🟢 You can import this file directly.
*/
import type * as runtime from "@prisma/client/runtime/client"
import * as $Enums from "./enums"
import type * as Prisma from "./internal/prismaNamespace"
export type IntFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[]
notIn?: number[]
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntFilter<$PrismaModel> | number
}
export type StringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[]
notIn?: string[]
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringFilter<$PrismaModel> | string
}
export type StringNullableFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | null
notIn?: string[] | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null
}
export type DateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[]
notIn?: Date[] | string[]
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string
}
export type SortOrderInput = {
sort: Prisma.SortOrder
nulls?: Prisma.NullsOrder
}
export type IntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[]
notIn?: number[]
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntWithAggregatesFilter<$PrismaModel> | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedIntFilter<$PrismaModel>
_max?: Prisma.NestedIntFilter<$PrismaModel>
}
export type StringWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[]
notIn?: string[]
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type StringNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | null
notIn?: string[] | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringNullableWithAggregatesFilter<$PrismaModel> | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedStringNullableFilter<$PrismaModel>
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
}
export type DateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[]
notIn?: Date[] | string[]
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type NestedIntFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[]
notIn?: number[]
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntFilter<$PrismaModel> | number
}
export type NestedStringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[]
notIn?: string[]
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringFilter<$PrismaModel> | string
}
export type NestedStringNullableFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | null
notIn?: string[] | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null
}
export type NestedDateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[]
notIn?: Date[] | string[]
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string
}
export type NestedIntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[]
notIn?: number[]
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntWithAggregatesFilter<$PrismaModel> | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedIntFilter<$PrismaModel>
_max?: Prisma.NestedIntFilter<$PrismaModel>
}
export type NestedFloatFilter<$PrismaModel = never> = {
equals?: number | Prisma.FloatFieldRefInput<$PrismaModel>
in?: number[]
notIn?: number[]
lt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
lte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
not?: Prisma.NestedFloatFilter<$PrismaModel> | number
}
export type NestedStringWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[]
notIn?: string[]
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | null
notIn?: string[] | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringNullableWithAggregatesFilter<$PrismaModel> | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedStringNullableFilter<$PrismaModel>
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
}
export type NestedIntNullableFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
in?: number[] | null
notIn?: number[] | null
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null
}
export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[]
notIn?: Date[] | string[]
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}

15
prisma/generated/enums.ts Normal file
View File

@@ -0,0 +1,15 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file exports all enum related types from the schema.
*
* 🟢 You can import this file directly.
*/
// This file is empty because there are no enums in the schema.
export {}

View File

@@ -0,0 +1,190 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* Please import the `PrismaClient` class from the `client.ts` file instead.
*/
import * as runtime from "@prisma/client/runtime/client"
import type * as Prisma from "./prismaNamespace"
const config: runtime.GetPrismaClientConfig = {
"previewFeatures": [],
"clientVersion": "7.1.0",
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
"activeProvider": "sqlite",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n phone String\n service String?\n comment String?\n route String?\n createdAt DateTime @default(now())\n}\n",
"runtimeDataModel": {
"models": {},
"enums": {},
"types": {}
}
}
config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"service\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"comment\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"route\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
const { Buffer } = await import('node:buffer')
const wasmArray = Buffer.from(wasmBase64, 'base64')
return new WebAssembly.Module(wasmArray)
}
config.compilerWasm = {
getRuntime: async () => await import("@prisma/client/runtime/query_compiler_bg.sqlite.mjs"),
getQueryCompilerWasmModule: async () => {
const { wasm } = await import("@prisma/client/runtime/query_compiler_bg.sqlite.wasm-base64.mjs")
return await decodeBase64AsWasm(wasm)
}
}
export type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =
'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never
export interface PrismaClientConstructor {
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient()
* // Fetch zero or more Users
* const users = await prisma.user.findMany()
* ```
*
* Read more in our [docs](https://pris.ly/d/client).
*/
new <
Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,
LogOpts extends LogOptions<Options> = LogOptions<Options>,
OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],
ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs
>(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>
}
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient()
* // Fetch zero or more Users
* const users = await prisma.user.findMany()
* ```
*
* Read more in our [docs](https://pris.ly/d/client).
*/
export interface PrismaClient<
in LogOpts extends Prisma.LogLevel = never,
in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,
in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs
> {
[K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }
$on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;
/**
* Connect with the database
*/
$connect(): runtime.Types.Utils.JsPromise<void>;
/**
* Disconnect from the database
*/
$disconnect(): runtime.Types.Utils.JsPromise<void>;
/**
* Executes a prepared raw query and returns the number of affected rows.
* @example
* ```
* const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`
* ```
*
* Read more in our [docs](https://pris.ly/d/raw-queries).
*/
$executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;
/**
* Executes a raw query and returns the number of affected rows.
* Susceptible to SQL injections, see documentation.
* @example
* ```
* const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')
* ```
*
* Read more in our [docs](https://pris.ly/d/raw-queries).
*/
$executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;
/**
* Performs a prepared raw query and returns the `SELECT` data.
* @example
* ```
* const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`
* ```
*
* Read more in our [docs](https://pris.ly/d/raw-queries).
*/
$queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;
/**
* Performs a raw query and returns the `SELECT` data.
* Susceptible to SQL injections, see documentation.
* @example
* ```
* const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')
* ```
*
* Read more in our [docs](https://pris.ly/d/raw-queries).
*/
$queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;
/**
* Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.
* @example
* ```
* const [george, bob, alice] = await prisma.$transaction([
* prisma.user.create({ data: { name: 'George' } }),
* prisma.user.create({ data: { name: 'Bob' } }),
* prisma.user.create({ data: { name: 'Alice' } }),
* ])
* ```
*
* Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).
*/
$transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>
$transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>
$extends: runtime.Types.Extensions.ExtendsHook<"extends", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {
extArgs: ExtArgs
}>>
/**
* `prisma.user`: Exposes CRUD operations for the **User** model.
* Example usage:
* ```ts
* // Fetch zero or more Users
* const users = await prisma.user.findMany()
* ```
*/
get user(): Prisma.UserDelegate<ExtArgs, { omit: OmitOpts }>;
}
export function getPrismaClientClass(): PrismaClientConstructor {
return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor
}

View File

@@ -0,0 +1,737 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.
* While this enables partial backward compatibility, it is not part of the stable public API.
*
* If you are looking for your Models, Enums, and Input Types, please import them from the respective
* model files in the `model` directory!
*/
import * as runtime from "@prisma/client/runtime/client"
import type * as Prisma from "../models"
import { type PrismaClient } from "./class"
export type * from '../models'
export type DMMF = typeof runtime.DMMF
export type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>
/**
* Prisma Errors
*/
export const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError
export type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError
export const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError
export type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError
export const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError
export type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError
export const PrismaClientInitializationError = runtime.PrismaClientInitializationError
export type PrismaClientInitializationError = runtime.PrismaClientInitializationError
export const PrismaClientValidationError = runtime.PrismaClientValidationError
export type PrismaClientValidationError = runtime.PrismaClientValidationError
/**
* Re-export of sql-template-tag
*/
export const sql = runtime.sqltag
export const empty = runtime.empty
export const join = runtime.join
export const raw = runtime.raw
export const Sql = runtime.Sql
export type Sql = runtime.Sql
/**
* Decimal.js
*/
export const Decimal = runtime.Decimal
export type Decimal = runtime.Decimal
export type DecimalJsLike = runtime.DecimalJsLike
/**
* Extensions
*/
export type Extension = runtime.Types.Extensions.UserArgs
export const getExtensionContext = runtime.Extensions.getExtensionContext
export type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>
export type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>
export type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>
export type Exact<A, W> = runtime.Types.Public.Exact<A, W>
export type PrismaVersion = {
client: string
engine: string
}
/**
* Prisma Client JS version: 7.1.0
* Query Engine version: ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba
*/
export const prismaVersion: PrismaVersion = {
client: "7.1.0",
engine: "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba"
}
/**
* Utility Types
*/
export type Bytes = runtime.Bytes
export type JsonObject = runtime.JsonObject
export type JsonArray = runtime.JsonArray
export type JsonValue = runtime.JsonValue
export type InputJsonObject = runtime.InputJsonObject
export type InputJsonArray = runtime.InputJsonArray
export type InputJsonValue = runtime.InputJsonValue
export const NullTypes = {
DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),
JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),
AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),
}
/**
* Helper for filtering JSON entries that have `null` on the database (empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const DbNull = runtime.DbNull
/**
* Helper for filtering JSON entries that have JSON `null` values (not empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const JsonNull = runtime.JsonNull
/**
* Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const AnyNull = runtime.AnyNull
type SelectAndInclude = {
select: any
include: any
}
type SelectAndOmit = {
select: any
omit: any
}
/**
* From T, pick a set of properties whose keys are in the union K
*/
type Prisma__Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
export type Enumerable<T> = T | Array<T>;
/**
* Subset
* @desc From `T` pick properties that exist in `U`. Simple version of Intersection
*/
export type Subset<T, U> = {
[key in keyof T]: key extends keyof U ? T[key] : never;
};
/**
* SelectSubset
* @desc From `T` pick properties that exist in `U`. Simple version of Intersection.
* Additionally, it validates, if both select and include are present. If the case, it errors.
*/
export type SelectSubset<T, U> = {
[key in keyof T]: key extends keyof U ? T[key] : never
} &
(T extends SelectAndInclude
? 'Please either choose `select` or `include`.'
: T extends SelectAndOmit
? 'Please either choose `select` or `omit`.'
: {})
/**
* Subset + Intersection
* @desc From `T` pick properties that exist in `U` and intersect `K`
*/
export type SubsetIntersection<T, U, K> = {
[key in keyof T]: key extends keyof U ? T[key] : never
} &
K
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
/**
* XOR is needed to have a real mutually exclusive union type
* https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types
*/
export type XOR<T, U> =
T extends object ?
U extends object ?
(Without<T, U> & U) | (Without<U, T> & T)
: U : T
/**
* Is T a Record?
*/
type IsObject<T extends any> = T extends Array<any>
? False
: T extends Date
? False
: T extends Uint8Array
? False
: T extends BigInt
? False
: T extends object
? True
: False
/**
* If it's T[], return T
*/
export type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T
/**
* From ts-toolbelt
*/
type __Either<O extends object, K extends Key> = Omit<O, K> &
{
// Merge all but K
[P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities
}[K]
type EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>
type EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>
type _Either<
O extends object,
K extends Key,
strict extends Boolean
> = {
1: EitherStrict<O, K>
0: EitherLoose<O, K>
}[strict]
export type Either<
O extends object,
K extends Key,
strict extends Boolean = 1
> = O extends unknown ? _Either<O, K, strict> : never
export type Union = any
export type PatchUndefined<O extends object, O1 extends object> = {
[K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]
} & {}
/** Helper Types for "Merge" **/
export type IntersectOf<U extends Union> = (
U extends unknown ? (k: U) => void : never
) extends (k: infer I) => void
? I
: never
export type Overwrite<O extends object, O1 extends object> = {
[K in keyof O]: K extends keyof O1 ? O1[K] : O[K];
} & {};
type _Merge<U extends object> = IntersectOf<Overwrite<U, {
[K in keyof U]-?: At<U, K>;
}>>;
type Key = string | number | symbol;
type AtStrict<O extends object, K extends Key> = O[K & keyof O];
type AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;
export type At<O extends object, K extends Key, strict extends Boolean = 1> = {
1: AtStrict<O, K>;
0: AtLoose<O, K>;
}[strict];
export type ComputeRaw<A extends any> = A extends Function ? A : {
[K in keyof A]: A[K];
} & {};
export type OptionalFlat<O> = {
[K in keyof O]?: O[K];
} & {};
type _Record<K extends keyof any, T> = {
[P in K]: T;
};
// cause typescript not to expand types and preserve names
type NoExpand<T> = T extends unknown ? T : never;
// this type assumes the passed object is entirely optional
export type AtLeast<O extends object, K extends string> = NoExpand<
O extends unknown
? | (K extends keyof O ? { [P in K]: O[P] } & O : O)
| {[P in keyof O as P extends K ? P : never]-?: O[P]} & O
: never>;
type _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;
export type Strict<U extends object> = ComputeRaw<_Strict<U>>;
/** End Helper Types for "Merge" **/
export type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;
export type Boolean = True | False
export type True = 1
export type False = 0
export type Not<B extends Boolean> = {
0: 1
1: 0
}[B]
export type Extends<A1 extends any, A2 extends any> = [A1] extends [never]
? 0 // anything `never` is false
: A1 extends A2
? 1
: 0
export type Has<U extends Union, U1 extends Union> = Not<
Extends<Exclude<U1, U>, U1>
>
export type Or<B1 extends Boolean, B2 extends Boolean> = {
0: {
0: 0
1: 1
}
1: {
0: 1
1: 1
}
}[B1][B2]
export type Keys<U extends Union> = U extends unknown ? keyof U : never
export type GetScalarType<T, O> = O extends object ? {
[P in keyof T]: P extends keyof O
? O[P]
: never
} : never
type FieldPaths<
T,
U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>
> = IsObject<T> extends True ? U : T
export type GetHavingFields<T> = {
[K in keyof T]: Or<
Or<Extends<'OR', K>, Extends<'AND', K>>,
Extends<'NOT', K>
> extends True
? // infer is only needed to not hit TS limit
// based on the brilliant idea of Pierre-Antoine Mills
// https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437
T[K] extends infer TK
? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>
: never
: {} extends FieldPaths<T[K]>
? never
: K
}[keyof T]
/**
* Convert tuple to union
*/
type _TupleToUnion<T> = T extends (infer E)[] ? E : never
type TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>
export type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T
/**
* Like `Pick`, but additionally can also accept an array of keys
*/
export type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>
/**
* Exclude all keys with underscores
*/
export type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T
export type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>
type FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>
export const ModelName = {
User: 'User'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
export interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {
returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>
}
export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {
globalOmitOptions: {
omit: GlobalOmitOptions
}
meta: {
modelProps: "user"
txIsolationLevel: TransactionIsolationLevel
}
model: {
User: {
payload: Prisma.$UserPayload<ExtArgs>
fields: Prisma.UserFieldRefs
operations: {
findUnique: {
args: Prisma.UserFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null
}
findUniqueOrThrow: {
args: Prisma.UserFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>
}
findFirst: {
args: Prisma.UserFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null
}
findFirstOrThrow: {
args: Prisma.UserFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>
}
findMany: {
args: Prisma.UserFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]
}
create: {
args: Prisma.UserCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>
}
createMany: {
args: Prisma.UserCreateManyArgs<ExtArgs>
result: BatchPayload
}
createManyAndReturn: {
args: Prisma.UserCreateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]
}
delete: {
args: Prisma.UserDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>
}
update: {
args: Prisma.UserUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>
}
deleteMany: {
args: Prisma.UserDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.UserUpdateManyArgs<ExtArgs>
result: BatchPayload
}
updateManyAndReturn: {
args: Prisma.UserUpdateManyAndReturnArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]
}
upsert: {
args: Prisma.UserUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>
}
aggregate: {
args: Prisma.UserAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateUser>
}
groupBy: {
args: Prisma.UserGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.UserGroupByOutputType>[]
}
count: {
args: Prisma.UserCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.UserCountAggregateOutputType> | number
}
}
}
}
} & {
other: {
payload: any
operations: {
$executeRaw: {
args: [query: TemplateStringsArray | Sql, ...values: any[]],
result: any
}
$executeRawUnsafe: {
args: [query: string, ...values: any[]],
result: any
}
$queryRaw: {
args: [query: TemplateStringsArray | Sql, ...values: any[]],
result: any
}
$queryRawUnsafe: {
args: [query: string, ...values: any[]],
result: any
}
}
}
}
/**
* Enums
*/
export const TransactionIsolationLevel = runtime.makeStrictEnum({
Serializable: 'Serializable'
} as const)
export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]
export const UserScalarFieldEnum = {
id: 'id',
name: 'name',
phone: 'phone',
service: 'service',
comment: 'comment',
route: 'route',
createdAt: 'createdAt'
} as const
export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'
} as const
export type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]
export const NullsOrder = {
first: 'first',
last: 'last'
} as const
export type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]
/**
* Field references
*/
/**
* Reference to a field of type 'Int'
*/
export type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>
/**
* Reference to a field of type 'String'
*/
export type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>
/**
* Reference to a field of type 'DateTime'
*/
export type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>
/**
* Reference to a field of type 'Float'
*/
export type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>
/**
* Batch Payload for updateMany & deleteMany & createMany
*/
export type BatchPayload = {
count: number
}
export const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<"define", TypeMapCb, runtime.Types.Extensions.DefaultArgs>
export type DefaultPrismaClient = PrismaClient
export type ErrorFormat = 'pretty' | 'colorless' | 'minimal'
export type PrismaClientOptions = ({
/**
* Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.
*/
adapter: runtime.SqlDriverAdapterFactory
accelerateUrl?: never
} | {
/**
* Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.
*/
accelerateUrl: string
adapter?: never
}) & {
/**
* @default "colorless"
*/
errorFormat?: ErrorFormat
/**
* @example
* ```
* // Shorthand for `emit: 'stdout'`
* log: ['query', 'info', 'warn', 'error']
*
* // Emit as events only
* log: [
* { emit: 'event', level: 'query' },
* { emit: 'event', level: 'info' },
* { emit: 'event', level: 'warn' }
* { emit: 'event', level: 'error' }
* ]
*
* / Emit as events and log to stdout
* og: [
* { emit: 'stdout', level: 'query' },
* { emit: 'stdout', level: 'info' },
* { emit: 'stdout', level: 'warn' }
* { emit: 'stdout', level: 'error' }
*
* ```
* Read more in our [docs](https://pris.ly/d/logging).
*/
log?: (LogLevel | LogDefinition)[]
/**
* The default values for transactionOptions
* maxWait ?= 2000
* timeout ?= 5000
*/
transactionOptions?: {
maxWait?: number
timeout?: number
isolationLevel?: TransactionIsolationLevel
}
/**
* Global configuration for omitting model fields by default.
*
* @example
* ```
* const prisma = new PrismaClient({
* omit: {
* user: {
* password: true
* }
* }
* })
* ```
*/
omit?: GlobalOmitConfig
/**
* SQL commenter plugins that add metadata to SQL queries as comments.
* Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/
*
* @example
* ```
* const prisma = new PrismaClient({
* adapter,
* comments: [
* traceContext(),
* queryInsights(),
* ],
* })
* ```
*/
comments?: runtime.SqlCommenterPlugin[]
}
export type GlobalOmitConfig = {
user?: Prisma.UserOmit
}
/* Types for Logging */
export type LogLevel = 'info' | 'query' | 'warn' | 'error'
export type LogDefinition = {
level: LogLevel
emit: 'stdout' | 'event'
}
export type CheckIsLogLevel<T> = T extends LogLevel ? T : never;
export type GetLogType<T> = CheckIsLogLevel<
T extends LogDefinition ? T['level'] : T
>;
export type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>
? GetLogType<T[number]>
: never;
export type QueryEvent = {
timestamp: Date
query: string
params: string
duration: number
target: string
}
export type LogEvent = {
timestamp: Date
message: string
target: string
}
/* End Types for Logging */
export type PrismaAction =
| 'findUnique'
| 'findUniqueOrThrow'
| 'findMany'
| 'findFirst'
| 'findFirstOrThrow'
| 'create'
| 'createMany'
| 'createManyAndReturn'
| 'update'
| 'updateMany'
| 'updateManyAndReturn'
| 'upsert'
| 'delete'
| 'deleteMany'
| 'executeRaw'
| 'queryRaw'
| 'aggregate'
| 'count'
| 'runCommandRaw'
| 'findRaw'
| 'groupBy'
/**
* `PrismaClient` proxy available in interactive transactions.
*/
export type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>

View File

@@ -0,0 +1,97 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* All exports from this file are wrapped under a `Prisma` namespace object in the browser.ts file.
* While this enables partial backward compatibility, it is not part of the stable public API.
*
* If you are looking for your Models, Enums, and Input Types, please import them from the respective
* model files in the `model` directory!
*/
import * as runtime from "@prisma/client/runtime/index-browser"
export type * from '../models'
export type * from './prismaNamespace'
export const Decimal = runtime.Decimal
export const NullTypes = {
DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),
JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),
AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),
}
/**
* Helper for filtering JSON entries that have `null` on the database (empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const DbNull = runtime.DbNull
/**
* Helper for filtering JSON entries that have JSON `null` values (not empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const JsonNull = runtime.JsonNull
/**
* Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const AnyNull = runtime.AnyNull
export const ModelName = {
User: 'User'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
/*
* Enums
*/
export const TransactionIsolationLevel = {
Serializable: 'Serializable'
} as const
export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]
export const UserScalarFieldEnum = {
id: 'id',
name: 'name',
phone: 'phone',
service: 'service',
comment: 'comment',
route: 'route',
createdAt: 'createdAt'
} as const
export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'
} as const
export type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]
export const NullsOrder = {
first: 'first',
last: 'last'
} as const
export type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]

View File

@@ -0,0 +1,12 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This is a barrel export file for all models and their related types.
*
* 🟢 You can import this file directly.
*/
export type * from './models/User'
export type * from './commonInputTypes'

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,10 @@
-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"phone" TEXT NOT NULL,
"service" TEXT,
"comment" TEXT,
"route" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "sqlite"

21
prisma/schema.prisma Normal file
View File

@@ -0,0 +1,21 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "sqlite"
}
model User {
id Int @id @default(autoincrement())
name String
phone String
service String?
comment String?
route String?
createdAt DateTime @default(now())
}

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

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/bmv_1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
public/bmv_10.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
public/bmv_11.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
public/bmv_12.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
public/bmv_13.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
public/bmv_14.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

BIN
public/bmv_2.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
public/bmv_3.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
public/bmv_4.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
public/bmv_5.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
public/bmv_6.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
public/bmv_7.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
public/bmv_8.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
public/bmv_9.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
public/dom_1.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
public/dom_10.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
public/dom_11.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
public/dom_12.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
public/dom_13.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
public/dom_14.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
public/dom_15.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

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