Initial commit

This commit is contained in:
2024-09-22 08:32:46 +03:00
commit 3722d8c6e8
18 changed files with 11181 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
# Node dependencies
node_modules
# Logs
logs
*.log
# Misc
.DS_Store
.fleet
.idea
# Local env files
.env
.env.*
!.env.example

75
README.md Normal file
View File

@@ -0,0 +1,75 @@
# Nuxt 3 Minimal Starter
Look at the [Nuxt 3 documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
## Setup
Make sure to install the dependencies:
```bash
# npm
npm install
# pnpm
pnpm install
# yarn
yarn install
# bun
bun install
```
## Development Server
Start the development server on `http://localhost:3000`:
```bash
# npm
npm run dev
# pnpm
pnpm run dev
# yarn
yarn dev
# bun
bun run dev
```
## Production
Build the application for production:
```bash
# npm
npm run build
# pnpm
pnpm run build
# yarn
yarn build
# bun
bun run build
```
Locally preview production build:
```bash
# npm
npm run preview
# pnpm
pnpm run preview
# yarn
yarn preview
# bun
bun run preview
```
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.

53
app.vue Normal file
View File

@@ -0,0 +1,53 @@
<script setup lang="ts">
useSeoMeta({
title: 'Чистый город - клининговая компания',
})
</script>
<template>
<div class="app text-lg">
<k-nav></k-nav>
<main>
<about-company></about-company>
<services></services>
</main>
</div>
</template>
<style lang="postcss">
:root {
--col-width: 1280px;
--clr-brand: #6ec843;
}
html {
scroll-behavior: smooth;
}
.app {
min-height: 100dvh;
}
p:not(:last-of-type) {
margin-bottom: 16px;
}
.col-w {
max-width: var(--col-width);
}
.scroll-target {
position: absolute;
&:target {
scroll-margin-top: 60px;
}
}
.link {
text-decoration: underline;
text-decoration-thickness: 1px;
text-underline-offset: 3px;
}
</style>

4
assets/pure-city.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="153" height="150" viewBox="0 0 153 150" version="1.1">
<path d="M 137.368 5.910 C 133.986 8.989, 129.013 10.787, 116.500 13.456 C 100.310 16.909, 73.140 26.522, 72.156 29.145 C 71.968 29.649, 69.718 31.132, 67.156 32.441 C 48.755 41.846, 27.934 63.387, 21.738 79.430 C 15.999 94.288, 14.997 97.421, 13.563 104.983 C 12.703 109.514, 12 116.288, 12 120.036 C 12 125.942, 11.466 127.955, 8 135.123 C 3.545 144.335, 3.200 146.002, 5.750 145.996 C 6.874 145.994, 8.143 144.430, 9.296 141.624 C 12.392 134.096, 12.967 133.638, 16.875 135.588 C 27.934 141.105, 51.142 143.445, 66.326 140.575 C 76.728 138.609, 90.847 133.699, 94.159 130.895 C 95.447 129.805, 99.953 126.715, 104.172 124.028 C 118.178 115.109, 131.720 100.546, 138.426 87.194 C 146.566 70.986, 149.826 47.694, 146.946 26.322 C 145.769 17.591, 142.129 2.984, 141.140 3.029 C 140.788 3.045, 139.091 4.342, 137.368 5.910 M 78.822 29.250 C 77.464 30.488, 70.825 35.100, 64.070 39.500 L 51.789 47.500 52.424 55.327 C 53.016 62.617, 52.934 63.114, 51.222 62.571 C 49.986 62.178, 45.847 64.312, 38.563 69.097 L 27.741 76.206 28.476 88.353 C 29.743 109.287, 30.789 111.225, 30.807 92.672 C 30.816 83.416, 30.975 75.734, 31.162 75.600 C 33.607 73.839, 47.944 66, 48.720 66 C 49.398 66, 50.022 74.766, 50.500 91.014 C 51.156 113.293, 51.803 118.530, 53.670 116.663 C 53.966 116.367, 54.640 107.435, 55.169 96.813 C 56.258 74.914, 56.694 71, 58.045 71 C 58.600 71, 59 76.172, 59 83.344 C 59 102.294, 60.095 117, 61.505 117 C 62.948 117, 64 106.240, 64 91.474 C 64 79.092, 64.686 74.942, 66.610 75.681 C 67.691 76.095, 68.001 78.918, 68.006 88.357 C 68.013 103, 69.014 117, 70.054 117 C 71.207 117, 71.888 109.108, 72.209 92.019 L 72.500 76.538 64.216 71.120 L 55.931 65.702 56.216 56.252 L 56.500 46.802 68.406 39.844 C 75.709 35.576, 80.563 33.293, 80.963 33.941 C 81.497 34.804, 84.090 102.500, 84.020 113.750 C 84.004 116.340, 84.406 117, 86 117 C 87.739 117, 88.007 116.316, 88.051 111.750 C 88.205 96.046, 90.758 39.908, 91.345 39.322 C 93.354 37.313, 93.975 43.808, 95.118 78.750 C 96.100 108.775, 96.647 117, 97.665 117 C 99.618 117, 99.779 115.134, 100.891 79.623 C 101.458 61.540, 102.099 46.567, 102.317 46.349 C 103.250 45.417, 105.850 47.314, 106.388 49.319 C 106.709 50.519, 106.981 61.175, 106.991 73 C 107.015 101.375, 107.922 117, 109.546 117 C 110.456 117, 110.966 112.659, 111.457 100.750 C 111.826 91.813, 112.466 76.850, 112.881 67.500 C 113.295 58.150, 113.304 49.814, 112.902 48.975 C 112.499 48.136, 106.619 43.900, 99.835 39.562 C 93.051 35.225, 86.469 30.624, 85.210 29.338 C 82.380 26.450, 81.903 26.444, 78.822 29.250"
stroke="none" fill="#6ec843" fill-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,28 @@
<script setup lang="ts">
</script>
<template>
<section>
<div class="grid grid-cols-2 col-w mx-auto px-4 md:px-16 py-16 gap-4">
<NuxtPicture
class="rounded-lg overflow-hidden"
src="/images/gloves.jpg"
></NuxtPicture>
<div class="border-2 border-lime-500 rounded-lg p-8">
Компания Чистый город осуществляет профессиональные комплексные услуги по уборке помещений для частных и корпоративных клиентов. Высокое качество выполняемых услуг обеспечивается за счет использования современной профессиональной техники с использованием качественных моющих средств нашими опытными специалистами.
</div>
<div class="border-2 border-lime-500 rounded-lg p-8">
Нам дорог каждый клиент и важно каждое мнение о нас, поэтому мы с максимальной ответственностью подходим к своей работе! Наша работа делает мир чище! Благодаря нашему труду пространство становиться чистым, а чистота залог здоровья и приятно находиться в убранном чистом месте, пусть это будет ваша квартира, дом или рабочее место! Нам важно, чтобы наши клиенты оставались с нами и рекомендовали нас как ответственных профессионалов своего дела!
</div>
<NuxtPicture
class="rounded-lg overflow-hidden"
src="/images/building-window.jpg"
></NuxtPicture>
</div>
</section>
</template>
<style scoped lang="postcss">
</style>

16
components/k-nav.vue Normal file
View File

@@ -0,0 +1,16 @@
<script setup lang="ts">
import PureCitySvg from '~/assets/pure-city.svg'
</script>
<template>
<nav class="flex justify-center align-middle p-4 pt-8">
<img
:src="PureCitySvg"
alt="Логотип"
>
</nav>
</template>
<style scoped lang="postcss">
</style>

View File

@@ -0,0 +1,30 @@
<script setup lang="ts">
defineProps<{
name: string
type: 'indoor' | 'outdoor'
}>()
</script>
<template>
<div class="rounded-lg bg-white flex-grow flex justify-between overflow-hidden">
<div class="py-4 px-6 text-center flex-grow">
{{ name }}
</div>
<div
class="px-4 flex items-center justify-center"
:class="{
'bg-yellow-400': type === 'indoor',
'bg-lime-500': type === 'outdoor'
}"
>
<Icon
:name="type === 'indoor' ? 'bi:house' : 'bi:tree'"
class="text-white"
></Icon>
</div>
</div>
</template>
<style scoped lang="postcss">
</style>

