first step

This commit is contained in:
Kseninia Mikhaylova 2025-03-12 16:57:05 +03:00
commit cdcde8728e
61 changed files with 16379 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

16
Dockerfile Normal file
View File

@ -0,0 +1,16 @@
FROM ci.svs-tech.pro/library/node:22-bookworm-slim
RUN apt update
RUN apt -y install nodejs npm
RUN apt -y install libpng-dev libimagequant-dev
RUN mkdir -p /src
COPY package.json src/package.json
WORKDIR /src
RUN npm install --omit=dev
COPY . /src
RUN npm run build
# CMD npm run preview -- --host
CMD export $(cat .env | egrep -v '#|^$' | xargs) && node .output/server/index.mjs

19
README.md Normal file
View File

@ -0,0 +1,19 @@
# Kupizabor
## Стек
* vue3
* nextjs
* threejs
* tresjs
## Запуск
* npm run dev
## Env
* `NUXT_PUBLIC_API_BASE='https://mns.kustarshina.ru/kp'`
* `NUXT_PUBLIC_IMG_BASE='https://mns.kustarshina.ru'`
* `NUXT_PUBLIC_BASE_URL='https://kupizabor.kustarshina.ru'`
* `NUXT_PUBLIC_YANDEX_METRIKA_ID=12345678`

10
app.vue Normal file
View File

@ -0,0 +1,10 @@
<script setup lang="ts">
import '@/assets/main.scss'
</script>
<template>
<div>
<Header />
<NuxtPage />
<Footer />
</div>
</template>

12
assets/LOGO.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

93
assets/Overpass/OFL.txt Normal file
View File

@ -0,0 +1,93 @@
Copyright 2021 The Overpass Project Authors (https://github.com/RedHatOfficial/Overpass)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,81 @@
Overpass Variable Font
======================
This download contains Overpass as both variable fonts and static fonts.
Overpass is a variable font with this axis:
wght
This means all the styles are contained in these files:
Overpass/Overpass-VariableFont_wght.ttf
Overpass/Overpass-Italic-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that arent available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Overpass:
Overpass/static/Overpass-Thin.ttf
Overpass/static/Overpass-ExtraLight.ttf
Overpass/static/Overpass-Light.ttf
Overpass/static/Overpass-Regular.ttf
Overpass/static/Overpass-Medium.ttf
Overpass/static/Overpass-SemiBold.ttf
Overpass/static/Overpass-Bold.ttf
Overpass/static/Overpass-ExtraBold.ttf
Overpass/static/Overpass-Black.ttf
Overpass/static/Overpass-ThinItalic.ttf
Overpass/static/Overpass-ExtraLightItalic.ttf
Overpass/static/Overpass-LightItalic.ttf
Overpass/static/Overpass-Italic.ttf
Overpass/static/Overpass-MediumItalic.ttf
Overpass/static/Overpass-SemiBoldItalic.ttf
Overpass/static/Overpass-BoldItalic.ttf
Overpass/static/Overpass-ExtraBoldItalic.ttf
Overpass/static/Overpass-BlackItalic.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

202
assets/Roboto/LICENSE.txt Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

78
assets/fonts.scss Normal file
View File

@ -0,0 +1,78 @@
@mixin font-face($family, $file, $weight: normal, $style: normal) {
@font-face {
font-family: $family;
src: url($file);
font-weight: $weight;
font-style: $style;
font-display: swap;
}
}
// assets/Overpass/static/Overpass-ExtraLight.ttf
// assets/Overpass/static/Overpass-ExtraLightItalic.ttf
// assets/Overpass/static/Overpass-Light.ttf
// assets/Overpass/static/Overpass-LightItalic.ttf
// assets/Overpass/static/Overpass-Medium.ttf
// assets/Overpass/static/Overpass-MediumItalic.ttf
// assets/Overpass/static/Overpass-Italic.ttf
// assets/Overpass/static/Overpass-Regular.ttf
// assets/Overpass/static/Overpass-SemiBold.ttf
// assets/Overpass/static/Overpass-SemiBoldItalic.ttf
// assets/Overpass/static/Overpass-Thin.ttf
// assets/Overpass/static/Overpass-ThinItalic.ttf
// assets/Overpass/static/Overpass-Black.ttf
// assets/Overpass/static/Overpass-BlackItalic.ttf
// assets/Overpass/static/Overpass-Bold.ttf
// assets/Overpass/static/Overpass-BoldItalic.ttf
// assets/Overpass/static/Overpass-ExtraBold.ttf
// assets/Overpass/static/Overpass-ExtraBoldItalic.ttf
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Thin.ttf', 100);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-ThinItalic.ttf', 100, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-ExtraLight.ttf', 200);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-ExtraLightItalic.ttf', 200, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Light.ttf', 300);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-LightItalic.ttf', 300, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Regular.ttf', 400);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Italic.ttf', 400, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Medium.ttf', 500);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-MediumItalic.ttf', 500, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-SemiBold.ttf', 600);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-SemiBoldItalic.ttf', 600, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Bold.ttf', 700);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-BoldItalic.ttf', 700, italic);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-Black.ttf', 800);
@include font-face("Overpass", '~/assets/Overpass/static/Overpass-BlackItalic.ttf', 800, italic);
// assets/Roboto/Roboto-Black.ttf
// assets/Roboto/Roboto-BlackItalic.ttf
// assets/Roboto/Roboto-Bold.ttf
// assets/Roboto/Roboto-BoldItalic.ttf
// assets/Roboto/Roboto-Light.ttf
// assets/Roboto/Roboto-LightItalic.ttf
// assets/Roboto/Roboto-Medium.ttf
// assets/Roboto/Roboto-MediumItalic.ttf
// assets/Roboto/Roboto-Regular.ttf
// assets/Roboto/Roboto-Italic.ttf
// assets/Roboto/Roboto-Thin.ttf
// assets/Roboto/Roboto-ThinItalic.ttf
@include font-face("Roboto", '~/assets/Roboto/Roboto-Black.ttf', 800);
@include font-face("Roboto", '~/assets/Roboto/Roboto-BlackItalic.ttf', 800, italic);
@include font-face("Roboto", '~/assets/Roboto/Roboto-Bold.ttf', 700);
@include font-face("Roboto", '~/assets/Roboto/Roboto-BoldItalic.ttf', 700, italic);
@include font-face("Roboto", '~/assets/Roboto/Roboto-Light.ttf', 300);
@include font-face("Roboto", '~/assets/Roboto/Roboto-LightItalic.ttf', 300, italic);
@include font-face("Roboto", '~/assets/Roboto/Roboto-Medium.ttf', 500);
@include font-face("Roboto", '~/assets/Roboto/Roboto-MediumItalic.ttf', 500, italic);
@include font-face("Roboto", '~/assets/Roboto/Roboto-Regular.ttf', 400);
@include font-face("Roboto", '~/assets/Roboto/Roboto-Italic.ttf', 400, italic);
@include font-face("Roboto", '~/assets/Roboto/Roboto-Thin.ttf', 100);
@include font-face("Roboto", '~/assets/Roboto/Roboto-ThinItalic.ttf', 100, italic);
// 100 Thin.
// 200 Extra Light (Ultra Light)
// 300 Light.
// 400 Normal.
// 500 Medium.
// 600 Semi Bold (Demi Bold)
// 700 Bold.
// 800 Extra Bold (Ultra Bold)

