Compare commits

..

3 Commits

Author SHA1 Message Date
28c4e08bb6 feat: добавить auth функционал, URL и Docker конфигурацию
Some checks failed
Build and Push Docker Image / build (push) Failing after 12s
- Добавлены views, URL и страницы для входа, регистрации, профиля
- Обновлён основной маршрут users/urls.py
- Перенаправлен маршрут catalog вместо items
- Обновлена структура header с добавлением ссылки на главную
- Создан Dockerfile и workflow для сборки и доставки образов
2026-03-30 22:32:31 +02:00
d522489e7f feat: добавить страницы и фрагменты для улучшения структуры шаблонов
- Добавлены страницы "Услуги", "Доставка", "Гарантия", "Контакты" с view и URL
- Вынесены hero, advantages, и о нас в отдельные фрагменты
- Обновлены header и footer для активных ссылок и адаптивности
- Добавлен normalize.css для унификации стилей
2026-03-30 21:52:08 +02:00
1eff7c6227 feat: добавить home app и базовую структуру шаблонов
- Создано Django app 'home' с view, urls, models
- Добавлены шаблоны: base layout, header/footer fragments, index page
- Настроены STATICFILES_DIRS и TEMPLATES в settings.py
- Подключены URLS всех apps (home, items, orders, users)
- Добавлены статические файлы (CSS, изображения)
2026-03-23 19:00:17 +01:00
50 changed files with 2043 additions and 9 deletions

View File

@@ -0,0 +1,34 @@
name: Build and Push Docker Image
on:
push:
branches:
- main
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Gitea Registry
uses: docker/login-action@v3
with:
registry: ${{ vars.REGISTRY_URL }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.event_name == 'push' }}
tags: ${{ vars.REGISTRY_URL }}/${{ github.repository_owner }}/santeh-ray:latest
cache-from: type=gha
cache-to: type=gha,mode=max

15
Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENV HOST=0.0.0.0
ENV PORT=8000
EXPOSE ${PORT}
CMD uvicorn santehray.asgi:application --host ${HOST} --port ${PORT}

0
home/__init__.py Normal file
View File

3
home/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
home/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class HomeConfig(AppConfig):
name = 'home'

View File

3
home/models.py Normal file
View File

@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

3
home/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
home/urls.py Normal file
View File

@@ -0,0 +1,10 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='home'),
path('services/', views.services, name='services'),
path('shipping/', views.shipping, name='shipping'),
path('warranty/', views.warranty, name='warranty'),
path('contacts/', views.contacts, name='contacts'),
]

21
home/views.py Normal file
View File

@@ -0,0 +1,21 @@
from django.shortcuts import render
def index(request):
return render(request=request, template_name='home/index.html', context={})
def services(request):
return render(request=request, template_name='home/services.html', context={})
def shipping(request):
return render(request=request, template_name='home/shipping.html', context={})
def warranty(request):
return render(request=request, template_name='home/warranty.html', context={})
def contacts(request):
return render(request=request, template_name='home/contacts.html', context={})

3
items/urls.py Normal file
View File

@@ -0,0 +1,3 @@
urlpatterns = []

3
orders/urls.py Normal file
View File

@@ -0,0 +1,3 @@
urlpatterns = []

View File

@@ -15,7 +15,6 @@ from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'. # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
@@ -27,7 +26,6 @@ DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = []
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
@@ -54,7 +52,9 @@ ROOT_URLCONF = 'santehray.urls'
TEMPLATES = [ TEMPLATES = [
{ {
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [], 'DIRS': [
BASE_DIR / 'templates',
],
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
@@ -62,13 +62,13 @@ TEMPLATES = [
'django.contrib.auth.context_processors.auth', 'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages', 'django.contrib.messages.context_processors.messages',
], ],
'debug': DEBUG
}, },
}, },
] ]
WSGI_APPLICATION = 'santehray.wsgi.application' WSGI_APPLICATION = 'santehray.wsgi.application'
# Database # Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databases # https://docs.djangoproject.com/en/5.2/ref/settings/#databases
@@ -79,7 +79,6 @@ DATABASES = {
} }
} }
# Password validation # Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators
@@ -98,7 +97,6 @@ AUTH_PASSWORD_VALIDATORS = [
}, },
] ]
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/5.2/topics/i18n/ # https://docs.djangoproject.com/en/5.2/topics/i18n/
@@ -109,12 +107,16 @@ USE_I18N = True
USE_TZ = True USE_TZ = True
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.2/howto/static-files/ # https://docs.djangoproject.com/en/5.2/howto/static-files/
STATIC_URL = 'static/' STATIC_URL = 'static/'
# Additional locations of static files
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
# Default primary key field type # Default primary key field type
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field

View File

