- Created: static/css/components/post-form.css (textarea.autogrow with min/max height, overflow control) - Modified: templates/feed/post_form.html (replaced inline styles with CSS import) - Description: Extracted 13-line style block for autogrow textarea behavior - Result: Post form now uses reusable component CSS
88 lines
3.1 KiB
HTML
88 lines
3.1 KiB
HTML
{# templates/registration/logout.html #}
|
|
{% extends "base.html" %}
|
|
{% load static %}
|
|
|
|
{% block title %}Выход{% endblock %}
|
|
|
|
{% block extra_css %}
|
|
<link rel="stylesheet" href="{% static 'css/components/logout-modal.css' %}">
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
{# Перекрываем основной контент полноэкранным диалогом #}
|
|
<div class="ios-overlay" role="dialog" aria-modal="true" aria-labelledby="logoutTitle" aria-describedby="logoutText">
|
|
<div class="ios-sheet">
|
|
<div class="ios-grip" aria-hidden="true"></div>
|
|
<div class="ios-body">
|
|
{# аватар если есть, иначе красивая иконка выхода #}
|
|
{% if user.avatar %}
|
|
<div class="ios-ava">
|
|
<img src="{{ user.avatar.url }}" alt="">
|
|
</div>
|
|
{% else %}
|
|
<div class="ios-ico">
|
|
<i class="bi-box-arrow-right fs-3"></i>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<h1 id="logoutTitle" class="ios-title">Выйти из аккаунта?</h1>
|
|
<p id="logoutText" class="ios-sub">
|
|
{{ user.get_short_name|default:"Вы" }}, вы уверены, что хотите завершить сеанс?<br>
|
|
Вы всегда можете войти снова — данные не удаляются.
|
|
</p>
|
|
|
|
<form method="post" class="ios-actions" autocomplete="off">
|
|
{% csrf_token %}
|
|
<input type="hidden" name="next" value="{{ next|default:'' }}">
|
|
|
|
|
|
<button type="submit" class="btn ios-btn ios-btn-danger" id="confirmBtn">
|
|
Выйти
|
|
</button>
|
|
|
|
<a href="javascript:void(0)" class="btn ios-btn ios-btn-ghost text-decoration-none text-center" id="cancelBtn">
|
|
Отмена
|
|
</a>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
<script>
|
|
// UX: ESC = отмена, Enter на «Выйти», тап по фону = отмена
|
|
(function(){
|
|
const cancel = document.getElementById('cancelBtn');
|
|
const confirm = document.getElementById('confirmBtn');
|
|
const overlay = document.querySelector('.ios-overlay');
|
|
|
|
function goBack(){
|
|
// если есть referer/next — туда, иначе на главную
|
|
const params = new URLSearchParams(location.search);
|
|
const next = (params.get('next') || '').trim();
|
|
if (next) { location.href = next; return; }
|
|
if (document.referrer) { history.back(); return; }
|
|
location.href = "{% url 'auth_front:login' %}";
|
|
}
|
|
|
|
cancel?.addEventListener('click', goBack);
|
|
|
|
// клик по фону закрывает (но не по самой карточке)
|
|
overlay?.addEventListener('click', (e)=>{
|
|
if (e.target === overlay) goBack();
|
|
});
|
|
|
|
addEventListener('keydown', (e)=>{
|
|
if (e.key === 'Escape'){ e.preventDefault(); goBack(); }
|
|
if (e.key === 'Enter' && document.activeElement !== cancel){
|
|
// даём нативной форме отправиться
|
|
}
|
|
});
|
|
|
|
// автофокус на «Выйти»
|
|
setTimeout(()=> confirm?.focus(), 10);
|
|
})();
|
|
</script>
|
|
{% endblock %}
|