This commit is contained in:
alsaze 2025-11-26 16:14:00 +03:00
commit 70d6285ebf
23 changed files with 16776 additions and 0 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
VITE_BASE_URL=http://localhost:3000

1
.env.developer Normal file
View File

@ -0,0 +1 @@
VITE_BASE_URL=http://localhost:3000

19
Dockerfile Normal file
View File

@ -0,0 +1,19 @@
FROM node:22-alpine AS build
WORKDIR /app
RUN corepack enable
COPY package.json yarn.lock ./
RUN yarn install
COPY . .
RUN yarn build
FROM node:22-alpine
WORKDIR /app
COPY --from=build /app/.output/ ./
ENV PORT=80
ENV VITE_BASE_URL=http://localhost:3000
EXPOSE 80
CMD ["node", "/app/server/index.mjs"]

7
README.md Normal file
View File

@ -0,0 +1,7 @@
node.js 20.19.0
yarn
yarn dev
https://wp.koptilnya.xyz/wp-admin/edit.php?post_type=product

11
app.vue Normal file
View File

@ -0,0 +1,11 @@
<template>
<UApp>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</UApp>
</template>
<style lang="scss">
@use '@/assets/scss/main' as *;
</style>

2
assets/css/main.css Normal file
View File

@ -0,0 +1,2 @@
@import "tailwindcss";
@import "@nuxt/ui";

60
assets/scss/main.scss Normal file
View File

@ -0,0 +1,60 @@
//скроллбар
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: transparent;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: rgba(128, 128, 128, 0.5);
border-radius: 4px;
border: 2px solid transparent;
background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(128, 128, 128, 0.7);
background-clip: padding-box;
}
* {
scrollbar-width: thin;
scrollbar-color: rgba(128, 128, 128, 0.5) transparent;
}
body {
-ms-overflow-style: -ms-autohiding-scrollbar;
}
//swiper
.swiper {
width: 100%;
height: calc(100dvh - 54px);
}
.swiper-slide {
text-align: center;
font-size: 18px;
background: #444;
/* Center slide text vertically */
display: flex;
justify-content: center;
align-items: center;
}
.swiper-slide img {
display: block;
width: 100%;
height: calc(100dvh - 54px);
object-fit: cover;
}
.swiper-pagination {
position: absolute;
bottom: 200px !important;
--swiper-pagination-bullet-size: 4px
}

5
assets/scss/mixins.scss Normal file
View File

@ -0,0 +1,5 @@
@mixin mobile {
@media (max-width: 768px) {
@content;
}
}

17
eslint.config.js Normal file
View File

@ -0,0 +1,17 @@
import antfu from '@antfu/eslint-config'
export default antfu({
rules: {
'antfu/top-level-function': 'off',
},
formatters: {
css: true,
},
overrides: {
vue: {
'vue/block-order': ['error', {
order: ['template', 'script', 'style'],
}],
},
},
})

5
i18n/locales/en.json Normal file
View File

@ -0,0 +1,5 @@
{
"colors": {
"black": "black"
}
}

20
i18n/locales/ru.json Normal file
View File

@ -0,0 +1,20 @@
{
"colors": {
"black": "черный",
"beige": "бежевый",
"grey": "серый",
"grey-black": "серо-черный"
},
"materials": {
"cotton": "хлопок",
"cotton-polyester": "хлопок-полиэстер"
},
"checkoutSteps": {
"delivery": "Выберите адрес получения заказа",
"mobileDelivery": "доставка",
"contacts": "Введите данные получателя",
"mobileContacts": "контакты",
"summary": "Подтвердите заказ",
"mobileSummary": "заказ"
}
}

53
layouts/default.vue Normal file
View File

@ -0,0 +1,53 @@
<template>
<div class="layout">
<UHeader title="Rental">
<UTabs v-model="activeTab" :content="false" :items="tabs" />
<template #right>
<UColorModeButton />
</template>
</UHeader>
<UMain>
<UContainer>
<slot />
</UContainer>
</UMain>
<UFooter />
</div>
</template>
<script setup lang="ts">
import type { TabsItem } from '@nuxt/ui'
const router = useRouter()
const route = useRoute()
const tabs = ref<TabsItem[]>([
{
label: 'Главная',
icon: 'i-lucide-home',
route: '/',
},
{
label: 'Недвижимость',
icon: 'i-lucide-building-2',
route: '/nedvizhimost',
},
{
label: 'Авто',
icon: 'i-lucide-car',
route: '/transport',
},
])
const activeTab = ref(tabs.value.findIndex(tab => route.path.startsWith(tab.route)))
watch(() => activeTab.value, () => {
router.push(tabs.value[activeTab?.value]?.route)
})
</script>
<style lang="scss">
</style>