@@ -15,8 +15,12 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import path, include
urlpatterns = [ urlpatterns = [
path('', include('home.urls')),
path('catalog/', include('items.urls')),
path('orders/', include('orders.urls')),
path('users/', include('users.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
] ]

616
static/css/index.css Normal file
View File

@@ -0,0 +1,616 @@
/* HERO */
.hero {
margin-top: 50px;
background-image: url(../img/hero.png);
background-repeat: no-repeat;
background-position: calc(50% - 350px) center;
height: 500px;
}
.hero-content {
width: 580px;
height: 400px;
margin-top: 80px;
}
.hero-title {
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 500;
font-size: 50px;
line-height: 60px;
letter-spacing: 0.05em;
text-align: left;
color: #36213e;
}
.hero-subtitle-container {
margin-top: 25px;
display: flex;
align-content: center;
flex-direction: row;
}
.hero-subtitle {
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 500;
font-size: 17px;
line-height: 20px;
text-align: left;
color: #36213e;
}
.hero-checkmark {
margin-top: auto;
margin-bottom: auto;
margin-right: 10px;
}
.hero-button-container {
margin-top: 30px;
margin-left: 45px;
}
.hero-button {
display: inline-block;
background: #63768d;
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 500;
font-size: 28px;
line-height: 34px;
text-align: left;
color: #ffffff;
padding: 20px 50px;
text-decoration: none;
}
/* -- ADVANTAGES -- */
.advantages {
margin-top: 100px;
}
.advantages-list {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.advantages-title {
width: 300px;
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 400;
font-size: 44px;
line-height: 1.4;
text-align: left;
color: #36213e;
}
.advantages-item {
width: 250px;
height: 150px;
margin-top: 10px;
}
.advantages-item-number {
width: 42px;
height: 42px;
border-radius: 100%;
background: #63768d;
display: flex;
align-items: center;
justify-content: center;
/* Number in circle */
color: white;
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 400;
font-size: 30px;
line-height: 36px;
text-align: left;
}
.advantages-item-title {
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 400;
font-size: 18px;
line-height: 22px;
text-align: left;
color: #36213e;
margin-top: 18px;
}
.advantages-item-subtitle {
margin-top: 7px;
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 1.2;
text-align: left;
color: #36213e;
}
.advantages-cards {
display: flex;
justify-content: space-between;
margin-top: 120px;
}
.advantages-card {
width: 560px;
height: 300px;
background: #63768d;
}
.advantages-card-content {
margin: 40px 25px;
}
.advantages-card-left {
background-image: url(../img/sanitary-equipment-promo.jpg);
background-repeat: no-repeat;
background-size: 101%;
background-position-x: 2384%;
background-position-y: -2%;
}
.advantages-card-right {
background-image: url(../img/decor-promo.jpg);
background-repeat: no-repeat;
background-size: 66%;
background-position-x: 126%;
background-position-y: 17%;
}
.advantages-card-splash {
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 500;
font-size: 18px;
line-height: 22px;
color: #b8f3ff;
}
.advantages-card-title {
margin-top: 20px;
width: 291px;
height: 84px;
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 500;
font-size: 32px;
line-height: 1.3;
color: #b8f3ff;
}
.advantages-card-button {
display: inline-block;
margin-top: 50px;
font-family: "Inter", sans-serif;
font-style: normal;
font-weight: 500;
font-size: 20px;
line-height: 20px;
text-align: left;
text-decoration: underline;
color: #b8f3ff;
}
/* -- ABOUT -- */
.about-section {
margin-top: 100px;
}
.about-title {
font-style: normal;
font-weight: 400;
font-size: 44px;
line-height: 53px;
text-align: left;
color: #36213e;
}
.about-left {
background-image: url(../img/stats-image.jpg);
height: 320px;
background-repeat: no-repeat;
background-position: right;
background-size: 600px auto;
margin-top: 20px;
}
.about-left-block {
max-width: 500px;
}
.about-left-subtitle {
width: 495px;
font-weight: 400;
font-size: 18px;
text-align: left;
color: #36213e;
}
.about-left-suggestion {
margin-top: 10px;
font-weight: 600;
font-size: 24px;
line-height: 29px;
text-align: left;
color: #36213e;
}
.about-left-list {
max-width: 480px;
}
.about-left-list-item {
width: 100%;
margin-top: 20px;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.about-left-list-item-number {
width: 52px;
height: 52px;
border-radius: 100%;
background: #63768d;
display: flex;
align-items: center;
justify-content: center;
font-weight: 400;
font-size: 32px;
line-height: 31px;
text-align: left;
color: #ffffff;
}
.about-left-list-item-content {
width: 400px;
margin-top: 10px;
}
.about-left-list-item-content-title {
width: 279px;
display: block;
font-weight: 500;
font-size: 18px;
text-align: left;
color: #36213e;
}
.about-left-list-item-content-desc {
margin-top: 10px;
width: 350px;
font-weight: 400;
font-size: 14px;
text-align: left;
color: #36213e;
}
.about-right {
background-image: url(../img/about-image.jpg);
height: 300px;
background-repeat: no-repeat;
background-position: left;
background-size: 500px auto;
margin-top: 20px;
justify-content: center;
}
.about-right-block {
max-width: 600px;
}
.about-right-text {
width: 569px;
font-weight: 400;
font-size: 16px;
text-align: left;
color: #36213e;
}
.about-right-stats {
margin-top: 40px;
width: 100%;
display: flex;
flex-direction: row;
justify-content: space-around;
}
.about-right-stats-item {
display: flex;
flex-direction: column;
align-items: center;
}
.about-right-stats-item-num {
font-weight: 400;
font-size: 32px;
color: #36213e;
}
.about-right-stats-item-label {
margin-top: 5px;
font-weight: 400;
font-size: 14px;
text-align: left;
color: #36213e;
}
/* -- KITCHEN BANNER -- */
.kitchen-banner {
margin-top: 225px;
height: 410px;
background-color: #63768d;
display: flex;
background-image: url(../img/kitchen-banner.jpg);
background-repeat: no-repeat;
background-position: right;
background-size: auto 110%;
}
.kitchen-content {
margin: 74px 80px;
}
.kitchen-content p {
width: 380px;
font-weight: 400;
font-size: 20px;
text-align: left;
color: #ffffff;
}
.kitchen-content h2 {
width: 480px;
margin-top: 20px;
font-weight: 400;
font-size: 48px;
text-align: left;
color: #ffffff;
}
.kitchen-content a {
display: inline-block;
margin-top: 45px;
font-weight: 400;
font-size: 24px;
text-align: left;
color: #ffffff;
}
/* POPULAR PRODUCTS */
.products-section {
margin-top: 120px;
}
.products-title {
font-weight: 400;
font-size: 44px;
line-height: 53px;
text-align: left;
color: #36213e;
}
.products-grid {
margin-top: 40px;
display: grid;
grid-template-columns: 460px 300px 360px;
grid-template-rows: repeat(11, 55px);
gap: 20px;
}
.product {
padding: 20px;
background: #d9d9d9;
}
.product-1 {
grid-column: 1;
grid-row: 1 / 7;
}
.product-2 {
grid-column: 2;
grid-row: 1 / 5;
}
.product-3 {
grid-column: 3;
grid-row: 1 / 8;
}
.product-4 {
grid-column: 1;
grid-row: 7 / -1;
}
.product-5 {
grid-column: 2;
grid-row: 5 / -1;
}
.product-6 {
grid-column: 3;
grid-row: 8 / -1;
}
.products-footer {
display: flex;
justify-content: end;
width: 100%;
}
.products-footer a {
margin-top: 25px;
padding: 22px 46px;
display: inline-block;
background: #63768d;
font-weight: 500;
font-size: 26px;
text-align: left;
color: #ffffff;
}
/* -- FAQ -- */
.faq-section {
margin-top: 120px;
}
.faq-section h2 {
font-weight: 400;
font-size: 44px;
line-height: 53px;
text-align: left;
color: #36213e;
}
.faq-grid {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.faq-item {
margin-top: 40px;
max-width: 530px;
flex: 1 0 50%;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.faq-icon {
width: 42px;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 100%;
background: #63768d;
font-weight: 400;
font-size: 20px;
line-height: 24px;
text-align: left;
color: #b8f3ff;
}
.faq-body {
width: 470px;
margin-top: 10px;
& > h4 {
font-weight: 700;
font-size: 20px;
line-height: 24px;
text-align: left;
color: #36213e;
}
& > p {
margin-top: 16px;
font-weight: 400;
font-size: 18px;
text-align: left;
color: #000000;
}
}
.faq-cta {
margin-top: 55px;
width: 100%;
display: flex;
justify-content: center;
& > a {
padding: 15px 45px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 400;
font-size: 26px;
line-height: 31px;
text-align: left;
color: #ffffff;
background: #63768d;
& > div {
width: 42px;
height: 42px;
background: #ffffff;
border-radius: 100%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 500;
font-size: 20px;
line-height: 24px;
text-align: left;
margin-right: 5px;
color: #63768d;
}
}
}

36
static/css/login.css Normal file
View File

@@ -0,0 +1,36 @@
.login-form {
padding: 25px;
border: 1px solid rgba(94, 80, 125, 0.78);
& > h2 {
text-align: center;
font-weight: 400;
font-size: 44px;
color: #36213e;
}
}
.form-group {
display: flex;
flex-direction: column;
gap: 5px;
margin-top: 10px;
}
.form-label {
font-weight: 400;
font-size: 18px;
line-height: 22px;
text-align: left;
color: #554971;
}
.form-input {
background: #d9d9d9;
border: 1px solid #554971;
padding: 5px;
}

350
static/css/normalize.css vendored Normal file
View File

@@ -0,0 +1,350 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

283
static/css/style.css Normal file
View File

@@ -0,0 +1,283 @@
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--dark: #36213e;
--mid: #554971;
--blue-gray: #63768d;
--light-blue: #b8f3ff;
--white: #ffffff;
--bg: white;
}
body {
font-family: 'Inter', sans-serif;
color: var(--dark);
background: var(--bg);
overflow-x: hidden;
}
/* Container to maintain consistent width */
.container {
max-width: 1160px;
margin: 0 auto;
width: 100%;
}
a {
text-decoration: none;
color: inherit;
}
/* --- LIB --- */
.flex-right {
display: flex;
justify-content: flex-end;
align-items: flex-end;
flex-direction: column;
width: 100%;
height: 100%;
}
.text-align-right {
text-align: right;
}
.active-page {
text-decoration: underline;
}
.full-page {
width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.center-wrapper {
display: flex;
width: 100%;
height: 100%;
flex-direction: column;
justify-content: center;
align-items: center;
}
/* ── HEADER ── */
header {
position: sticky;
top: 0;
z-index: 100;
background: var(--bg);
border-bottom: 1px solid rgba(54, 33, 62, .08);
box-shadow: 0 2px 20px rgba(54, 33, 62, .06);
}
.header-top {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 80px;
gap: 20px;
}
.logo {
font-family: 'Playfair Display', serif;
font-size: 32px;
color: var(--dark);
white-space: nowrap;
letter-spacing: 1px;
}
.search-wrap {
display: flex;
align-items: center;
justify-content: space-between;
border: 1px solid var(--dark);
flex: 1;
max-width: 420px;
margin: 0 24px;
}
.search-wrap select {
border: none;
border-right: 1px solid var(--dark);
padding: 10px 14px;
font-family: 'Inter', sans-serif;
font-size: 13px;
color: var(--mid);
background: transparent;
outline: none;
cursor: pointer;
}
.search-wrap input {
flex: 1;
border: none;
padding: 10px 5px 10px 10px;
font-size: 12px;
color: var(--mid);
outline: none;
background: transparent;
display: block;
}
.search-wrap input::placeholder {
color: var(--mid);
opacity: .6;
}
.search-wrap button {
border: none;
background: transparent;
padding: 10px 14px;
cursor: pointer;
display: flex;
align-items: center;
}
.search-wrap button svg {
width: 20px;
height: 20px;
}
.header-icons {
display: flex;
align-items: center;
gap: 18px;
}
.header-icons a {
display: flex;
align-items: center;
cursor: pointer;
color: var(--dark);
transition: opacity .2s;
}
.header-icons a:hover {
opacity: .6;
}
.header-icons svg {
width: 28px;
height: 28px;
}
.nav-bar {
display: flex;
align-items: center;
padding: 10px 80px;
gap: 0;
border-top: 1px solid rgba(54, 33, 62, .07);
justify-content: space-between;
}
.nav-bar .catalog-btn {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--mid);
margin-right: 32px;
cursor: pointer;
font-weight: 400;
transition: color .2s;
}
.nav-bar .catalog-btn:hover {
color: var(--dark);
}
.nav-links {
display: flex;
align-items: center;
gap: 28px;
flex: 1;
max-width: 430px;
}
.nav-links a {
font-size: 14px;
color: var(--mid);
transition: color .2s;
white-space: nowrap;
}
.nav-links a:hover {
color: var(--dark);
}
.phone-link {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--mid);
text-decoration: underline;
white-space: nowrap;
}
/* ── FOOTER ── */
footer {
background: var(--blue-gray);
}
.footer-container {
padding: 50px 80px 40px;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
gap: 40px;
margin-top: 60px;
}
.footer-logo {
font-family: 'Playfair Display', serif;
font-size: 30px;
color: rgba(184, 243, 255, .85);
margin-bottom: 8px;
}
.footer-col h4 {
font-size: 16px;
font-weight: 600;
color: rgba(184, 243, 255, .85);
text-transform: uppercase;
letter-spacing: .5px;
margin-bottom: 16px;
}
.footer-col ul {
list-style: none;
display: flex;
flex-direction: column;
gap: 10px;
}
.footer-col ul li a, .footer-col ul li {
font-size: 16px;
color: rgba(184, 243, 255, .8);
transition: opacity .2s;
}
.footer-col ul li a:hover {
opacity: .65;
}
/* ── RESPONSIVE ── */
@media (max-width: 900px) {
header, .header-top, .nav-bar {
padding-left: 24px;
padding-right: 24px;
}
footer {
grid-template-columns: 1fr 1fr;
padding: 40px 24px;
}
}

BIN
static/img/about-image.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

View File

@@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 495 495" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle id="Ellipse 1" cx="247.5" cy="247.5" r="247.5" fill="var(--fill-0, #63768D)"/>
</svg>

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
static/img/decor-promo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
static/img/hero.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
static/img/kitchen-sink.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

BIN
static/img/mixer.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
static/img/rubber-mat.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 KiB

BIN
static/img/stats-image.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
static/img/terra-mirror.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
static/img/toilet.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -0,0 +1,33 @@
<!-- FOOTER FRAGMENT -->
<footer>
<div class="container footer-container">
<div class="footer-col">
<div class="footer-logo">SantehRay</div>
</div>
<div class="footer-col">
<h4>ПОКУПАТЕЛЮ</h4>
<ul>
<li><a href="#">Каталог</a></li>
<li><a href="#">Услуги</a></li>
<li><a href="#">Акции</a></li>
<li><a href="#">Новинки</a></li>
</ul>
</div>
<div class="footer-col">
<h4>ПОМОЩЬ</h4>
<ul>
<li><a href="#">Доставка и оплата</a></li>
<li><a href="#">Гарантия и возврат</a></li>
<li>Ответы на вопросы</li>
<li><a href="#">Контакты</a></li>
</ul>
</div>
<div class="footer-col">
<h4>КОНТАКТЫ</h4>
<ul>
<li><a href="mailto:info@santehray.by">info@santehray.by</a></li>
<li>+375 (29) 688-18-19</li>
</ul>
</div>
</div>
</footer>

View File

@@ -0,0 +1,74 @@
<!-- HEADER FRAGMENT -->
<header>
<div class="container">
<div class="header-top">
<div class="logo"><a href="/">SantehRay</a></div>
<form action="">
<div class="search-wrap">
<label>
<select>
<option>Все категории</option>
<option>Сантехника</option>
<option>Декор</option>
</select>
</label>
<label>
<input class="search-input" type="text" placeholder="Кто ищет, тот найдет...">
</label>
<button>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-search" viewBox="0 0 16 16">
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0"></path>
</svg>
</button>
</div>
</form>
<div class="header-icons">
<a href="">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-heart" viewBox="0 0 16 16">
<path d="m8 2.748-.717-.737C5.6.281 2.514.878 1.4 3.053c-.523 1.023-.641 2.5.314 4.385.92 1.815 2.834 3.989 6.286 6.357 3.452-2.368 5.365-4.542 6.286-6.357.955-1.886.838-3.362.314-4.385C13.486.878 10.4.28 8.717 2.01zM8 15C-7.333 4.868 3.279-3.04 7.824 1.143q.09.083.176.171a3 3 0 0 1 .176-.17C12.72-3.042 23.333 4.867 8 15"></path>
</svg>
</a>
<a href="#">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-cart2" viewBox="0 0 16 16">
<path d="M0 2.5A.5.5 0 0 1 .5 2H2a.5.5 0 0 1 .485.379L2.89 4H14.5a.5.5 0 0 1 .485.621l-1.5 6A.5.5 0 0 1 13 11H4a.5.5 0 0 1-.485-.379L1.61 3H.5a.5.5 0 0 1-.5-.5M3.14 5l1.25 5h8.22l1.25-5zM5 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2m-2 1a2 2 0 1 1 4 0 2 2 0 0 1-4 0m9-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2m-2 1a2 2 0 1 1 4 0 2 2 0 0 1-4 0"></path>
</svg>
</a>
<a href="#">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-person" viewBox="0 0 16 16">
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6m2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0m4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4m-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10s-3.516.68-4.168 1.332c-.678.678-.83 1.418-.832 1.664z"></path>
</svg>
</a>
</div>
</div>
<nav class="nav-bar">
<a href="/catalog/" class="catalog-btn {% if active == 'catalog' %}active-page{% endif %}">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
stroke-width="2" width="18" height="18">
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
Каталог
</a>
<div class="nav-links">
<a class="{% if active == 'home' %}active-page{% endif %}" href="/">Главная</a>
<a class="{% if active == 'services' %}active-page{% endif %}" href="/services/">Услуги</a>
<a class="{% if active == 'shipping' %}active-page{% endif %}" href="/shipping/">Доставка</a>
<a class="{% if active == 'warranty' %}active-page{% endif %}" href="/warranty/">Гарантия</a>
<a class="{% if active == 'contacts' %}active-page{% endif %}" href="/contacts/">Контакты</a>
</div>
<a href="tel:+375296881819" class="phone-link">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor"
class="bi bi-telephone" viewBox="0 0 16 16">
<path d="M3.654 1.328a.678.678 0 0 0-1.015-.063L1.605 2.3c-.483.484-.661 1.169-.45 1.77a17.6 17.6 0 0 0 4.168 6.608 17.6 17.6 0 0 0 6.608 4.168c.601.211 1.286.033 1.77-.45l1.034-1.034a.678.678 0 0 0-.063-1.015l-2.307-1.794a.68.68 0 0 0-.58-.122l-2.19.547a1.75 1.75 0 0 1-1.657-.459L5.482 8.062a1.75 1.75 0 0 1-.46-1.657l.548-2.19a.68.68 0 0 0-.122-.58zM1.884.511a1.745 1.745 0 0 1 2.612.163L6.29 2.98c.329.423.445.974.315 1.494l-.547 2.19a.68.68 0 0 0 .178.643l2.457 2.457a.68.68 0 0 0 .644.178l2.189-.547a1.75 1.75 0 0 1 1.494.315l2.306 1.794c.829.645.905 1.87.163 2.611l-1.034 1.034c-.74.74-1.846 1.065-2.877.702a18.6 18.6 0 0 1-7.01-4.42 18.6 18.6 0 0 1-4.42-7.009c-.362-1.03-.037-2.137.703-2.877z"></path>
</svg>
+375 (29) 688-18-19
</a>
</nav>
</div>
</header>

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
{% load static %}
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Santehray - {% block title %}{{ title }}{% endblock %}</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="{% static 'css/normalize.css' %}">
<link rel="stylesheet" href="{% static 'css/style.css' %}">
{% block add_css %}
<!-- Additional CSS -->
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,57 @@
{% load static %}
<section class="about-section">
<div class="container">
<h2 class="about-title">О нас</h2>
<div class="about-left">
<div class="about-left-block">
<p class="about-left-subtitle">С 2000 года мы — не просто магазин сантехники, а надёжный партнёр для
тех, кто ценит комфорт,
качество и
спокойствие.</p>
<h3 class="about-left-suggestion">Мы предлагаем:</h3>
<div class="about-left-list">
<div class="about-left-list-item">
<div class="about-left-list-item-number">1</div>
<div class="about-left-list-item-content">
<span class="about-left-list-item-content-title">Сантехническое оборудование</span>
<span class="about-left-list-item-content-desc">Смесители, унитазы, мойки, душевые, умывальники, система фильтрации воды</span>
</div>
</div>
<div class="about-left-list-item">
<div class="about-left-list-item-number">2</div>
<div class="about-left-list-item-content">
<span class="about-left-list-item-content-title">Предметы декора</span>
<div class="about-left-list-item-content-desc">Зеркала, ролл-маты, дозаторы, корзины,
разделочные доски, система
разделения мусора
</div>
</div>
</div>
</div>
</div>
</div>
<div class="flex-right about-right">
<div class="about-right-block">
<p class="about-right-text">
Мы работаем только с проверенными поставщиками — европейскими и российскими
брендами, чья продукция прошла испытание временем, реальными квартирами и сотнями довольных
клиентов.</p>
<div class="about-right-stats">
<div class="about-right-stats-item">
<p class="about-right-stats-item-num">20+</p>
<p class="about-right-stats-item-label">лет работы</p>
</div>
<div class="about-right-stats-item">
<span class="about-right-stats-item-num">45 000+</span>
<span class="about-right-stats-item-label">довольных покупателей</span>
</div>
<div class="about-right-stats-item">
<span class="about-right-stats-item-num">5600+</span>
<span class="about-right-stats-item-label">товаров</span>
</div>
</div>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,42 @@
<!-- ADVANTAGES -->
<section class="advantages">
<div class="container">
<div class="advantages-list">
<h2 class="advantages-title">ПОЧЕМУ ВЫБИРАЮТ НАС?</h2>
<div class="advantages-item">
<div class="advantages-item-number">1</div>
<h3 class="advantages-item-title">КАЧЕСТВЕННЫЙ ТОВАР</h3>
<p class="advantages-item-subtitle">Работаем с проверенными поставщиками</p>
</div>
<div class="advantages-item">
<div class="advantages-item-number">2</div>
<h3 class="advantages-item-title">ЧЕСТНАЯ ГАРАНТИЯ</h3>
<p class="advantages-item-subtitle">Работаем с проверенными поставщиками</p>
</div>
<div class="advantages-item">
<div class="advantages-item-number">3</div>
<h3 class="advantages-item-title">БЫСТРАЯ ДОСТАВКА</h3>
<p class="advantages-item-subtitle">Огромный выбор сантехники в наличии и доставка со склада</p>
</div>
</div>
<div class="advantages-cards">
<div class="advantages-card advantages-card-left">
<div class="advantages-card-content">
<div class="flex-right">
<div class="advantages-card-splash">Новинки в каталоге</div>
<h2 class="advantages-card-title text-align-right">Сантехническое оборудование</h2>
<a href="/catalog/#santechnics" class="advantages-card-button">Смотреть</a>
</div>
</div>
</div>
<div class="advantages-card advantages-card-right">
<div class="advantages-card-content">
<div class="advantages-card-splash">Большая распродажа</div>
<h2 class="advantages-card-title">Предметы декора</h2>
<a href="/catalog/#santechnics" class="advantages-card-button">Смотреть</a>
</div>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,8 @@
<section class="kitchen-banner container">
<div class="kitchen-content">
<p>Успей заказать с большой выгодой и получите доставку в подарок!</p>
<h2>ГОТОВОЕ РЕШЕНИЕ ДЛЯ КУХНИ</h2>
<a href="#" class="active-page">Перейти</a>
</div>
{# <img src="{% static 'img/kitchen-banner.jpg' %}" alt="">#}
</section>

View File

@@ -0,0 +1,51 @@
<section class="faq-section container">
<h2>ОТВЕТЫ НА ВОПРОСЫ</h2>
<div class="faq-grid">
<div class="faq-item">
<div class="faq-icon">?</div>
<div class="faq-body">
<h4>Могу ли я отказаться от заказа при доставке?</h4>
<p>Да, вы можете отказаться приобретать модель. В таком случае, просим уведомить специалиста
магазина о отказе, не нарушать заводскую упаковку товара, чтобы он не утратил товарный вид. Но
вы должны будете оплатить доставку товара, даже в случае отказа.</p>
</div>
</div>
<div class="faq-item">
<div class="faq-icon">?</div>
<div class="faq-body">
<h4>Куда обращаться по гарантии?</h4>
<p>В случае обнаружения недостатка товара при получении либо при его использовании в течении
гарантийного срока, необходимо обратиться с письменной претензией на почту info@santehray.by или
в наш магазин. Далее с вами свяжутся для уточнения подробностей.</p>
</div>
</div>
<div class="faq-item">
<div class="faq-icon">?</div>
<div class="faq-body">
<h4>Можно ли покупать товары в рассрочку?</h4>
<p>Да. У нас есть система кредитования, где вы можете приобрести модель в рассрочку полностью или
частично. Для этого нужно обратиться в наш магазин и узнать подробности.</p>
</div>
</div>
<div class="faq-item">
<div class="faq-icon">?</div>
<div class="faq-body">
<h4>Можно ли где-то лично посмотреть товары?</h4>
<p>У нас есть физический магазин, который находится по адресу: Беларусь, г. Минск, ул. Тимирязева,
д. 123, к.1, пав. 59, там вы сможете ознакомится со всем ассортиментом.</p>
</div>
</div>
</div>
<div class="faq-cta">
<a href="#">
<div>?</div>
ЗАДАТЬ ВОПРОС
</a>
</div>
</section>

View File

@@ -0,0 +1,25 @@
{% load static %}
<!-- HERO -->
<section class="hero">
<div class="container">
<div class="flex-right">
<div class="hero-content">
<h1 class="hero-title">ДОБАВЬТЕ ЭСТЕТИЧНОСТИ<br>В СВОЙ ИНТЕРЬЕР</h1>
<div class="hero-subtitle-container">
<svg xmlns="http://www.w3.org/2000/svg" width="35" height="35" fill="currentColor"
class="bi bi-check-circle hero-checkmark" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"></path>
<path d="m10.97 4.97-.02.022-3.473 4.425-2.093-2.094a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05"></path>
</svg>
<p class="hero-subtitle">Подбор сантехнического оборудования на заказ.
<br>А также огромный выбор инсталляций и декора
<br>в наличии на складах города с быстрой доставкой
</p>
</div>
<div class="hero-button-container">
<a href="/catalog/" class="hero-button">ПЕРЕЙТИ В КАТАЛОГ</a>
</div>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,194 @@
{% load static %}
<section class="products-section container">
<h2 class="products-title">ПОПУЛЯРНЫЕ ТОВАРЫ</h2>
<div class="products-grid">
<article class="product product-1">
<div class="product-actions">
<button title="В избранное">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-heart" viewBox="0 0 16 16">
<path d="m8 2.748-.717-.737C5.6.281 2.514.878 1.4 3.053c-.523 1.023-.641 2.5.314 4.385.92 1.815 2.834 3.989 6.286 6.357 3.452-2.368 5.365-4.542 6.286-6.357.955-1.886.838-3.362.314-4.385C13.486.878 10.4.28 8.717 2.01zM8 15C-7.333 4.868 3.279-3.04 7.824 1.143q.09.083.176.171a3 3 0 0 1 .176-.17C12.72-3.042 23.333 4.867 8 15"></path>
</svg>
</button>
<button title="В корзину">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-cart2" viewBox="0 0 16 16">
<path d="M0 2.5A.5.5 0 0 1 .5 2H2a.5.5 0 0 1 .485.379L2.89 4H14.5a.5.5 0 0 1 .485.621l-1.5 6A.5.5 0 0 1 13 11H4a.5.5 0 0 1-.485-.379L1.61 3H.5a.5.5 0 0 1-.5-.5M3.14 5l1.25 5h8.22l1.25-5zM5 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2m-2 1a2 2 0 1 1 4 0 2 2 0 0 1-4 0m9-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2m-2 1a2 2 0 1 1 4 0 2 2 0 0 1-4 0"></path>
</svg>
</button>
</div>
</article>
<article class="product product-2">
</article>
<article class="product product-3">
</article>
<article class="product product-4">
</article>
<article class="product product-5">
</article>
<article class="product product-6">
</article>
</div>
{% comment %}
<!-- Card 1 — tall -->
<div class="product-card tall">
<img class="product-card-img" src="{% static 'img/kitchen-sink.jpg' %}" alt="Кухонная мойка">
<div class="product-info">
<div class="p-name">Кухонная мойка</div>
<div class="p-sub">Искусственный камень, врезная на столешницу</div>
<div class="p-price">1600 руб</div>
</div>
</div>
<!-- Card 2 -->
<div class="product-card">
<img class="product-card-img" src="{% static 'img/chopping-board.jpg' %}" alt="Разделочная доска"
style="aspect-ratio:4/3;">
<div class="product-actions">
<button title="В избранное">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/>
</svg>
</button>
<button title="В корзину">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/>
<line x1="3" y1="6" x2="21" y2="6"/>
<path d="M16 10a4 4 0 0 1-8 0"/>
</svg>
</button>
</div>
<div class="product-info">
<div class="p-name">Разделочная доска</div>
<div class="p-sub">Нержавеющая сталь</div>
<div class="p-price">50 руб</div>
</div>
</div>
<!-- Card 3 — tall -->
<div class="product-card tall">
<img class="product-card-img" src="{% static 'img/terra-mirror.jpg' %}" alt="Зеркало Terra">
<div class="product-actions">
<button title="В избранное">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/>
</svg>
</button>
<button title="В корзину">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/>
<line x1="3" y1="6" x2="21" y2="6"/>
<path d="M16 10a4 4 0 0 1-8 0"/>
</svg>
</button>
</div>
<div class="product-info">
<div class="p-name">Зеркало Terra</div>
<div class="p-sub">Холодная подсветка, фронтальная</div>
<div class="p-price">200 руб</div>
</div>
</div>
<!-- Card 4 -->
<div class="product-card">
<img class="product-card-img" src="{% static 'img/toilet.jpg' %}" alt="Унитаз"
style="aspect-ratio:4/3;">
<div class="product-actions">
<button title="В избранное">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/>
</svg>
</button>
<button title="В корзину">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/>
<line x1="3" y1="6" x2="21" y2="6"/>
<path d="M16 10a4 4 0 0 1-8 0"/>
</svg>
</button>
</div>
<div class="product-info">
<div class="p-name">Унитаз</div>
<div class="p-sub">Напольный с бачком, безободковый</div>
<div class="p-price">1600 руб</div>
</div>
</div>
<!-- Card 5 (коврик) -->
<div class="product-card">
<img class="product-card-img" src="{% static 'img/rubber-mat.jpg' %}" alt="Коврик"
style="aspect-ratio:4/3;">
<div class="product-actions">
<button title="В избранное">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/>
</svg>
</button>
<button title="В корзину">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/>
<line x1="3" y1="6" x2="21" y2="6"/>
<path d="M16 10a4 4 0 0 1-8 0"/>
</svg>
</button>
</div>
<div class="product-info">
<div class="p-name">Коврик для посуды</div>
<div class="p-sub">Мгновенно впитывает воду</div>
<div class="p-price">20 руб</div>
</div>
</div>
<!-- Card 6 (смеситель) -->
<div class="product-card">
<img class="product-card-img" src="{% static 'img/mixer.jpg' %}" alt="Смеситель"
style="aspect-ratio:4/3;">
<div class="product-actions">
<button title="В избранное">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/>
</svg>
</button>
<button title="В корзину">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/>
<line x1="3" y1="6" x2="21" y2="6"/>
<path d="M16 10a4 4 0 0 1-8 0"/>
</svg>
</button>
</div>
<div class="product-info">
<div class="p-name">Смеситель</div>
<div class="p-sub">Однорычажный смеситель</div>
<div class="p-price">340 руб</div>
</div>
</div>
</div>{% endcomment %}
<div class="products-footer">
<a href="#" class="btn-primary">ПЕРЕЙТИ В КАТАЛОГ</a>
</div>
</section>

View File

@@ -0,0 +1,16 @@
{% extends "_layouts/base.html" %}
{% load static %}
{% block title %}Главная{% endblock %}
{% block add_css %}
{% endblock %}
{% block content %}
{% include "_fragments/header.html" %}
{# TODO #}
В разработке
{% include "_fragments/footer.html" %}
{% endblock %}

27
templates/home/index.html Normal file
View File

@@ -0,0 +1,27 @@
{% extends "_layouts/base.html" %}
{% load static %}
{% block title %}Главная{% endblock %}
{% block add_css %}
<link rel="stylesheet" href="{% static "css/index.css" %}">
{% endblock %}
{% block content %}
<!-- HEADER -->
{% include "_fragments/header.html" with active="home" %}
{% include "home/_fragments/hero.html" %}
{% include 'home/_fragments/advantages.html' %}
{% include 'home/_fragments/about.html' %}
{% include 'home/_fragments/banner.html' %}
{% include 'home/_fragments/popular-products.html' %}
{% include 'home/_fragments/faq.html' %}
{% include "_fragments/footer.html" %}
{% endblock %}

View File

@@ -0,0 +1,16 @@
{% extends "_layouts/base.html" %}
{% load static %}
{% block title %}Главная{% endblock %}
{% block add_css %}
{% endblock %}
{% block content %}
{% include "_fragments/header.html" %}
{# TODO #}
В разработке
{% include "_fragments/footer.html" %}
{% endblock %}

View File

@@ -0,0 +1,16 @@
{% extends "_layouts/base.html" %}
{% load static %}
{% block title %}Главная{% endblock %}
{% block add_css %}
{% endblock %}
{% block content %}
{% include "_fragments/header.html" %}
{# TODO #}
В разработке
{% include "_fragments/footer.html" %}
{% endblock %}

View File

@@ -0,0 +1,39 @@
{% extends '_layouts/base.html' %}
{% load static %}
{% block title %}Вход{% endblock %}
{% block add_css %}
<link rel="stylesheet" href="{% static 'css/login.css' %}">
{% endblock %}
{% block content %}
<div class="full-page">
{% include "_fragments/header.html" %}
<div class="center-wrapper">
<form class="login-form" action="">
<h2>ВХОД</h2>
<div class="form-group">
<label class="form-label" for="login">Логин</label>
<input class="form-input" type="text" id="login">
</div>
<div class="form-group">
<label class="form-label" for="password">Пароль</label>
<input class="form-input" type="password" id="password">
</div>
<div class="form-group">
<div>
<input class="form-input" type="checkbox" id="persist">
<label class="form-label" for="persist">Оставаться в системе</label>
</div>
</div>
<div class="form-group">
<button type="submit">Войти</button>
</div>
</form>
</div>
{% include "_fragments/footer.html" %}
</div>
{% endblock %}

View File

View File

9
users/urls.py Normal file
View File

@@ -0,0 +1,9 @@
from django.urls import path
from users import views
urlpatterns = [
path('login/', views.login, name='login'),
path('register/', views.register, name='register'),
path('profile/', views.profile, name='profile')
]

View File

@@ -1,3 +1,14 @@
from django.shortcuts import render from django.shortcuts import render
# Create your views here. # Create your views here.
def login(request):
return render(request, 'users/login.html', context={})
def register(request):
return render(request, 'users/register.html', context={})
def profile(request):
return render(request, 'users/profile.html', context={})