167
assets/icons/logo.svg Normal file
View File

@ -0,0 +1,167 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1656.000000pt" height="1773.000000pt" viewBox="0 0 1656.000000 1773.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,1773.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M8965 17604 c-11 -3 -56 -12 -100 -20 -181 -35 -356 -107 -525 -219
-169 -112 -223 -170 -707 -760 -72 -88 -267 -324 -433 -525 -336 -406 -779
-943 -970 -1175 -69 -84 -186 -225 -260 -315 -74 -89 -148 -179 -165 -200 -16
-21 -78 -96 -137 -166 -134 -163 -377 -457 -568 -689 -81 -99 -260 -315 -397
-481 -136 -165 -300 -363 -363 -440 -134 -163 -287 -349 -495 -600 -83 -99
-188 -227 -235 -284 -47 -57 -145 -176 -218 -264 -73 -89 -159 -192 -191 -231
-126 -153 -451 -547 -552 -670 -59 -71 -165 -200 -236 -285 -70 -86 -189 -229
-263 -320 -74 -90 -204 -247 -288 -349 -85 -102 -202 -244 -261 -316 -186
-226 -491 -595 -611 -740 -63 -77 -156 -189 -205 -249 -222 -269 -260 -315
-314 -381 -177 -217 -276 -427 -325 -694 -24 -127 -22 -395 5 -524 62 -304
186 -536 403 -753 192 -192 425 -326 666 -382 25 -6 70 -17 100 -24 87 -21
444 -17 545 5 192 43 386 125 536 228 169 116 212 163 739 804 69 84 186 225
260 315 74 90 191 231 260 315 170 207 446 542 631 765 84 102 203 245 263
319 61 74 169 204 240 290 71 86 206 251 301 366 95 116 235 284 310 375 233
282 549 664 844 1024 107 130 200 236 206 236 8 0 14 -47 18 -157 4 -87 11
-241 17 -343 5 -102 17 -309 25 -460 15 -267 25 -444 45 -830 5 -102 14 -268
20 -370 5 -102 14 -273 20 -380 5 -107 17 -316 25 -465 16 -281 28 -515 46
-920 25 -562 26 -579 44 -630 40 -113 118 -202 221 -249 139 -65 169 -83 209
-128 76 -85 115 -192 130 -363 4 -46 1 -96 -9 -147 -28 -145 -73 -212 -185
-277 -195 -115 -281 -214 -362 -421 -16 -43 -17 -179 -1 -285 7 -44 23 -165
37 -270 14 -104 30 -221 35 -260 5 -38 14 -108 20 -155 6 -47 15 -116 20 -155
10 -72 52 -387 70 -530 30 -231 73 -378 176 -603 13 -29 24 -54 24 -56 0 -2
21 -48 46 -102 25 -55 52 -112 59 -129 7 -16 34 -73 58 -125 24 -52 53 -115
65 -140 134 -294 573 -1170 586 -1169 6 0 37 53 68 117 169 345 365 756 441
922 14 30 44 96 67 145 173 372 328 739 356 844 22 85 41 186 54 291 6 52 15
129 20 170 6 41 21 170 35 285 24 198 33 276 55 455 5 41 14 116 20 165 6 50
22 178 35 285 22 178 23 201 11 261 -40 186 -167 350 -353 454 -99 56 -139 93
-172 159 -51 104 -64 239 -36 396 18 106 64 200 125 260 46 45 55 51 185 111
89 41 161 113 204 202 36 75 43 127 61 422 6 99 15 252 21 340 42 687 47 778
84 1510 9 176 20 329 24 339 7 19 82 40 346 97 88 19 128 28 210 48 104 25
480 111 525 121 19 4 107 24 195 45 159 37 184 43 280 64 28 6 97 22 155 36
58 14 125 30 150 35 25 5 124 28 220 50 281 66 482 112 520 120 19 4 107 24
195 45 164 38 194 45 280 64 28 6 118 26 200 46 83 19 229 53 325 75 96 22
243 56 325 75 83 20 173 40 200 46 96 21 121 27 235 54 63 15 135 32 160 37
25 6 61 13 80 18 56 12 437 100 525 121 44 11 98 23 120 28 22 5 112 25 200
46 88 21 180 42 205 47 92 20 119 26 275 63 88 21 176 41 195 45 123 28 285
85 368 132 17 10 49 27 69 39 249 141 491 442 587 729 54 165 66 246 66 465 0
159 -4 217 -19 285 -80 358 -282 653 -586 855 -118 78 -185 111 -330 164 -224
81 -526 92 -797 27 -78 -19 -222 -52 -308 -72 -36 -8 -83 -19 -105 -24 -22 -5
-83 -19 -135 -31 -52 -12 -160 -37 -240 -55 -174 -41 -200 -48 -310 -73 -47
-10 -137 -31 -200 -45 -63 -15 -133 -31 -155 -36 -22 -5 -78 -18 -125 -29
-174 -41 -267 -63 -330 -77 -91 -21 -149 -34 -195 -45 -181 -42 -454 -105
-565 -130 -74 -17 -182 -42 -240 -56 -368 -85 -715 -166 -750 -173 -68 -15
-221 -50 -480 -111 -47 -11 -103 -24 -125 -29 -22 -5 -80 -19 -130 -30 -87
-20 -177 -41 -260 -60 -22 -5 -78 -18 -125 -29 -317 -74 -449 -105 -480 -111
-19 -4 -107 -24 -195 -45 -88 -21 -176 -41 -195 -45 -19 -4 -165 -38 -325 -75
-159 -37 -306 -71 -325 -75 -49 -11 -204 -46 -345 -79 -66 -16 -183 -43 -260
-61 -77 -18 -187 -43 -245 -56 -128 -30 -166 -39 -250 -58 -63 -14 -156 -36
-330 -77 -47 -11 -103 -24 -125 -29 -22 -5 -64 -15 -92 -21 -29 -7 -55 -10
-59 -7 -3 4 6 19 19 35 24 27 139 166 327 394 47 57 130 158 185 224 55 67
181 220 280 340 99 120 245 298 325 394 80 97 196 237 257 311 61 74 180 219
265 321 84 102 214 260 288 350 74 90 191 231 260 314 69 83 195 236 280 340
85 104 193 235 240 291 47 55 132 159 190 229 98 120 175 213 470 570 200 242
252 308 296 375 353 548 301 1254 -130 1750 -199 228 -482 394 -796 465 -73
17 -435 31 -485 19z m470 -506 c187 -68 325 -156 440 -280 77 -83 128 -165
186 -298 49 -115 69 -219 69 -365 -1 -137 -18 -239 -59 -336 -62 -149 -118
-232 -321 -474 -32 -39 -285 -345 -478 -579 -226 -275 -299 -363 -442 -535
-85 -102 -164 -198 -175 -212 -11 -15 -47 -59 -80 -99 -33 -39 -76 -91 -95
-115 -19 -23 -118 -142 -220 -265 -102 -122 -198 -240 -215 -261 -16 -21 -100
-122 -185 -225 -85 -103 -190 -230 -233 -283 -43 -53 -105 -127 -138 -166 -73
-87 -283 -342 -454 -550 -71 -87 -166 -201 -210 -254 -44 -53 -92 -110 -105
-127 -14 -18 -97 -118 -184 -224 -208 -251 -286 -357 -286 -386 0 -18 -18 -37
-72 -78 -40 -29 -94 -80 -119 -112 -26 -32 -97 -120 -158 -194 -62 -74 -157
-189 -211 -255 -54 -66 -159 -192 -232 -281 -73 -88 -169 -205 -213 -259 -44
-54 -98 -119 -120 -145 -22 -26 -65 -77 -95 -114 -30 -38 -104 -127 -164 -200
-60 -72 -133 -160 -162 -196 -30 -36 -93 -113 -141 -171 -208 -251 -364 -440
-440 -534 -46 -55 -107 -129 -137 -165 -30 -36 -99 -119 -153 -185 -55 -66
-144 -174 -198 -240 -55 -65 -111 -134 -125 -151 -14 -17 -52 -64 -85 -104
-33 -39 -76 -91 -95 -115 -19 -23 -116 -140 -215 -260 -99 -120 -196 -237
-215 -261 -19 -23 -62 -75 -95 -114 -33 -40 -73 -90 -90 -110 -185 -231 -401
-483 -477 -556 -102 -96 -218 -165 -368 -217 -145 -51 -433 -53 -575 -5 -81
27 -260 122 -315 166 -63 51 -143 133 -189 195 -50 67 -123 211 -155 309 -24
71 -26 89 -26 266 0 217 8 257 87 419 54 112 98 173 273 384 234 281 324 391
355 430 33 42 239 291 405 490 58 70 130 157 160 194 30 37 114 138 185 224
72 87 189 229 260 316 72 87 168 204 215 260 47 56 110 133 141 171 32 38 106
128 165 200 60 73 134 162 164 199 30 38 73 89 95 115 22 26 87 104 145 175
58 71 154 187 213 259 59 72 153 185 207 251 54 66 148 179 207 251 59 72 155
188 213 259 58 71 123 149 145 175 22 26 103 123 179 216 208 252 278 337 479
580 100 121 241 292 312 379 72 86 189 228 260 315 72 86 189 228 260 315 72
87 168 204 215 260 47 56 144 173 215 260 191 233 289 351 353 429 31 38 73
88 92 111 19 23 60 73 91 111 32 38 107 130 168 204 62 74 157 189 211 255 54
66 159 192 232 281 73 88 169 205 213 259 44 54 100 122 125 151 25 28 68 80
95 114 47 59 274 334 450 545 44 53 93 113 108 133 57 75 208 231 269 277 65
49 160 100 251 136 113 45 143 49 347 46 181 -3 200 -5 265 -29z m5801 -4819
c63 -12 143 -42 239 -91 181 -92 313 -230 403 -418 71 -147 72 -153 72 -379 0
-194 -1 -207 -26 -275 -14 -39 -49 -116 -77 -170 -44 -84 -68 -116 -152 -200
-108 -109 -169 -149 -327 -212 -83 -33 -213 -70 -333 -96 -76 -15 -110 -23
-235 -53 -133 -31 -473 -109 -675 -154 -77 -18 -178 -41 -225 -52 -47 -11
-103 -24 -125 -29 -22 -5 -80 -19 -130 -30 -98 -23 -162 -38 -300 -69 -49 -12
-178 -41 -285 -66 -107 -25 -256 -59 -330 -76 -74 -17 -182 -42 -240 -55 -58
-14 -123 -29 -145 -34 -80 -18 -173 -40 -285 -66 -63 -15 -131 -30 -150 -34
-100 -22 -420 -95 -525 -120 -66 -15 -183 -43 -260 -60 -121 -28 -235 -54
-390 -90 -22 -5 -80 -19 -130 -30 -49 -11 -157 -36 -240 -55 -82 -20 -170 -40
-195 -46 -40 -8 -102 -23 -370 -85 -85 -20 -146 -33 -195 -44 -43 -10 -119
-27 -260 -60 -49 -11 -110 -25 -135 -31 -25 -6 -61 -14 -80 -19 -19 -5 -55
-14 -80 -20 -113 -28 -254 -177 -279 -295 -7 -33 -17 -73 -23 -90 -10 -32 -19
-166 -43 -625 -23 -461 -35 -663 -45 -825 -5 -82 -14 -229 -20 -325 -6 -96
-15 -240 -20 -320 -5 -80 -12 -195 -16 -256 l-6 -111 -52 -23 c-56 -25 -170
-104 -230 -159 -48 -45 -151 -182 -182 -242 -12 -25 -35 -93 -49 -150 -14 -57
-30 -120 -35 -139 -34 -138 -37 -295 -7 -410 8 -30 22 -91 32 -135 27 -119 89
-234 184 -339 34 -37 153 -125 216 -160 62 -35 100 -70 118 -110 13 -27 12
-52 -8 -211 -13 -99 -28 -223 -34 -275 -7 -52 -16 -129 -21 -170 -5 -41 -14
-115 -20 -165 -6 -49 -15 -124 -20 -165 -6 -41 -21 -167 -35 -280 -13 -113
-30 -248 -36 -300 -6 -52 -18 -115 -26 -139 -14 -44 -86 -224 -122 -305 -10
-22 -35 -79 -56 -126 -21 -47 -46 -104 -56 -127 -11 -23 -19 -44 -19 -46 0 -3
-24 -56 -54 -118 -30 -63 -79 -168 -110 -234 -30 -66 -61 -121 -68 -123 -7 -1
-26 25 -42 60 -16 35 -58 124 -94 198 -168 352 -351 768 -371 845 -6 22 -22
130 -36 240 -14 110 -30 229 -35 265 -5 36 -14 103 -20 150 -6 47 -15 117 -20
155 -5 39 -14 108 -20 155 -6 47 -15 114 -20 150 -5 36 -16 119 -25 185 -8 66
-19 149 -25 185 -24 166 -23 172 8 216 17 23 51 53 78 69 134 78 217 149 286
242 85 115 100 147 138 306 46 198 52 245 39 350 -14 126 -83 399 -114 456
-62 112 -153 219 -240 283 -90 65 -148 100 -196 117 -25 9 -29 15 -29 50 0 22
-4 118 -10 213 -5 95 -14 288 -20 428 -6 140 -15 329 -20 420 -11 185 -26 465
-40 735 -11 205 -24 456 -60 1120 -5 105 -16 312 -25 460 -27 494 -38 699 -39
769 l-1 70 155 37 c85 21 178 43 205 49 79 17 122 27 255 59 69 16 159 37 200
46 41 9 111 25 155 35 44 10 109 26 145 34 96 22 239 56 285 66 22 5 81 19
130 30 50 11 158 36 240 55 83 20 170 40 195 46 40 8 102 23 370 85 36 8 85
19 110 25 25 6 61 14 80 19 19 4 107 25 195 45 88 20 198 45 245 56 47 11 103
24 125 29 22 5 110 26 195 46 85 20 193 45 240 55 130 30 237 55 385 89 50 11
110 25 135 31 67 15 109 25 275 64 83 19 191 44 240 56 248 56 459 105 560
129 44 10 123 28 175 40 52 12 142 33 200 46 58 14 124 29 148 34 23 6 61 14
85 20 44 10 292 67 437 101 47 11 103 24 125 29 48 11 139 32 260 60 50 11
108 25 130 30 22 5 78 18 125 29 206 48 395 92 525 121 77 18 203 47 280 65
160 37 229 52 300 64 73 13 302 13 371 0z"/>
<path d="M11238 2796 c-42 -15 -48 -20 -430 -339 -329 -275 -333 -279 -333
-402 0 -76 2 -83 35 -130 49 -68 113 -100 200 -100 43 1 77 7 100 19 31 17
346 275 603 494 117 100 141 139 141 232 0 47 -6 77 -22 106 -55 107 -184 159
-294 120z"/>
<path d="M4330 2746 c-112 -57 -160 -196 -106 -312 24 -51 50 -76 221 -214 38
-30 85 -69 104 -86 140 -120 383 -310 416 -325 165 -76 364 85 326 263 -7 28
-21 67 -32 85 -26 41 -667 568 -724 594 -58 27 -148 25 -205 -5z"/>
<path d="M9833 1752 c-17 -9 -188 -147 -379 -307 -191 -159 -390 -326 -444
-370 -399 -329 -405 -336 -405 -455 0 -80 20 -125 80 -178 80 -70 211 -76 295
-14 19 15 172 141 340 281 168 140 400 333 515 430 116 96 229 193 253 215 81
76 106 157 77 249 -35 112 -113 167 -232 167 -44 -1 -79 -7 -100 -18z"/>
<path d="M12755 1754 c-52 -13 -674 -270 -702 -290 -94 -70 -107 -206 -27
-294 35 -39 103 -70 153 -70 21 0 277 98 456 174 17 7 71 30 120 51 146 61
149 62 176 92 88 93 75 237 -26 304 -40 27 -111 42 -150 33z"/>
<path d="M5585 1729 c-154 -77 -183 -272 -57 -391 20 -19 233 -195 472 -390
239 -195 470 -383 513 -419 43 -35 105 -83 138 -107 59 -41 62 -42 143 -42 74
0 87 3 129 29 115 74 146 222 68 333 -29 42 -1145 959 -1203 989 -51 26 -149
25 -203 -2z"/>
<path d="M2936 1696 c-106 -39 -160 -135 -134 -240 22 -87 55 -110 303 -210
121 -48 229 -91 240 -96 186 -76 228 -90 272 -90 68 0 130 34 168 90 56 85 33
212 -48 267 -18 12 -147 67 -287 123 -140 56 -264 105 -275 110 -11 4 -43 17
-71 29 -71 29 -122 34 -168 17z"/>
<path d="M11370 1271 c-22 -7 -524 -211 -605 -246 -16 -7 -82 -34 -145 -60
-63 -26 -133 -55 -155 -65 -22 -9 -89 -36 -148 -60 -128 -52 -169 -86 -193
-164 -15 -46 -15 -61 -5 -99 25 -87 112 -157 194 -157 35 0 140 37 277 97 75
33 106 46 455 188 572 233 540 215 571 322 14 48 14 58 0 107 -31 105 -144
168 -246 137z"/>
<path d="M4304 1233 c-32 -6 -105 -72 -120 -110 -34 -79 -7 -187 58 -237 18
-13 137 -65 263 -115 127 -50 241 -96 255 -102 34 -16 28 -13 369 -148 380
-151 411 -155 504 -52 81 89 53 245 -53 301 -19 10 -138 60 -265 110 -126 50
-239 95 -250 100 -11 5 -162 65 -335 134 -319 127 -346 135 -426 119z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,3 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 64C0 28.672 28.672 0 64 0C99.328 0 128 28.672 128 64C128 99.328 99.328 128 64 128C28.672 128 0 99.328 0 64ZM91.545 90.2986C94.0432 76.9254 98.964 47.9124 100.1 35.9747C100.139 35.4178 100.116 34.777 100.097 34.2289C100.079 33.7361 100.064 33.3183 100.1 33.1036C100.024 32.4992 99.7968 31.6681 99.0397 31.0636C98.1313 30.3081 96.6929 30.157 96.0872 30.157C93.2105 30.157 88.8953 31.6681 67.8494 40.4324C60.5061 43.4546 45.8194 49.8012 23.7136 59.3967C20.1555 60.8322 18.2629 62.1922 18.1115 63.5522C17.84 65.9231 20.7938 66.8364 24.845 68.089C25.3123 68.2335 25.7943 68.3826 26.2876 68.5388C30.1485 69.8233 35.2964 71.2588 38.0218 71.3344C40.4443 71.4099 43.1697 70.3522 46.1979 68.3122C66.8653 54.4101 77.4639 47.3835 78.1452 47.2324C78.2046 47.2239 78.2649 47.2145 78.3258 47.205C78.8089 47.1296 79.3317 47.048 79.735 47.3835C79.9043 47.5623 80.0272 47.7797 80.0932 48.0167C80.1591 48.2537 80.1661 48.5032 80.1136 48.7435C79.8129 50.0036 67.5273 61.3664 61.9141 66.5581C60.4594 67.9035 59.4528 68.8345 59.2191 69.0677C58.6372 69.6586 58.0457 70.2193 57.4762 70.7592C53.8217 74.2233 51.0694 76.8321 57.5536 81.0809C60.7527 83.1844 63.297 84.9144 65.8654 86.6609C68.4632 88.4273 71.0858 90.2106 74.4357 92.4142C75.2864 92.9751 76.1005 93.5543 76.8939 94.1188C80.0546 96.3675 82.8872 98.3828 86.397 98.0808C88.3654 97.8541 90.4851 95.9653 91.545 90.2986Z" fill="#333333"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