55
nuxt.config.ts Normal file
View File

@ -0,0 +1,55 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
import { createResolver } from '@nuxt/kit'
const { resolve } = createResolver(import.meta.url)
export default defineNuxtConfig({
ssr: true,
compatibilityDate: '2025-05-15',
devtools: { enabled: true },
modules: [
'@nuxt/ui',
'@nuxt/image',
'@nuxt/icon',
'@nuxt/fonts',
'@nuxtjs/i18n',
[
'@vee-validate/nuxt',
{
autoImports: true,
},
],
],
css: ['~/assets/css/main.css', '~/assets/scss/main.scss'],
i18n: {
locales: [
{ code: 'en', name: 'English', file: 'en.json' },
{ code: 'ru', name: 'Русский', file: 'ru.json' },
],
defaultLocale: 'ru',
strategy: 'prefix_except_default',
detectBrowserLanguage: false,
},
app: {
head: {
meta: [
{
name: 'viewport',
content: 'width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no',
},
],
},
},
vite: {
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "${resolve('./assets/scss/mixins')}" as *;`,
},
},
},
},
fonts: {
provider: 'google',
},
})

16419
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

43
package.json Normal file
View File

@ -0,0 +1,43 @@
{
"name": "nuxt-app",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"typegen": "node .typegen"
},
"dependencies": {
"@nuxt/content": "^3.7.1",
"@nuxt/fonts": "0.11.4",
"@nuxt/icon": "1.15.0",
"@nuxt/image": "1.10.0",
"@nuxt/ui": "^4.0.1",
"@nuxtjs/i18n": "^10.0.4",
"@tanstack/vue-query-devtools": "^5.87.1",
"@vee-validate/nuxt": "^4.15.1",
"@vueuse/core": "^13.1.0",
"axios": "^1.12.2",
"dayjs": "^1.11.13",
"decimal.js": "^10.5.0",
"maska": "^3.2.0",
"nuxt": "^4.1.3",
"swiper": "^12.0.2",
"typescript": "^5.6.3",
"vue": "^3.5.17",
"vue-router": "^4.5.1"
},
"devDependencies": {
"@antfu/eslint-config": "^4.13.2",
"@nuxt/devtools": "latest",
"eslint": "^9.27.0",
"eslint-plugin-format": "^1.0.1",
"sass": "^1.71.0"
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

9
pages/index.vue Normal file
View File

@ -0,0 +1,9 @@
<template>
index
</template>
<script setup lang="ts">
</script>
<style lang="scss">
</style>

11
pages/nedvizhimost.vue Normal file
View File

@ -0,0 +1,11 @@
<template>
nedvizhimost
</template>
<script setup lang="ts">
</script>
<style scoped lang="scss">
</style>

11
pages/transport.vue Normal file
View File

@ -0,0 +1,11 @@
<template>
transport
</template>
<script setup lang="ts">
</script>
<style scoped lang="scss">
</style>

5
plugins/maska.ts Normal file
View File

@ -0,0 +1,5 @@
import { vMaska } from 'maska/vue'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.directive('maska', vMaska)
})

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

2
public/robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-Agent: *
Disallow:

16
tailwind.config.ts Normal file
View File

@ -0,0 +1,16 @@
// tailwind.config.ts
import type { Config } from 'tailwindcss'
const config: Config = {
content: [], // Nuxt сам заполняет content автоматически
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'sans-serif'], // если используешь @nuxt/fonts или свою кастомную типографику
},
},
},
plugins: [],
}
export default config

4
tsconfig.json Normal file
View File

@ -0,0 +1,4 @@
{
// https://nuxt.com/docs/guide/concepts/typescript
"extends": "./.nuxt/tsconfig.json",
}