View File

@@ -0,0 +1,108 @@
<script setup lang="ts">
import Service from "~/components/services/service.vue";
type TService = {
name: string
type: 'indoor' | 'outdoor'
}
const indoorServices: TService[] = [
// Услуги по уборке помещений
{ name: 'Генеральная уборка', type: 'indoor' },
{ name: 'Уборка после ремонта и строительства', type: 'indoor' },
{ name: 'Уборка после пожара', type: 'indoor' },
{ name: 'Уход за полами', type: 'indoor' },
{ name: 'Обеспыливание поверхностей', type: 'indoor' },
{ name: 'Высотный клининг', type: 'indoor' },
{ name: 'Влажная уборка', type: 'indoor' },
{ name: 'Уборка паром', type: 'indoor' },
{ name: 'Мытье полов', type: 'indoor' },
{ name: 'Мытье стен', type: 'indoor' },
{ name: 'Мойка потолков', type: 'indoor' },
{ name: 'Мытье окон', type: 'indoor' },
{ name: 'Мойка витрин', type: 'indoor' },
{ name: 'Мойка балконов и лоджий', type: 'indoor' },
{ name: 'Химчистка ковров на дому', type: 'indoor' },
{ name: 'Химчистка мебели', type: 'indoor' },
{ name: 'Химчистка ковролина на дому', type: 'indoor' },
{ name: 'Химчистка штор на дому', type: 'indoor' },
{ name: 'Чистка жалюзи', type: 'indoor' },
{ name: 'Химчистка матрасов на дому', type: 'indoor' },
{ name: 'Полировка полов', type: 'indoor' },
{ name: 'Шлифовка пола', type: 'indoor' },
{ name: 'Чистка вентиляции', type: 'indoor' },
{ name: 'Чистка бассейнов', type: 'indoor' },
{ name: 'Чистка кондиционеров', type: 'indoor' },
]
const outdoorServices = [
// Услуги по уборке территории
{ name: 'Удаление граффити', type: 'outdoor' },
{ name: 'Мойка фасадов', type: 'outdoor' },
{ name: 'Подметание территории', type: 'outdoor' },
{ name: 'Уборка снега', type: 'outdoor' },
{ name: 'Уборка листвы', type: 'outdoor' },
{ name: 'Покос травы', type: 'outdoor' },
{ name: 'Уход за газоном', type: 'outdoor' }
]
function mulberry32(a) {
return function() {
let t = a += 0x6D2B79F5;
t = Math.imul(t ^ t >>> 15, t | 1);
t ^= t + Math.imul(t ^ t >>> 7, t | 61);
return ((t ^ t >>> 14) >>> 0) / 4294967296;
}
}
const getRand = mulberry32((Math.random()*2**32)>>>0)
function shuffle(array) {
let currentIndex = array.length;
// While there remain elements to shuffle...
while (currentIndex != 0) {
// Pick a remaining element...
let randomIndex = Math.floor(getRand() * currentIndex);
currentIndex--;
// And swap it with the current element.
[array[currentIndex], array[randomIndex]] = [
array[randomIndex], array[currentIndex]];
}
}
shuffle(outdoorServices)
</script>
<template>
<section class="py-16 bg-gray-100">
<h2 class="text-4xl font-semibold col-w mx-auto mb-8 px-4 md:px-16">Услуги</h2>
<div class="col-w mx-auto px-4 md:px-16 gap-2 services__grid mb-16">
<service
v-for="s in indoorServices"
:key="s.name"
:name="s.name"
:type="s.type"
></service>
</div>
<div class="col-w mx-auto px-4 md:px-16 gap-2 services__grid">
<service
v-for="s in outdoorServices"
:key="s.name"
:name="s.name"
:type="s.type"
></service>
</div>
</section>
</template>
<style scoped lang="postcss">
.services__grid {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
</style>

6
nuxt.config.ts Normal file
View File

@@ -0,0 +1,6 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2024-04-03',
devtools: { enabled: true },
modules: ['@nuxt/icon', '@nuxtjs/tailwindcss', '@nuxt/image']
})

10809
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

20
package.json Normal file
View File

@@ -0,0 +1,20 @@
{
"name": "nuxt-app",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@nuxt/icon": "^1.5.1",
"@nuxt/image": "^1.8.0",
"@nuxtjs/tailwindcss": "^6.12.1",
"nuxt": "^3.13.0",
"vue": "latest",
"vue-router": "latest"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
public/images/gloves.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
public/images/sweep.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

BIN
public/images/trash-bin.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

1
public/robots.txt Normal file
View File

@@ -0,0 +1 @@

3
server/tsconfig.json Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": "../.nuxt/tsconfig.server.json"
}

4
tsconfig.json Normal file
View File

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