3
assets/icons/vk.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 64C0 28.672 28.672 0 64 0C99.328 0 128 28.672 128 64C128 99.328 99.328 128 64 128C28.672 128 0 99.328 0 64ZM94.2421 90.8735H103.893L103.88 90.8694C106.61 90.8694 108.014 89.4619 107.062 86.7591C106.215 84.0355 103.037 80.0995 98.9033 75.408C97.7647 74.0829 96.3361 72.68 95.0685 71.4352C93.834 70.2229 92.7521 69.1605 92.2397 68.4661C90.8314 66.5853 91.2219 65.8504 92.2397 64.1648C92.2397 64.1648 104.075 47.4702 105.289 41.8487C105.937 39.7727 105.289 38.2822 102.389 38.2822H92.7175C90.2706 38.2822 89.1447 39.5984 88.4967 41.0058C88.4967 41.0058 83.5197 53.0088 76.5737 60.7935C74.3262 63.0438 73.2876 63.7787 72.0745 63.7787C71.5137 63.7787 70.5831 63.0438 70.5831 60.9679V41.7449C70.5831 39.3243 69.827 38.1992 67.7706 38.1992H52.5616C51.0702 38.1992 50.1396 39.3243 50.1396 40.4495C50.1396 41.3407 50.6445 41.974 51.2892 42.7825C52.3323 44.0907 53.7414 45.8579 53.9699 49.9198V64.1689C53.9699 67.2621 53.4091 67.8225 52.196 67.8225C48.9099 67.8225 40.946 55.7365 36.1644 41.94C35.213 39.3243 34.2825 38.1992 31.8356 38.1992H22.1642C19.4598 38.1992 18.8989 39.5153 18.8989 40.9228C18.8989 43.5385 22.185 56.1891 34.1952 73.0788C42.1591 84.6043 53.5171 90.7905 63.7534 90.7905C69.9433 90.7905 70.6787 89.3872 70.6787 87.0497V78.335C70.6787 75.6072 71.2437 75.0467 73.2336 75.0467C74.6419 75.0467 77.1719 75.7816 82.8841 81.316C84.776 83.2318 86.2168 84.8363 87.3965 86.1501C90.3176 89.4031 91.638 90.8735 94.2421 90.8735Z" fill="#333333"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

