Files
M-CTF-2025/rodchenko/app/templates/base.html
2025-12-14 10:39:18 +03:00

629 lines
16 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>РОДЧЕНКО — Аукцион Супрематизма</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=Oswald:wght@400;500;700&family=Playfair+Display:wght@700;900&display=swap" rel="stylesheet">
<style>
:root {
--red: #E41E26;
--black: #1A1A1A;
--cream: #F5F0E6;
--yellow: #FFD100;
--blue: #003366;
--white: #FFFFFF;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Oswald', sans-serif;
background: var(--cream);
color: var(--black);
min-height: 100vh;
position: relative;
overflow-x: hidden;
display: flex;
flex-direction: column;
}
body::before {
content: '';
position: fixed;
top: -100px;
right: -100px;
width: 400px;
height: 400px;
background: var(--red);
opacity: 0.1;
transform: rotate(45deg);
z-index: 0;
}
body::after {
content: '';
position: fixed;
bottom: -50px;
left: -50px;
width: 200px;
height: 200px;
background: var(--black);
border-radius: 50%;
opacity: 0.05;
z-index: 0;
}
.navbar {
background: var(--black);
padding: 0;
position: relative;
z-index: 100;
box-shadow: 0 4px 0 var(--red);
}
.navbar-inner {
max-width: 1400px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: stretch;
}
.logo {
display: flex;
align-items: center;
padding: 15px 30px;
background: var(--red);
text-decoration: none;
position: relative;
clip-path: polygon(0 0, calc(100% - 20px) 0, 100% 100%, 0 100%);
padding-right: 50px;
transition: all 0.3s ease;
}
.logo:hover {
background: #C41920;
}
.logo-text {
font-family: 'Playfair Display', serif;
font-weight: 900;
font-size: 28px;
color: var(--white);
letter-spacing: 4px;
text-transform: uppercase;
}
.logo-sub {
font-size: 10px;
color: var(--yellow);
letter-spacing: 2px;
margin-left: 15px;
text-transform: uppercase;
font-weight: 500;
}
.nav-links {
display: flex;
align-items: stretch;
}
.nav-link {
display: flex;
align-items: center;
padding: 0 25px;
color: var(--cream);
text-decoration: none;
font-size: 14px;
font-weight: 500;
letter-spacing: 2px;
text-transform: uppercase;
transition: all 0.2s ease;
position: relative;
}
.nav-link:hover {
background: var(--red);
color: var(--white);
}
.nav-link::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 3px;
background: var(--yellow);
transition: all 0.2s ease;
transform: translateX(-50%);
}
.nav-link:hover::after {
width: 100%;
}
.nav-balance {
display: flex;
align-items: center;
padding: 0 30px;
background: var(--yellow);
color: var(--black);
font-weight: 700;
font-size: 16px;
letter-spacing: 1px;
clip-path: polygon(20px 0, 100% 0, 100% 100%, 0 100%);
padding-left: 40px;
}
.balance-icon {
margin-right: 8px;
font-size: 20px;
}
.main-content {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 40px 30px;
position: relative;
z-index: 10;
flex: 1;
box-sizing: border-box;
}
.alerts {
margin-bottom: 30px;
}
.alert {
padding: 15px 25px;
margin-bottom: 10px;
font-weight: 500;
letter-spacing: 1px;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
animation: slideIn 0.3s ease;
}
@keyframes slideIn {
from {
transform: translateX(-20px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.alert-success {
background: var(--black);
color: var(--yellow);
border-left: 5px solid var(--yellow);
}
.alert-danger {
background: var(--red);
color: var(--white);
border-left: 5px solid var(--black);
}
.alert-close {
background: none;
border: none;
color: inherit;
font-size: 24px;
cursor: pointer;
opacity: 0.7;
transition: opacity 0.2s;
}
.alert-close:hover {
opacity: 1;
}
.btn {
display: inline-block;
padding: 12px 30px;
font-family: 'Oswald', sans-serif;
font-size: 14px;
font-weight: 500;
letter-spacing: 2px;
text-transform: uppercase;
text-decoration: none;
border: none;
cursor: pointer;
transition: all 0.2s ease;
position: relative;
overflow: hidden;
}
.btn-primary {
background: var(--red);
color: var(--white);
}
.btn-primary:hover {
background: #C41920;
transform: translateY(-2px);
box-shadow: 0 4px 0 var(--black);
}
.btn-secondary {
background: var(--black);
color: var(--cream);
}
.btn-secondary:hover {
background: #333;
transform: translateY(-2px);
box-shadow: 0 4px 0 var(--red);
}
.btn-success {
background: var(--yellow);
color: var(--black);
}
.btn-success:hover {
background: #E5BC00;
transform: translateY(-2px);
box-shadow: 0 4px 0 var(--black);
}
.btn-outline {
background: transparent;
color: var(--black);
border: 2px solid var(--black);
}
.btn-outline:hover {
background: var(--black);
color: var(--cream);
}
.btn-small {
padding: 8px 16px;
font-size: 12px;
}
.card {
background: var(--white);
border: none;
box-shadow: 8px 8px 0 var(--black);
position: relative;
transition: all 0.2s ease;
width: 100%;
}
.card:hover {
transform: translate(-4px, -4px);
box-shadow: 12px 12px 0 var(--black);
}
.card-header {
background: var(--black);
color: var(--cream);
padding: 15px 20px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
font-size: 14px;
}
.card-body {
padding: 25px;
}
.card-title {
font-family: 'Playfair Display', serif;
font-weight: 700;
font-size: 18px;
margin-bottom: 15px;
color: var(--black);
}
.form-group {
margin-bottom: 20px;
}
.form-label {
display: block;
margin-bottom: 8px;
font-weight: 500;
letter-spacing: 1px;
text-transform: uppercase;
font-size: 12px;
color: var(--black);
}
.form-control {
width: 100%;
padding: 12px 15px;
font-family: 'Oswald', sans-serif;
font-size: 16px;
border: 2px solid var(--black);
background: var(--cream);
color: var(--black);
transition: all 0.2s ease;
}
.form-control:focus {
outline: none;
border-color: var(--red);
box-shadow: 4px 4px 0 var(--red);
}
.form-control::placeholder {
color: #999;
}
textarea.form-control {
resize: vertical;
min-height: 100px;
}
.form-text {
margin-top: 8px;
font-size: 12px;
color: #666;
}
.badge {
display: inline-block;
padding: 6px 12px;
font-size: 11px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
}
.badge-success {
background: var(--yellow);
color: var(--black);
}
.badge-info {
background: var(--blue);
color: var(--white);
}
h1, h2, h3, h4, h5 {
font-family: 'Playfair Display', serif;
font-weight: 700;
color: var(--black);
}
.section-title {
font-size: 32px;
margin-bottom: 30px;
position: relative;
display: inline-block;
}
.section-title::after {
content: '';
position: absolute;
bottom: -10px;
left: 0;
width: 60px;
height: 5px;
background: var(--red);
}
.text-muted {
color: #666;
font-size: 13px;
}
.text-price {
font-size: 20px;
font-weight: 700;
color: var(--black);
}
.text-price span {
color: var(--red);
}
.grid {
display: grid;
gap: 30px;
}
.grid-2 {
grid-template-columns: repeat(2, 1fr);
}
.grid-3 {
grid-template-columns: repeat(3, 1fr);
}
.grid-4 {
grid-template-columns: repeat(4, 1fr);
}
@media (max-width: 1200px) {
.grid-4 {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 900px) {
.grid-3, .grid-4 {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
.grid-2, .grid-3, .grid-4 {
grid-template-columns: 1fr;
}
}
.art-preview {
background: var(--white);
border: 3px solid var(--black);
position: relative;
overflow: hidden;
}
.art-preview canvas {
display: block;
width: 100%;
height: 100%;
}
.decorative-line {
width: 100%;
height: 3px;
background: repeating-linear-gradient(
90deg,
var(--red) 0px,
var(--red) 20px,
var(--black) 20px,
var(--black) 40px
);
margin: 30px 0;
}
.info-block {
background: var(--black);
color: var(--cream);
padding: 15px 20px;
margin-bottom: 20px;
}
.info-block code {
background: var(--red);
color: var(--white);
padding: 2px 8px;
font-family: monospace;
}
.layout-sidebar {
display: grid;
grid-template-columns: 1fr 380px;
gap: 40px;
}
@media (max-width: 1000px) {
.layout-sidebar {
grid-template-columns: 1fr;
}
}
.layout-center {
max-width: 500px;
margin: 0 auto;
}
.mb-1 { margin-bottom: 10px; }
.mb-2 { margin-bottom: 20px; }
.mb-3 { margin-bottom: 30px; }
.mt-2 { margin-top: 20px; }
.mt-3 { margin-top: 30px; }
.footer {
background: var(--black);
color: var(--cream);
text-align: center;
padding: 30px;
margin-top: auto;
position: relative;
}
.footer::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 5px;
background: var(--red);
}
.footer-text {
font-size: 12px;
letter-spacing: 3px;
text-transform: uppercase;
}
.fade-in {
animation: fadeIn 0.5s ease;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.diagonal-stripe {
position: absolute;
width: 200%;
height: 60px;
background: var(--red);
transform: rotate(-3deg);
left: -50%;
z-index: -1;
}
</style>
</head>
<body>
<nav class="navbar">
<div class="navbar-inner">
<a href="{{ url_for('index') }}" class="logo">
<span class="logo-text">Родченко</span>
<span class="logo-sub">Аукцион</span>
</a>
<div class="nav-links">
{% if session.user_id %}
<a class="nav-link" href="{{ url_for('search') }}">Поиск</a>
<a class="nav-link" href="{{ url_for('profile') }}">Профиль</a>
<a class="nav-link" href="{{ url_for('logout') }}">Выход</a>
<div class="nav-balance">
<span class="balance-icon"></span>
{{ balance if balance else 0 }} ₽
</div>
{% else %}
<a class="nav-link" href="{{ url_for('login') }}">Вход</a>
<a class="nav-link" href="{{ url_for('register') }}">Регистрация</a>
{% endif %}
</div>
</div>
</nav>
<main class="main-content fade-in">
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<div class="alerts">
{% for category, message in messages %}
<div class="alert alert-{{ 'danger' if category == 'error' else 'success' }}">
<span>{{ message }}</span>
<button class="alert-close" onclick="this.parentElement.remove()">×</button>
</div>
{% endfor %}
</div>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</main>
<footer class="footer">
<p class="footer-text">MCTF 2025 • Супрематизм • Искусство Будущего</p>
</footer>
</body>
</html>