Corp/backend/static/scss/components/_chat-detail.scss

490 lines
12 KiB
SCSS
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.

/**
* chat-detail.scss
* Стили страницы детального чата: layout, scroll, bubbles, composer
*/
/* ─────────────────────────────────────────────────────────────
PAGE LAYOUT
────────────────────────────────────────────────────────────── */
/* прибиваем низ страницы и добавляем воздух снизу */
main.main {
padding-bottom: 0 !important;
}
/* ===== Контейнер страницы чата ===== */
@supports (height: 100svh) {
.chat-root {
height: calc(100svh - var(--navbar-h));
}
}
.chat-root > .row {
height: 100%;
min-height: 0;
}
.chat-col {
display: flex;
flex-direction: column;
height: 93%;
min-height: 0;
}
.section-header {
flex: 0 0 auto;
}
/* ─────────────────────────────────────────────────────────────
CHAT BOX
────────────────────────────────────────────────────────────── */
.card.chat-box {
position: relative;
flex: 1 1 auto;
min-height: 0;
display: grid;
grid-template-rows: 1fr auto; /* лента + композер */
overflow: hidden;
margin-bottom: 0;
background: var(--bs-body-bg);
}
/* ─────────────────────────────────────────────────────────────
CHAT SCROLL (с кастомным скроллбаром)
────────────────────────────────────────────────────────────── */
.chat-scroll {
overflow-y: auto;
padding: var(--space-2);
min-height: 0;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
scrollbar-width: thin;
scrollbar-gutter: stable both-edges;
overscroll-behavior: contain;
scrollbar-color: color-mix(in srgb, var(--bs-body-color), transparent 70%) transparent;
}
.chat-scroll:hover {
scrollbar-color: color-mix(in srgb, var(--bs-body-color), transparent 55%) transparent;
}
.chat-scroll::-webkit-scrollbar {
width: 10px;
height: 10px;
}
.chat-scroll::-webkit-scrollbar-track {
background: transparent;
margin-block: 0;
}
.chat-scroll::-webkit-scrollbar-thumb {
background-color: color-mix(in srgb, var(--bs-body-color), transparent 75%);
border-radius: 999px;
border: 3px solid transparent;
background-clip: padding-box;
}
.chat-scroll:hover::-webkit-scrollbar-thumb {
background-color: color-mix(in srgb, var(--bs-body-color), transparent 55%);
}
[data-bs-theme="dark"] .chat-scroll {
scrollbar-color: color-mix(in srgb, var(--bs-body-color), transparent 78%) transparent;
}
[data-bs-theme="dark"] .chat-scroll:hover {
scrollbar-color: color-mix(in srgb, var(--bs-body-color), transparent 60%) transparent;
}
[data-bs-theme="dark"] .chat-scroll::-webkit-scrollbar-thumb {
background-color: color-mix(in srgb, var(--bs-body-color), transparent 78%);
}
[data-bs-theme="dark"] .chat-scroll:hover::-webkit-scrollbar-thumb {
background-color: color-mix(in srgb, var(--bs-body-color), transparent 60%);
}
@media (hover: none), (pointer: coarse) {
.chat-scroll {
scrollbar-width: none;
}
.chat-scroll::-webkit-scrollbar {
display: none;
}
}
/* ─────────────────────────────────────────────────────────────
COMPOSER (Modern Messenger Style)
────────────────────────────────────────────────────────────── */
.chat-composer {
position: sticky;
bottom: 0;
border-top: none;
box-shadow: inset 0 1px 0 var(--bs-border-color);
border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit;
background-clip: padding-box;
background: color-mix(in srgb, var(--bs-body-bg) 94%, transparent);
padding: var(--space-1) var(--space-2) calc(var(--space-1) + env(safe-area-inset-bottom)) var(--space-2);
backdrop-filter: blur(8px);
z-index: 1;
}
.composer-wrap {
display: flex;
flex-direction: column;
gap: var(--space-1);
}
.chat-composer .message-field {
background: color-mix(in srgb, var(--bs-body-bg) 96%, transparent);
border: 1px solid color-mix(in srgb, var(--bs-border-color), transparent 30%);
}
.chat-composer .message-input {
max-height: 180px;
}
// Стили кнопок наследуются из custom-bootstrap.scss (glassmorphism)
.chat-composer .btn-send {
box-shadow: 0 4px 16px rgba(var(--bs-primary-rgb), 0.35);
}
.chat-composer .message-emoji .dropdown-menu {
background: var(--bs-body-bg);
}
/* Превью вложений */
.attachment-preview {
padding: var(--space-1) 0;
max-height: 200px;
overflow-y: auto;
max-width: 100%;
width: 100%;
}
.attachment-item {
background: var(--bs-secondary-bg);
transition: background-color 0.15s ease;
max-width: 100%; // Ограничиваем ширину контейнера
}
/* Обрезка текста в форме загрузки файлов */
.attachment-item .flex-grow-1 {
min-width: 0; // Важно для flex-элементов с text-truncate внутри
overflow: hidden; // Предотвращаем выход контента за границы
}
.attachment-item .text-truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
}
/* Вложения в сообщениях */
.bubble .attachment-item {
background: transparent;
padding: 0;
margin-bottom: 8px;
}
.bubble .attachment-item a {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
border-radius: 0.5rem;
text-decoration: none;
border: none;
transition: all 0.2s ease;
max-width: 100%;
word-break: break-word;
}
// Attachment links in regular messages (other person)
.bubble-other .attachment-item a {
background: rgba(0, 0, 0, 0.05);
color: inherit;
}
.bubble-other .attachment-item a:hover {
background: rgba(0, 0, 0, 0.08);
}
// Attachment links in own messages
.bubble-me .attachment-item a {
background: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.95);
}
.bubble-me .attachment-item a:hover {
background: rgba(255, 255, 255, 0.25);
}
// Icons in attachments
.bubble .attachment-item a i {
font-size: 1.1rem;
flex-shrink: 0;
}
.bubble-me .attachment-item a i {
color: rgba(255, 255, 255, 0.9);
}
// Text truncation for file names
.bubble .attachment-item a span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0; // Important for flex items
}
.message-attachments video,
.message-attachments img,
.message-attachments audio {
max-width: 100%;
width: auto;
border-radius: 8px;
}
.chat-media {
display: inline-block;
width: auto !important;
max-width: min(640px, 85vw);
max-height: 520px;
height: auto !important;
border-radius: 12px;
background: rgba(0, 0, 0, 0.08);
content-visibility: auto;
}
.message-attachments .attachment-item > a,
.message-attachments .attachment-item > video,
.message-attachments .attachment-item > img {
display: inline-flex;
max-width: 100%;
}
.chat-media--video {
background: #000;
object-fit: contain;
}
.chat-media--image {
object-fit: cover;
}
.message-pending .chat-media {
min-width: 90px;
min-height: 64px;
}
.message-pending .bubble {
position: relative;
opacity: 0.8;
}
.message-pending .message-status {
color: rgba(255, 255, 255, 0.8);
}
.bubble-other .message-status {
color: rgba(0, 0, 0, 0.5);
}
.message-attachments .text-secondary {
color: inherit;
opacity: 0.7;
}
.bubble-me .message-attachments .text-secondary {
color: rgba(255, 255, 255, 0.9) !important;
opacity: 1;
}
.bubble-me .message-attachments .fw-semibold {
color: rgba(255, 255, 255, 0.95) !important;
}
.bubble-me .message-attachments i {
color: rgba(255, 255, 255, 0.9) !important;
}
.history-loader {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 0.75rem 0;
color: var(--bs-secondary-color);
}
.history-loader .spinner-border {
width: 1rem;
height: 1rem;
}
/* Выпадающее меню вложений */
.dropdown-menu {
min-width: 200px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
padding: 8px;
}
.dropdown-item {
border-radius: 8px;
padding: 10px 12px;
transition: background-color 0.15s ease;
}
.dropdown-item:hover {
background: var(--bs-secondary-bg);
}
.dropdown-item i {
width: 24px;
}
.composer-tools {
display: flex;
gap: var(--space-1);
align-items: center;
}
/* ─────────────────────────────────────────────────────────────
SCROLL TO BOTTOM BUTTON
────────────────────────────────────────────────────────────── */
.scroll-to-bottom {
position: absolute;
right: var(--space-2);
bottom: 4.25rem;
z-index: 2;
display: none;
width: 44px;
height: 44px;
border-radius: 50% !important;
padding: 0 !important;
border: none !important;
background: var(--bs-primary) !important;
color: #fff !important;
box-shadow: 0 4px 16px rgba(var(--bs-primary-rgb), 0.25) !important;
transition: transform 0.2s ease, box-shadow 0.2s ease;
display: inline-flex;
align-items: center;
justify-content: center;
opacity: 0;
pointer-events: none;
i {
font-size: 1.25rem;
}
&:hover {
transform: scale(1.08);
box-shadow: 0 6px 20px rgba(var(--bs-primary-rgb), 0.35) !important;
}
&:active {
transform: scale(0.95);
}
}
.scroll-to-bottom.show {
display: inline-flex;
opacity: 1;
pointer-events: auto;
animation: fadeInUp 0.3s ease;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ─────────────────────────────────────────────────────────────
BUBBLES & AVATARS
────────────────────────────────────────────────────────────── */
.bubble {
border-radius: 16px;
padding: var(--space-1) var(--space-2);
word-break: break-word;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
}
.bubble-me {
background: color-mix(in srgb, var(--bs-primary) 92%, #fff 0%);
color: #fff;
}
.bubble-other {
background: var(--bs-secondary-bg);
color: var(--bs-body-color);
}
.mini-ava {
width: 32px;
height: 32px;
border-radius: 9999px;
overflow: hidden;
display: grid;
place-items: center;
}
.mini-ava img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
/* ─────────────────────────────────────────────────────────────
DIVIDERS (день / непрочитанные)
────────────────────────────────────────────────────────────── */
.day-divider,
.unread-divider {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-1);
margin: var(--space-1) 0 var(--space-2);
font-size: 0.85rem;
line-height: 1;
font-weight: 700;
pointer-events: none;
user-select: none;
}
.day-divider::before,
.day-divider::after,
.unread-divider::before,
.unread-divider::after {
content: "";
flex: 1 1 auto;
height: 1px;
background: color-mix(in srgb, var(--bs-border-color), transparent 30%);
}
.day-divider > span,
.unread-divider > span {
flex: 0 0 auto;
padding: 0 var(--space-1);
background: transparent;
}
.day-divider {
color: var(--bs-secondary-color);
}
.unread-divider {
color: var(--bs-danger);
}