3
assets/icons/youtube.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 64C0 28.672 28.672 0 64 0C99.328 0 128 28.672 128 64C128 99.328 99.328 128 64 128C28.672 128 0 99.328 0 64ZM46.2495 91.7311L96.8031 68.0998C101.228 66.0253 101.228 62.643 96.8031 60.5685L46.2495 36.9373C41.8246 34.8854 38.1992 37.1966 38.1992 42.0784V86.5899C38.1992 91.483 41.8246 93.783 46.2495 91.7311Z" fill="#333333"/>
</svg>

After

Width:  |  Height:  |  Size: 483 B

484
assets/main.scss Normal file
View File

@ -0,0 +1,484 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {}
@import 'fonts.scss';
html {
// @apply text-[15px]
}
body {
@apply select-none min-w-80 font-sans;
&.modal-opened {
@apply overflow-hidden;
}
}
.container {
@apply max-w-7xl mx-auto px-4 grid grid-cols-12 items-center;
&.min-w-full {
@apply px-0;
}
}
.header {
@apply p-2 bg-slate-200;
.container {
@apply items-center;
}
}
.logo {
@apply w-full py-4 col-span-8 xl:col-span-2;
a {
@apply flex items-center gap-2;
}
&_text {
@apply leading-6 text-3xl font-normal;
}
svg {
@apply text-ioprim inline-block m-0 w-10 h-10 min-w-10;
}
}
.menu {
@apply hidden xl:flex col-span-10 justify-end;
a {
@apply text-zinc-800 hover:text-ioprim-900 transition-colors;
&:before {
content: '';
@apply inline-block w-[2px] h-5 mx-4 align-middle bg-gradient-to-t from-transparent via-zinc-800 via-50% to-transparent;
}
&:first-child::before {
content: none;
}
}
a[href^=http] {
@apply relative;
&:after {
content: '';
@apply ml-2;
}
}
&.toggle_visible {
@apply max-xl:flex max-xl:flex-col max-xl:text-left;
a {
@apply max-xl:mb-2;
}
a:before {
@media screen and (max-width: 1280px) {
content: none;
}
}
}
&-toggle {
@apply flex xl:hidden col-span-4 justify-end;
>span {
@apply cursor-pointer text-zinc-600 hover:text-ioprim-900 transition-colors;
svg {
@apply text-3xl;
}
}
}
}
a[href^="#"] {
@apply underline decoration-dotted underline-offset-4 decoration-neutral-500;
}
.footer {
@apply px-2 py-4 bg-slate-200 text-zinc-800 pt-12;
.container {
@apply gap-4
}
.k-logo {
@apply col-span-12 xl:col-span-2 row-span-3 text-9xl text-ioprim;
svg {
@apply my-0 mx-auto;
}
&:after {
content: '';
@apply block lg:hidden mr-auto ml-auto mt-5 h-[2px] max-w-44 mx-4 align-middle bg-gradient-to-r from-transparent via-zinc-800 via-50% to-transparent;
}
}
&-text {
@apply col-span-12 xl:col-span-5 text-sm mb-2;
&-small {
@apply col-span-12 xl:col-span-10 text-xs min-w-full;
}
&-social {
@apply col-span-12 xl:col-span-10 flex gap-4 flex-wrap justify-center;
}
}
&-icon {
@apply order-2 flex justify-center items-center gap-2;
&:hover {
.footer-icon-text {
@apply no-underline;
}
}
svg {
@apply mb-0;
}
&-big {
@apply text-3xl order-1 w-full text-center;
.footer-icon-text {
@apply no-underline;
}
}
&-text {
@apply underline;
}
}
&_two {
@apply xl:bg-slate-200 py-16 lg:py-8 text-sm text-zinc-500;
}
}
.siteblock {
@apply py-10;
&_imgbg {
@apply py-0 bg-no-repeat bg-cover bg-bottom h-[50vh] min-h-[600px];
}
&_calc {
// @apply;
.container {
@apply gap-4 items-stretch;
>* {
@apply relative;
}
>div:first-child {
@apply min-h-[600px];
}
}
}
&_content {
>.container {
@apply items-start;
}
a[href^="tel://"] {
@apply whitespace-nowrap
}
}
&-content {
@apply col-span-full xl:col-span-8 h-full flex flex-col justify-between min-w-full prose;
}
&-text {
// @apply
}
&-title {
@apply col-span-full text-4xl xl:text-6xl font-black font-h1 xl:leading-[0.85] tracking-tight mb-[3.15rem]
}
&-image {
@apply col-span-full xl:col-span-4 flex justify-center items-center;
}
}
.review {
@apply col-span-12 md:col-span-6 xl:col-span-4 grid grid-cols-4 items-center px-4;
&-image {
@apply max-w-full max-h-full aspect-square overflow-hidden col-span-1 pr-4;
img {
@apply rounded-full bg-slate-300
}
}
&-content {
@apply col-span-3 text-end italic text-sm lg:text-base;
}
&-title {
@apply col-span-4 font-bold text-lg text-end xl:mt-4 mb-4 xl:mb-0;
}
}
.modal {
@apply relative bg-white p-5 lg:p-10 border rounded shadow prose;
&-backdrop {
@apply fixed top-0 left-0 right-0 bottom-0 bg-white bg-opacity-70 flex items-center justify-center z-30;
}
&-close {
@apply absolute right-3 top-3 text-4xl opacity-50 cursor-pointer;
}
&-status {
@apply text-center;
&-icon {
@apply text-8xl;
}
&-text {
@apply text-3xl;
}
}
&-content {
@apply max-h-[66vh] overflow-auto;
}
h2 {
@apply px-6 text-2xl text-center;
}
form {
@apply flex flex-col gap-4 items-center;
}
}
label {
@apply inline-block text-sm font-medium text-gray-900 min-w-36;
}
input {
@apply bg-white border border-gray-300 text-gray-900 text-lg p-2.5 rounded focus:ring-blue-500 focus:border-blue-500 focus-visible:border-blue-500 disabled:cursor-not-allowed disabled:text-black
}
input[type=checkbox] {
@apply w-4 h-4;
}
input[type=range] {
@apply w-full bg-transparent border-transparent cursor-pointer appearance-none disabled:opacity-50 disabled:pointer-events-none focus:outline-none [&::-webkit-slider-thumb]:w-2.5 [&::-webkit-slider-thumb]:h-2.5 [&::-webkit-slider-thumb]:-mt-0.5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-[0_0_0_4px_#111] [&::-webkit-slider-thumb]:shadow-slate-500 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:transition-all [&::-webkit-slider-thumb]:duration-150 [&::-webkit-slider-thumb]:ease-in-out [&::-webkit-slider-thumb]:dark:bg-neutral-700 [&::-moz-range-thumb]:w-2.5 [&::-moz-range-thumb]:h-2.5 [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:border-4 [&::-moz-range-thumb]:border-blue-600 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:transition-all [&::-moz-range-thumb]:duration-150 [&::-moz-range-thumb]:ease-in-out [&::-webkit-slider-runnable-track]:w-full [&::-webkit-slider-runnable-track]:h-2 [&::-webkit-slider-runnable-track]:bg-gray-100 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:dark:bg-neutral-700 [&::-moz-range-track]:w-full [&::-moz-range-track]:h-2 [&::-moz-range-track]:bg-gray-100 [&::-moz-range-track]:rounded-full;
}
textarea {
@apply block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 max-w-full min-h-10 max-h-40;
}
button {
@apply rounded bg-primary hover:bg-primary-300 transition-colors p-4 inline-block text-2xl font-bold cursor-pointer disabled:opacity-50 disabled:hover:bg-primary leading-5 lg:leading-4;
&.neutral,
&[type="reset"] {
@apply bg-neutral-200 hover:bg-neutral-400
}
}
.form {
@apply col-span-full h-full flex flex-col gap-4 justify-between;
&-group {
@apply rounded flex flex-col gap-4 p-4 shadow shadow-slate-400;
}
&-row {
@apply flex flex-row flex-wrap gap-2;
&_picker {
@apply grid grid-cols-2 justify-center items-center;
}
}
&-item {
@apply flex flex-row items-center justify-start flex-wrap;
label {
@apply w-full;
}
.icon {
@apply hover:text-primary cursor-pointer transition-colors text-xl;
&.disabled {
@apply text-neutral pointer-events-none cursor-not-allowed;
}
}
&_total {
@apply w-full flex-nowrap;
input {
@apply w-20 bg-slate-100;
}
}
&_checkbox {
@apply w-full xl:w-auto flex-row xl:flex-initial flex-nowrap gap-2 items-center;
label {
@apply leading-none;
}
svg {
@apply text-slate-500;
}
}
&_range {
@apply w-full;
>div {
@apply flex flex-nowrap w-full gap-2 items-center;
input {
@apply flex-grow;
}
span {
@apply min-w-16;
}
}
}
&_picker {
@apply w-full;
svg {
@apply text-slate-500;
}
}
}
}
.picker {
@apply leading-none w-full row-start-2;
&_open {
@apply flex-wrap;
}
&_disabled {
@apply pointer-events-none opacity-50;
}
&-input {
@apply flex items-center justify-between;
>div {
@apply min-h-12 overflow-hidden rounded border-gray-300 shadow flex leading-none grow justify-center items-center p-2;
span {
@apply grow text-left max-w-[80%] break-words line-clamp-2;
}
}
}
&-button {
@apply min-w-6 shrink-0 h-full;
}
&-selected {
@apply h-10 overflow-hidden rounded border-gray-300 shadow inline-block leading-none grow;
}
&-changer {
@apply gap-3 mt-4 max-h-36 overflow-auto order-10 hidden;
&_open {
@apply flex flex-wrap col-span-2;
}
}
&-list {
@apply flex gap-4 w-full;
}
&-item {
@apply size-10;
&--empty {
@apply block bg-slate-300;
}
}
}
.feature {
@apply col-span-full flex gap-10 mt-4 justify-center xl:justify-between flex-wrap items-center;
&-item {
@apply rounded bg-neutral-200 p-4 min-w-36 flex justify-center flex-wrap flex-col;
}
&-name {
@apply text-ioprim font-bold w-20 text-xl leading-4 col-span-2;
}
}
.fallback {
@apply absolute bg-neutral-600 top-0 left-0 w-full h-full z-20 flex justify-center items-center text-black font-mono
}
.canvas-icons {
@apply absolute text-3xl top-0 left-0 flex flex-col;
a {
@apply cursor-pointer;
&.disabled {
@apply cursor-not-allowed opacity-50 pointer-events-none;
}
}
}
.calc {
@apply max-h-[800px] relative h-full;
}
.calc_table {
@apply flex flex-col gap-2 self-end;
>.grid {
@apply gap-2 items-end;
>[class*=col] {
@apply p-1 border-solid border-b;
}
>.col-span-4:not(.calc_table-maincell) {
@apply pl-4;
}
}
}

64
components/footer.vue Normal file
View File

@ -0,0 +1,64 @@
<script setup lang="ts">
import k_logo from '@/assets/LOGO.svg'
const { fetchData } = useApiFetch()
import tg from '@/assets/icons/telegram.svg'
import vk from '@/assets/icons/vk.svg'
import yt from '@/assets/icons/youtube.svg'
const icons = {
'simple-icons:vk': vk,
'simple-icons:telegram': tg,
'simple-icons:youtube': yt,
}
const { data: footerData } = await fetchData<Footer[]>(`footer/?ordering=small_text`, true)
const { data: socialNetworkData } = await fetchData<SocialNetwork[]>(`social_network/`, true)
</script>
<template>
<div>
<div class="footer" id="contacts">
<div class="container">
<div class="col-span-12 lg:col-span-6 xl:col-span-3 mb-12 lg:mb-0">
<div class="k-logo">
<k_logo />
</div>
</div>
<div class="col-span-12 lg:col-span-6 xl:col-span-6 mb-12 lg:mb-0">
<template v-for="item in footerData">
<div class="footer-text" v-if="!item.small_text">
<template v-for="p in item.text.replace(/\r\n/g, '\n').split('\n')">
<p v-if="p.trim().length">{{ p }}</p>
</template>
</div>
</template>
</div>
<div class="col-span-12 xl:col-span-3">
<div class="footer-text footer-text-social" v-if="socialNetworkData">
<template v-for="item in socialNetworkData">
<a :class="['footer-icon', { 'footer-icon-big': !item.icon }]" :href="item.link"
target="_blank">
<template v-if="item.icon">
<component :is="icons[(item.icon.trim() as keyof typeof icons)]"
v-if="icons.hasOwnProperty(item.icon.trim())" />
<Icon :name="item.icon" v-else />
</template>
<span class="footer-icon-text">{{ item.name }}</span>
</a>
</template>
</div>
</div>
</div>
</div>
<div class="footer_two">
<div class="container">
<div class="col-span-10 col-start-2">
<template v-for="item in footerData">
<div class="footer-text" v-if="item.small_text">
{{ item.text }}
</div>
</template>
</div>
</div>
</div>
</div>
</template>

43
components/header.vue Normal file
View File

@ -0,0 +1,43 @@
<script setup lang="ts">
import k_logo from '@/assets/LOGO.svg'
const { fetchData } = useApiFetch()
const route = useRoute()
const { data, status, error } = await fetchData<Menu>(`menu/`)
const menu = computed(()=>{
return (data.value?.pages || []).sort((a, b) => a.order - b.order)
})
const menu_visible = ref(false)
const toggle_menu = () => {
if (window.innerWidth < 1280) {
menu_visible.value = !menu_visible.value
}
}
</script>
<template>
<div class="header">
<div class="container">
<div class="logo">
<NuxtLink to="/">
<k_logo />
<span class="logo_text">Купи Скамейку!</span>
</NuxtLink>
</div>
<div class="menu-toggle">
<span @click="toggle_menu">
<Icon name="mdi:menu" />
</span>
</div>
<div class="menu" :class="[{ 'toggle_visible': menu_visible }]">
<template v-for="item in menu">
<NuxtLink :to="item.external_link || ((route.name == 'index' ? '' : '/') + `#${item.slug}`)"
:target="item.external_link ? '_blank' : '_self'" @click="toggle_menu">
{{ item.menu_title }}
</NuxtLink>
</template>
</div>
</div>
</div>
</template>

30
composables/api.ts Normal file
View File

@ -0,0 +1,30 @@
import { useRuntimeConfig, useFetch, createError } from '#imports'
export function useApiFetch() {
const config = useRuntimeConfig()
const apiBase = config.public.apiBase
const prefix = config.public.apiPrefix
const fetchData = <T>(path: string, global = false) => {
const headers = new Headers()
headers.set('Referer', config.public.baseUrl)
return useFetch<T>(`${apiBase}/${global ? 'gb' : prefix}/${path}`, {
baseURL: config.public.baseUrl,
headers,
onResponseError({ response }) {
console.log(response.status)
console.log(response.url)
window.location.pathname = '/404'
throw createError({
statusCode: 404,
fatal: true
})
},
})
}
return {
fetchData
}
}

12
compose.yaml Normal file
View File

@ -0,0 +1,12 @@
services:
front:
build:
context: ./
dockerfile: Dockerfile
container_name: mns_mini_skamja_${BRANCH:-dev}
restart: always
ports:
- "${DOCKER_PORT:-80}:3000"
volumes:
- ./.env:/src/.env
image: ci.svs-tech.pro/mns-mini-skamja:${BRANCH:-dev}

54
error.vue Normal file
View File

@ -0,0 +1,54 @@
<script setup lang="ts">
import '@/assets/main.scss'
const config = useRuntimeConfig()
const { fetchData } = useApiFetch()
import type { NuxtError } from '#app'
import og_img from '/og_img.png'
const { data: seoData } = await fetchData<ApiKpType>(`kp/2/`)
useSeoMeta({
title: seoData.value?.title,
ogTitle: seoData.value?.title,
description: seoData.value?.content,
ogDescription: seoData.value?.content,
ogImage: config.public.baseUrl + og_img,
// twitterCard: 'summary_large_image',
})
const props = defineProps({
error: Object as () => NuxtError
})
const route = useRoute()
if(route.path !== '/404') {
// navigateTo('/404')
}
</script>
<template>
<div>
<Header />
<div class="siteblock bg-white">
<div class="container prose">
<div class="col-span-full">
<h1>Вы ищете страницу, которой не существует. Вернитесь на главную страницу сайта</h1>
<p>Извините, но мы не можем найти запрашиваемую страницу. К сожалению, мы не можем помочь вам с
покупкой забора здесь.</p>
<p>
<code>
{{ error?.message }}
</code>
</p>
<button @click="navigateTo('/')" class="not-prose">Вернуться на главную</button>
</div>
</div>
</div>
<div class="siteblock siteblock_calc bg-white">
<Suspense>
<CalcModels />
</Suspense>
</div>
<Footer />
<Modal />
</div>
</template>

72
index.d.ts vendored Normal file
View File

@ -0,0 +1,72 @@
declare module '*.glb' {
const src: string
export default src
}
type ApiKpType = {
id: number
title: string
content: string
url: string
meta_title: any
meta_description: string
keywords: any
is_indexed: boolean
}
type Menu = {
id: number
type: string
pages: MenuPage[]
}
type MenuPage = {
id: number
order: number
title: string
menu_title: string
slug: string
external_link: string
content: string
image: string
}
type ApiReviewsType = {
id: number
image: string
text: string
comment: string
}
type Footer = {
id: number
text: string
small_text: boolean
}
type SocialNetwork = {
id: number
name: string
link: string
icon: string
}
type ApiAdvantageType = {
id: number
title: string
content: string
}
type DiscountType = {
id: number
min_quantity: number
max_quantitt?: number
percent: number
}
type ApiCalcType = {
id: number
title: string
pillar: string
pillar_base: string
lamelles_block: string
discount: DiscountType[]
}

67
nuxt.config.ts Normal file
View File

@ -0,0 +1,67 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
devtools: { enabled: false },
hooks: {},
app: {
pageTransition: { name: 'page', mode: 'out-in' },
head: {
viewport: 'width=device-width, initial-scale=1',
htmlAttrs: {
lang: 'ru',
},
},
},
ssr: true,
modules: [
'@nuxtjs/tailwindcss',
"@nuxt/image",
"nuxt-icon",
"nuxt-svgo",
'@tresjs/nuxt',
'@nuxtjs/robots',
'@artmizu/yandex-metrika-nuxt',
],
runtimeConfig: {
public: {
apiPrefix: 'sk',
apiBase: process.env.mode == 'DEVELOPMENT' ? "http://mns.dev.kustarshina.ru/kp" : "https://mns.kustarshina.ru/kp",
imgBase: 'https://mns.kustarshina.ru',
baseUrl: '',
yandexMetrika: {
id: 0
},
}
},
routeRules: {
'/index.html': { redirect: '/' },
'/index.php': { redirect: '/' },
},
nitro: {
prerender: {
crawlLinks: false
},
},
vite: {
assetsInclude: ['**/*.glb', '**/*.gltf'],
build: {
target: 'esnext'
},
},
site: { indexable: false },
robots: {
UserAgent: "*",
Disallow: "",
},
compatibilityDate: '2025-03-12'
})

