Initial commit
This commit is contained in:
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal 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
75
README.md
Normal 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
53
app.vue
Normal 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
4
assets/pure-city.svg
Normal 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 |
28
components/about-company.vue
Normal file
28
components/about-company.vue
Normal 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
16
components/k-nav.vue
Normal 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>
|
||||
30
components/services/service.vue
Normal file
30
components/services/service.vue
Normal 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>
|
||||
108
components/services/services.vue
Normal file
108
components/services/services.vue
Normal 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
6
nuxt.config.ts
Normal 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
10809
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
package.json
Normal file
20
package.json
Normal 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"
|
||||
}
|
||||
}
|
||||
BIN
public/images/building-window.jpg
Normal file
BIN
public/images/building-window.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.0 MiB |
BIN
public/images/gloves.jpg
Normal file
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
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
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
1
public/robots.txt
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
3
server/tsconfig.json
Normal file
3
server/tsconfig.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "../.nuxt/tsconfig.server.json"
|
||||
}
|
||||
4
tsconfig.json
Normal file
4
tsconfig.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
// https://nuxt.com/docs/guide/concepts/typescript
|
||||
"extends": "./.nuxt/tsconfig.json"
|
||||
}
|
||||
Reference in New Issue
Block a user