This commit is contained in:
EDeev 2025-12-09 18:06:44 +03:00
parent 34ee8ee686
commit a452e193c8
5 changed files with 579 additions and 226 deletions

View file

@ -1,72 +1,107 @@
/** /**
* Responsive Media Queries - All Adaptive Styles * Responsive Media Queries - Mobile-First Adaptive Styles
* Полная переработка адаптивной верстки
*/ */
/* Container adjustments */ /* ========================================
@media (max-width: 768px) { BREAKPOINT: < 1160px
.container { ======================================== */
padding: 0 var(--space-md); @media (max-width: 1160px) {
}
}
/* Navigation - Tablets & Mobile */ /* Контейнер */
@media (max-width: 992px) { .container {
padding: 0 var(--space-lg);
}
/* Header Navigation - Hide menu, show toggle button */
.nav-toggle { .nav-toggle {
display: flex; display: flex;
position: relative;
z-index: 1001;
} }
.nav-menu { .nav-menu {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
right: 0; width: 100%;
bottom: 0; height: 100vh;
background: var(--bg-dark); background: rgba(13, 13, 13, 0.98);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center;
gap: 0;
padding: var(--space-2xl); padding: var(--space-2xl);
gap: var(--space-sm); opacity: 0;
transform: translateX(100%); visibility: hidden;
transition: var(--transition); transform: scale(0.95);
z-index: var(--z-modal); transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1),
transform 0.4s cubic-bezier(0.4, 0, 0.2, 1),
visibility 0.4s;
z-index: 1000;
} }
.nav-menu.active { .nav-menu.active {
transform: translateX(0); opacity: 1;
visibility: visible;
transform: scale(1);
} }
.nav-menu li {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.3s ease, transform 0.3s ease;
margin: var(--space-sm) 0;
}
.nav-menu.active li {
opacity: 1;
transform: translateY(0);
}
.nav-menu.active li:nth-child(1) { transition-delay: 0.1s; }
.nav-menu.active li:nth-child(2) { transition-delay: 0.15s; }
.nav-menu.active li:nth-child(3) { transition-delay: 0.2s; }
.nav-menu.active li:nth-child(4) { transition-delay: 0.25s; }
.nav-menu.active li:nth-child(5) { transition-delay: 0.3s; }
.nav-menu.active li:nth-child(6) { transition-delay: 0.35s; }
.nav-link { .nav-link {
width: 100%; font-size: 1.5rem;
padding: var(--space-md); padding: var(--space-lg) var(--space-xl);
font-size: 1.1rem; width: auto;
min-width: 280px;
justify-content: center; justify-content: center;
border-radius: var(--radius-lg);
}
.nav-link i {
font-size: 1.2rem;
} }
.nav-auth { .nav-auth {
position: fixed; position: fixed;
bottom: var(--space-2xl); /* bottom: var(--space-2xl); */
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
z-index: var(--z-modal); z-index: 1001;
opacity: 0; opacity: 0;
pointer-events: none; visibility: hidden;
transition: var(--transition); transition: opacity 0.3s ease 0.4s, visibility 0.3s;
} }
.nav-menu.active ~ .nav-auth, .nav-menu.active ~ .nav-auth {
body.nav-open .nav-auth {
opacity: 1; opacity: 1;
pointer-events: auto; visibility: visible;
} }
.nav-user-name, body.nav-open {
.btn-text { overflow: hidden;
display: none;
} }
}
/* Bento Grid - Large Screens */ /* Главная страница - Bento Grid */
@media (max-width: 1200px) {
.bento-profile { .bento-profile {
grid-column: span 12; grid-column: span 12;
} }
@ -74,29 +109,52 @@
.bento-quick { .bento-quick {
grid-column: span 12; grid-column: span 12;
flex-direction: row; flex-direction: row;
flex-wrap: wrap;
} }
.bento-socials { .quick-card {
grid-column: span 6; flex: 1 1 calc(50% - var(--space-lg) / 2);
min-width: 200px;
} }
/* Технологический стек - исправление выравнивания */
.bento-skills, .bento-skills,
.skills-full { .skills-full {
grid-column: span 6;
}
.project-card.featured {
grid-column: span 12; grid-column: span 12;
} }
.project-card.regular { .skills-categories {
grid-column: span 6; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
justify-items: stretch;
} }
.skill-category {
width: 100%;
}
/* Карточки проектов - приведение к единому размеру */
/*.project-card.featured,
.project-card.regular,
.project-card.small { .project-card.small {
grid-column: span 4; grid-column: span 6;
}*/
.project-card.featured {
display: flex;
flex-direction: column;
} }
.project-card.featured .project-image {
height: 240px;
min-height: 240px;
}
/* Достижения - переход на 2 колонки */
.achievements-grid {
grid-template-columns: repeat(2, 1fr);
}
/* About страница */
.about-bio { .about-bio {
grid-column: span 12; grid-column: span 12;
} }
@ -113,83 +171,162 @@
grid-column: span 6; grid-column: span 6;
} }
.footer-grid { /* Blog */
grid-template-columns: repeat(2, 1fr); .blog-grid {
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
/* Contacts */
.contact-bento {
grid-template-columns: 1fr;
} }
} }
/* ========================================
/* Tablets */ BREAKPOINT: < 992px
======================================== */
@media (max-width: 992px) { @media (max-width: 992px) {
.bento-profile {
flex-direction: column; /* Ensure menu functionality */
text-align: center; .nav-menu {
padding: var(--space-xl); background: rgba(13, 13, 13, 0.99);
} }
.profile-photo img { .nav-link {
width: 160px; font-size: 1.4rem;
height: 160px; min-width: 260px;
}
/* Главная - центрирование "Backend Developer" */
.profile-info {
text-align: center;
}
.profile-title {
justify-content: center;
} }
.profile-buttons { .profile-buttons {
justify-content: center; justify-content: center;
} }
.bento-quick { /* Quick Cards */
flex-wrap: wrap;
}
.quick-card { .quick-card {
flex: 1 1 calc(33.333% - var(--space-lg)); flex: 1 1 calc(50% - var(--space-lg) / 2);
min-width: 150px;
}
.bento-socials,
.bento-skills,
.skills-full {
grid-column: span 12;
}
.project-card.featured {
grid-template-columns: 1fr;
}
.project-card.featured .project-image {
min-height: 200px;
} }
/* Карточки проектов */
/*.project-card.featured,
.project-card.regular,
.project-card.small { .project-card.small {
grid-column: span 6; grid-column: span 6;
}*/
/* Skills Full */
.skills-full-grid {
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
} }
.contact-bento { /* About страница */
grid-template-columns: 1fr;
}
.about-bento > .bento-card { .about-bento > .bento-card {
grid-column: span 12 !important; grid-column: span 12 !important;
} }
}
/* Mobile */ .stats-grid {
grid-template-columns: repeat(2, 1fr);
}
/* Filters */
.filters-wrapper {
flex-direction: column;
align-items: stretch;
gap: var(--space-lg);
}
.filter-group {
width: 100%;
flex-direction: column;
align-items: stretch;
}
.filter-buttons {
width: 100%;
justify-content: flex-start;
}
.filter-select {
width: 100%;
}
769}
/* ========================================
BREAKPOINT: < 768px
======================================== */
@media (max-width: 768px) { @media (max-width: 768px) {
/* Общие отступы */
:root { :root {
--container-padding: 1rem; --container-padding: 1rem;
} }
.container {
padding: 0 var(--space-md);
}
/* Navigation adjustments */
.nav-link {
font-size: 1.25rem;
min-width: 240px;
padding: var(--space-md) var(--space-lg);
}
.nav-user-name,
.btn-text {
display: none;
}
/* Hero и Page Headers */
.bento-hero { .bento-hero {
padding-top: 80px; padding-top: 90px;
min-height: auto;
} }
.page-header { .page-header {
padding-top: calc(80px + var(--space-xl)); padding-top: calc(90px + var(--space-xl));
padding-bottom: var(--space-xl);
} }
.article-full { .article-full {
padding-top: 80px; padding-top: 90px;
} }
/* Профиль на главной */
.bento-profile {
flex-direction: column;
text-align: center;
padding: var(--space-xl);
}
/*.profile-photo img {
width: 150px;
height: 150px;
}*/
.profile-info {
text-align: center;
}
.profile-buttons {
flex-direction: column;
width: 100%;
}
.profile-buttons .btn {
width: 100%;
}
/* Карточки проектов - одна колонка */
.project-card.featured,
.project-card.regular, .project-card.regular,
.project-card.small { .project-card.small {
grid-column: span 12; grid-column: span 12;
@ -199,68 +336,121 @@
grid-column: span 12; grid-column: span 12;
} }
.blog-grid { /* GitHub CTA секция */
grid-template-columns: 1fr; .github-cta-card {
flex-direction: column;
text-align: center;
gap: var(--space-lg);
} }
/* Достижения - новая компоновка */
.achievements-grid { .achievements-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.achievement-card { .achievement-card {
flex-direction: column; display: grid;
text-align: center; grid-template-columns: auto 1fr;
grid-template-rows: auto auto;
gap: var(--space-md);
align-items: start;
text-align: left;
} }
.achievement-icon {
grid-column: 1;
grid-row: 1;
width: 56px;
height: 56px;
font-size: 1.5rem;
}
.achievement-content {
grid-column: 2;
grid-row: 1 / 3;
}
.achievement-title {
margin-bottom: var(--space-sm);
}
/* Blog */
.blog-grid {
grid-template-columns: 1fr;
}
.search-form {
flex-direction: column;
gap: var(--space-sm);
}
.categories-list {
justify-content: flex-start;
}
/* Article Detail */
.article-meta-full { .article-meta-full {
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
gap: var(--space-md);
}
.article-meta-items {
flex-wrap: wrap;
gap: var(--space-md);
} }
.article-footer-full { .article-footer-full {
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
gap: var(--space-lg);
} }
.footer-grid { .article-reactions,
grid-template-columns: 1fr; .article-share {
text-align: center; width: 100%;
}
.footer-brand p {
max-width: none;
}
.footer-socials {
justify-content: center;
}
.footer-bottom {
flex-direction: column;
text-align: center;
}
.filters-wrapper {
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
gap: var(--space-sm);
} }
.filter-group { .reactions-buttons,
.share-buttons {
width: 100%; width: 100%;
justify-content: flex-start;
} }
.filter-buttons { /* Related Articles */
flex-wrap: wrap; .related-grid {
grid-template-columns: 1fr;
} }
.filter-select { /* About страница */
width: 100%; .about-bio-header {
}
.search-form {
flex-direction: column; flex-direction: column;
text-align: center;
gap: var(--space-lg);
} }
.about-bio-actions {
flex-direction: column;
width: 100%;
}
.about-bio-actions .btn {
width: 100%;
}
.stats-grid {
grid-template-columns: repeat(2, 1fr);
}
/* Contacts */
.form-row {
grid-template-columns: 1fr;
}
/* CTA Section */
.cta-section { .cta-section {
padding: var(--space-xl); padding: var(--space-xl);
} }
@ -274,12 +464,14 @@
width: 100%; width: 100%;
} }
/* Messages */
.messages-container { .messages-container {
right: var(--space-md); right: var(--space-md);
left: var(--space-md); left: var(--space-md);
max-width: none; max-width: none;
} }
/* Back to Top */
.back-to-top { .back-to-top {
bottom: var(--space-md); bottom: var(--space-md);
right: var(--space-md); right: var(--space-md);
@ -287,88 +479,109 @@
height: 44px; height: 44px;
} }
.github-cta-card { /* Footer */
flex-direction: column;
text-align: center;
}
.footer-minimal-content { .footer-minimal-content {
flex-direction: column; flex-direction: column;
text-align: center; text-align: center;
gap: var(--space-md); gap: var(--space-md);
} }
}
/* Small Mobile */ /* Pagination */
@media (max-width: 576px) { .pagination {
.quick-card {
flex: 1 1 100%;
}
.socials-grid {
grid-template-columns: 1fr;
}
.stats-grid {
grid-template-columns: 1fr;
}
.skills-categories {
grid-template-columns: 1fr;
}
.profile-buttons {
flex-direction: column;
width: 100%;
}
.profile-buttons .btn {
width: 100%;
}
.about-bio-header {
flex-direction: column;
text-align: center;
}
.about-bio-actions {
flex-direction: column;
}
.about-bio-actions .btn {
width: 100%;
}
.share-buttons {
flex-wrap: wrap;
}
.related-grid {
grid-template-columns: 1fr;
}
.pagination-numbers {
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
} }
.error-code { /* Gallery */
font-size: 5rem; .carousel-container {
min-height: 300px;
} }
.social-icon-link { .carousel-slide img {
font-size: 1.5rem; max-height: 300px;
padding: var(--space-xs);
} }
.social-icons-inline { .gallery-collage {
gap: var(--space-lg); grid-template-columns: repeat(2, 1fr);
} }
.form-row { /* Links */
.links-grid {
grid-template-columns: 1fr;
}
}
/* ========================================
BREAKPOINT: < 576px
======================================== */
@media (max-width: 576px) {
/* Typography */
h1 { font-size: 2rem; }
h2 { font-size: 1.5rem; }
h3 { font-size: 1.25rem; }
/* Navigation */
.nav-link {
font-size: 1.1rem;
min-width: 200px;
}
/* Profile */
/*.profile-photo img {
width: 120px;
height: 120px;
}*/
/* Quick Cards */
.quick-card {
flex: 1 1 100%;
}
/* Skills */
.skills-categories {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.skills-full-grid {
grid-template-columns: 1fr;
}
/* Stats */
.stats-grid {
grid-template-columns: 1fr;
}
/* Social Links */
.social-icons-inline {
gap: var(--space-md);
justify-content: center;
}
.social-icon-link {
font-size: 1.25rem;
}
/* Share Buttons */
.share-buttons {
flex-wrap: wrap;
}
/* Pagination */
.pagination-numbers {
flex-wrap: wrap;
justify-content: center;
gap: var(--space-xs);
}
.pagination-num,
.pagination-btn {
min-width: 36px;
height: 36px;
padding: 0;
}
/* Gallery */
.carousel-container { .carousel-container {
min-height: 250px; min-height: 250px;
} }
@ -377,11 +590,141 @@
max-height: 250px; max-height: 250px;
} }
.gallery-collage { .carousel-btn {
grid-template-columns: repeat(2, 1fr); width: 40px;
height: 40px;
} }
.links-grid { .gallery-collage {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
/* Error Pages */
.error-code {
font-size: 4rem;
}
}
/* ========================================
BREAKPOINT: < 400px
======================================== */
@media (max-width: 400px) {
/* Достижения - вертикальная компоновка */
.achievement-card {
grid-template-columns: 1fr;
grid-template-rows: auto auto auto;
text-align: center;
gap: var(--space-md);
}
.achievement-icon {
grid-column: 1;
grid-row: 1;
justify-self: center;
margin: 0 auto;
}
.achievement-content {
grid-column: 1;
grid-row: 2;
}
.achievement-title {
text-align: center;
}
.achievement-subtitle,
.achievement-excerpt,
.achievement-date {
text-align: center;
}
/* Typography */
h1 { font-size: 1.75rem; }
h2 { font-size: 1.35rem; }
/* Buttons */
.btn {
padding: 0.65rem 1.25rem;
font-size: 0.85rem;
}
/* Navigation */
.nav-link {
font-size: 1rem;
min-width: 180px;
padding: var(--space-sm) var(--space-md);
}
/* Profile */
/*.profile-photo img {
width: 100px;
height: 100px;
}*/
/* CTA Section */
.cta-icon {
width: 60px;
height: 60px;
font-size: 1.5rem;
}
/* Carousel */
.carousel-container {
min-height: 200px;
}
.carousel-slide img {
max-height: 200px;
}
.carousel-btn {
width: 36px;
height: 36px;
font-size: 0.9rem;
}
.carousel-prev {
left: var(--space-sm);
}
.carousel-next {
right: var(--space-sm);
}
/* Article Body */
.article-body {
font-size: 1rem;
}
/* Messages */
.message {
padding: var(--space-sm) var(--space-md);
font-size: 0.85rem;
}
}
/* ========================================
LANDSCAPE ORIENTATION
======================================== */
@media (max-height: 600px) and (orientation: landscape) {
.nav-menu {
padding: var(--space-lg);
justify-content: flex-start;
overflow-y: auto;
}
.nav-link {
font-size: 1rem;
padding: var(--space-sm) var(--space-md);
}
.nav-auth {
position: relative;
transform: none;
bottom: auto;
left: auto;
margin-top: var(--space-lg);
}
} }

View file

@ -38,7 +38,12 @@
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
Пароль Пароль
</label> </label>
<div class="password-input-wrapper">
{{ form.password }} {{ form.password }}
<button type="button" class="password-toggle" onclick="togglePasswordVisibility('id_password', this)" aria-label="Показать пароль">
<i class="far fa-eye"></i>
</button>
</div>
{% if form.password.errors %} {% if form.password.errors %}
<span class="form-error">{{ form.password.errors.0 }}</span> <span class="form-error">{{ form.password.errors.0 }}</span>
{% endif %} {% endif %}

View file

@ -51,7 +51,12 @@
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
Пароль * Пароль *
</label> </label>
<div class="password-input-wrapper">
{{ form.password }} {{ form.password }}
<button type="button" class="password-toggle" onclick="togglePasswordVisibility('id_password', this)" aria-label="Показать пароль">
<i class="far fa-eye"></i>
</button>
</div>
{% if form.password.errors %} {% if form.password.errors %}
<span class="form-error">{{ form.password.errors.0 }}</span> <span class="form-error">{{ form.password.errors.0 }}</span>
{% endif %} {% endif %}
@ -62,19 +67,49 @@
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
Подтвердите пароль * Подтвердите пароль *
</label> </label>
<div class="password-input-wrapper">
{{ form.password_confirm }} {{ form.password_confirm }}
<button type="button" class="password-toggle" onclick="togglePasswordVisibility('id_password_confirm', this)" aria-label="Показать пароль">
<i class="far fa-eye"></i>
</button>
</div>
{% if form.password_confirm.errors %} {% if form.password_confirm.errors %}
<span class="form-error">{{ form.password_confirm.errors.0 }}</span> <span class="form-error">{{ form.password_confirm.errors.0 }}</span>
{% endif %} {% endif %}
</div> </div>
<div class="form-group captcha-group"> <div class="form-group captcha-group">
<div class="smart-captcha-wrapper" style="height: 100px;">
<div id="register-captcha-container"
class="smart-captcha"
data-sitekey="{{ smartcaptcha_client_key }}"
data-hl="ru"></div>
{{ form.captcha }} {{ form.captcha }}
</div>
{% if form.captcha.errors %} {% if form.captcha.errors %}
<span class="form-error">{{ form.captcha.errors.0 }}</span> <span class="form-error">{{ form.captcha.errors.0 }}</span>
{% endif %} {% endif %}
</div> </div>
<script>
document.addEventListener('DOMContentLoaded', function() {
function initRegisterCaptcha() {
if (window.smartCaptcha) {
window.smartCaptcha.render('register-captcha-container', {
sitekey: '{{ smartcaptcha_client_key }}',
hl: 'ru',
callback: function(token) {
document.getElementById('smart-captcha-token').value = token;
}
});
} else {
setTimeout(initRegisterCaptcha, 100);
}
}
initRegisterCaptcha();
});
</script>
<button type="submit" class="btn btn-primary btn-lg btn-full"> <button type="submit" class="btn btn-primary btn-lg btn-full">
<i class="fas fa-user-plus"></i> <i class="fas fa-user-plus"></i>
Зарегистрироваться Зарегистрироваться

View file

@ -30,11 +30,11 @@
<div class="search-input-wrapper"> <div class="search-input-wrapper">
<i class="fas fa-search"></i> <i class="fas fa-search"></i>
<input type="text" name="q" value="{{ search_query }}" placeholder="Поиск статей..." class="search-input"> <input type="text" name="q" value="{{ search_query }}" placeholder="Поиск статей..." class="search-input">
{% if search_query %} <!-- {% if search_query %}
<a href="{% url 'blog' %}" class="search-clear"> <a href="{% url 'blog' %}" class="search-clear">
<i class="fas fa-times"></i> <i class="fas fa-times"></i>
</a> </a>
{% endif %} {% endif %} -->
</div> </div>
<button type="submit" class="btn btn-primary">Найти</button> <button type="submit" class="btn btn-primary">Найти</button>
</form> </form>
@ -97,11 +97,13 @@
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a> <a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
</h2> </h2>
<!--
{% if article.sub_title %} {% if article.sub_title %}
<p class="article-subtitle">{{ article.sub_title }}</p> <p class="article-subtitle">{{ article.sub_title }}</p>
{% endif %} {% endif %}
-->
<p class="article-excerpt">{{ article.excerpt|truncatewords:25 }}</p> <p class="article-excerpt">{{ article.excerpt|truncatewords:30 }}</p>
<div class="article-footer"> <div class="article-footer">
<div class="article-stats"> <div class="article-stats">

View file

@ -112,38 +112,6 @@
</div> </div>
</div> </div>
<!-- Social Links Card -->
<!-- <div class="bento-card bento-socials" data-aos="fade-up" data-aos-delay="200">
<h3 class="bento-card-title">
<i class="fas fa-share-alt"></i>
Социальные сети
</h3>
<div class="socials-grid">
{% if site_settings.telegram_url %}
<a href="{{ site_settings.telegram_url }}" target="_blank" rel="noopener" class="social-link">
<i class="fab fa-telegram"></i>
<span>Telegram</span>
</a>
{% endif %}
{% if site_settings.github_url %}
<a href="{{ site_settings.github_url }}" target="_blank" rel="noopener" class="social-link">
<i class="fab fa-github"></i>
<span>GitHub</span>
</a>
{% endif %}
<a href="mailto:{{ site_settings.owner_email }}" class="social-link">
<i class="fas fa-envelope"></i>
<span>Email</span>
</a>
{% if site_settings.owner_phone %}
<a href="tel:{{ site_settings.owner_phone|cut:' '|cut:'('|cut:')'|cut:'-' }}" class="social-link">
<i class="fas fa-phone"></i>
<span>Телефон</span>
</a>
{% endif %}
</div>
</div> -->
<!-- Skills Card --> <!-- Skills Card -->
<div class="bento-card skills-full" data-aos="fade-up" data-aos-delay="200"> <!-- skills-full in class --> <div class="bento-card skills-full" data-aos="fade-up" data-aos-delay="200"> <!-- skills-full in class -->
<div class="skills-header"> <div class="skills-header">
@ -200,7 +168,7 @@
<!-- GitHub CTA Card --> <!-- GitHub CTA Card -->
{% if site_settings.github_url %} {% if site_settings.github_url %}
<div class="project-card github-cta" data-aos="fade-up" data-aos-delay="500"> <div class="project-card github-cta regular" data-aos="fade-up" data-aos-delay="500">
<div class="github-cta-content"> <div class="github-cta-content">
<i class="fab fa-github"></i> <i class="fab fa-github"></i>
<p>Ещё 12 проектов на GitHub</p> <p>Ещё 12 проектов на GitHub</p>