14695
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

40
package.json Normal file
View File

@ -0,0 +1,40 @@
{
"name": "nuxt-app",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@artmizu/yandex-metrika-nuxt": "^1.0.4",
"@monogrid/gainmap-js": "^3.0.5",
"@nodetoy/three-nodetoy": "^0.1.36",
"@nuxt/image": "^1.7.0",
"@nuxtjs/robots": "^4.0.0",
"@nuxtjs/sitemap": "^5.3.5",
"@nuxtjs/tailwindcss": "^6.12.0",
"@tailwindcss/typography": "^0.5.13",
"@tresjs/cientos": "^3.9.0",
"@tresjs/core": "^4.0.2",
"@tresjs/nuxt": "^3.0.8",
"@tresjs/post-processing": "^0.7.1",
"consola": "^3.2.3",
"marked": "^12.0.2",
"nuxt": "^3.11.2",
"nuxt-icon": "^0.6.10",
"nuxt-svgo": "^4.0.1",
"sass": "^1.77.4",
"sharp": "^0.33.5",
"tailwindcss": "^3.4.3",
"three": "^0.165.0",
"vue": "^3.4.27",
"vue-router": "^4.3.2"
},
"devDependencies": {
"@types/imagemin": "^9.0.0"
}
}

21
pages/index.vue Normal file
View File

