/* backend/static/css/message-reactions.css */ /* Контейнер реакций */ .message-reactions { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 8px; align-items: center; } /* Кнопка реакции */ .reaction-button { display: inline-flex; align-items: center; gap: 4px; padding: 4px 8px; border: 1px solid #dee2e6; border-radius: 12px; background: #f8f9fa; cursor: pointer; transition: all 0.2s ease; font-size: 14px; line-height: 1; } .reaction-button:hover { background: #e9ecef; border-color: #adb5bd; transform: scale(1.05); } /* Активная реакция (пользователь уже отреагировал) */ .reaction-button.active { background: #e7f1ff; border-color: #0d6efd; color: #0d6efd; } .reaction-button.active:hover { background: #cfe2ff; } /* Эмодзи внутри кнопки */ .reaction-button .emoji { font-size: 16px; line-height: 1; } /* Счётчик реакций */ .reaction-button .count { font-size: 12px; font-weight: 500; color: #495057; } .reaction-button.active .count { color: #0d6efd; } /* Кнопка добавления реакции */ .reaction-button.add-reaction { opacity: 0; transition: opacity 0.2s ease; } /* Показывать кнопку добавления при наведении на сообщение (только на десктопе без контекстного меню) */ @media (hover: hover) and (pointer: fine) { [data-message-id]:not(.message-context-menu-enabled):hover .reaction-button.add-reaction, .message-reactions:hover .reaction-button.add-reaction { opacity: 1; } } /* Если есть хотя бы одна реакция, всегда показывать кнопку добавления */ .message-reactions:has(.reaction-button:not(.add-reaction)) .add-reaction { opacity: 1; } /* Полностью скрыть кнопку "+" если включено контекстное меню */ .message-context-menu-enabled .reaction-button.add-reaction { display: none; } /* Кнопка добавления реакции */ .reaction-button.add-reaction { border-style: dashed; opacity: 0.6; } .reaction-button.add-reaction:hover { opacity: 1; border-style: solid; } /* Пикер эмодзи */ .emoji-picker { background: white; border: 1px solid #dee2e6; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); padding: 8px; min-width: 200px; } .emoji-picker-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; } .emoji-picker-button { width: 40px; height: 40px; border: 1px solid transparent; border-radius: 6px; background: transparent; cursor: pointer; font-size: 24px; display: flex; align-items: center; justify-content: center; transition: all 0.15s ease; } .emoji-picker-button:hover { background: #f8f9fa; border-color: #dee2e6; transform: scale(1.1); } .emoji-picker-button:active { transform: scale(0.95); } /* Анимация появления */ @keyframes reactionPop { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.2); } 100% { transform: scale(1); opacity: 1; } } .reaction-button.new { animation: reactionPop 0.3s ease; } /* Адаптивность для мобильных */ @media (max-width: 576px) { .reaction-button { padding: 3px 6px; font-size: 12px; } .reaction-button .emoji { font-size: 14px; } .reaction-button .count { font-size: 11px; } .emoji-picker-grid { grid-template-columns: repeat(6, 1fr); } .emoji-picker-button { width: 36px; height: 36px; font-size: 20px; } } /* Темная тема (опционально) */ @media (prefers-color-scheme: dark) { .reaction-button { background: #343a40; border-color: #495057; color: #f8f9fa; } .reaction-button:hover { background: #495057; border-color: #6c757d; } .reaction-button.active { background: #0d3c61; border-color: #0d6efd; color: #4dabf7; } .reaction-button.active .count { color: #4dabf7; } .emoji-picker { background: #212529; border-color: #495057; } .emoji-picker-button:hover { background: #343a40; border-color: #495057; } }