@ -0,0 +1,21 @@
<script setup lang="ts">
const config = useRuntimeConfig()
const imgBase = config.public.imgBase
import { marked } from 'marked';
import og_img from '/og_img.png'
// const { data: seoData } = await apiFetch<ApiKpType>(`kp/1/`)
// useSeoMeta({
// title: seoData.value?.title,
// ogTitle: seoData.value?.title,
// description: seoData.value?.content,
// ogDescription: seoData.value?.content,
// ogImage: config.public.baseUrl + og_img,
// // twitterCard: 'summary_large_image',
// })
</script>
<template>
1234
</template>

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

BIN
public/og_img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

3
server/tsconfig.json Normal file
View File

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

79
tailwind.config.ts Normal file
View File

@ -0,0 +1,79 @@
import type { Config } from 'tailwindcss'
import colors from 'tailwindcss/colors'
import { fontFamily, fontSize } from 'tailwindcss/defaultTheme'
import tailwindTypography from '@tailwindcss/typography'
const ioprim = {
'50': '#fff6ed',
'100': '#ffead4',
'200': '#ffd1a8',
'300': '#ffb070',
'400': '#ff8337',
'500': '#ff5a06',
'600': '#f04506',
'700': '#c73107',
'800': '#9e280e',
'900': '#7f240f',
'950': '#450e05',
}
const sail = {
'50': '#f0f9ff',
'100': '#dff1ff',
'200': '#bfe7ff',
'300': '#79d0ff',
'400': '#32b9fe',
'500': '#07a0f0',
'600': '#007fcd',
'700': '#0065a6',
'800': '#035689',
'900': '#094871',
'950': '#062d4b',
}
export default <Partial<Config>>{
theme: {
extend: {
colors: {
primary: {
...sail,
DEFAULT: sail[200]
},
ioprim: {
...ioprim,
DEFAULT: ioprim[500],
},
neutral: {
...colors.gray,
DEFAULT: colors.gray[300]
}
},
fontFamily: {
...fontFamily,
serif: 'Overpass',
sans: 'Roboto',
'h1': ['Overpass']
},
fontSize: {
...fontSize,
'6xl': ['3.5rem', { lineHeight: '1' }],
},
typography: ({ theme }) => ({
DEFAULT: {
css: {
'p': {
marginBottom: theme('spacing.7'),
marginTop: theme('spacing.0'),
},
'h2': {
textTransform: 'uppercase',
fontWeight: theme('fontWeight.normal'),
fontSize: theme('fontSize.3xl[2]'),
marginTop: theme('spacing.0'),
marginBottom: theme('spacing.7'),
}
}
}
})
}
},
plugins: [tailwindTypography]
}

4
tsconfig.json Normal file
View File

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