Corp/backend/static/css/components/recipientPicker.css
Игорь Надеин e68404c5ee refactor(requests): Улучшен UX выбора получателей в стиле email-клиента
Переработан RecipientPicker компонент:
✨ Chip-based UI (как в Gmail/Outlook)
- Пользователи отображаются как chips с крестиком для удаления
- Autocomplete с живым поиском по имени/email
- Dropdown с аватарами и должностями пользователей

� Интуитивный интерфейс:
- Структура To:/CC:/Отделы: (как в почтовых клиентах)
- Получатели всегда видны (убраны collapse)
- Кнопка '+ Копия' для показа поля CC
- Inline флаг 'Всем сотрудникам'

� Улучшенная верстка:
- Модальные окна расширены до modal-lg
- Получатели перенесены в начало (как тема в email)
- Добавлены иконки для визуальной группировки
- Добавлены emoji в типы заявлений для удобства

� CSS обновлен:
- Email-style компактный дизайн
- Фокус-состояния для inputs
- Hover-эффекты для dropdown items
- Адаптивность для мобильных устройств
- Поддержка темной темы

� UX улучшения:
- Поиск с автодополнением вместо select
- Визуальные аватары пользователей (инициалы)
- Показ должности и email в dropdown
- Автофокус после добавления пользователя
- Ограничение результатов поиска до 10
2025-12-02 18:09:19 +03:00

270 lines
4.9 KiB
CSS
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.

/* Recipient Picker - Email-style Component */
.recipient-picker-email {
font-size: 0.9375rem;
}
/* Строка получателей (To:/CC:/Отделы:) */
.recipient-row {
display: flex;
align-items: flex-start;
gap: 0.75rem;
padding: 0.75rem 0;
border-bottom: 1px solid var(--bs-border-color);
}
.recipient-row:last-child {
border-bottom: none;
}
/* Метка (To:/CC:/Отделы:) */
.recipient-label {
min-width: 80px;
padding-top: 0.5rem;
color: var(--bs-secondary);
font-weight: 500;
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0;
}
.recipient-label i {
font-size: 1.1em;
}
/* Поле ввода */
.recipient-field {
flex: 1;
display: flex;
align-items: flex-start;
gap: 0.5rem;
flex-wrap: wrap;
}
/* Wrapper для chips + input */
.recipient-input-wrapper {
flex: 1;
min-width: 300px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.375rem;
padding: 0.375rem 0.5rem;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
position: relative;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.recipient-input-wrapper:focus-within {
border-color: var(--bs-primary);
box-shadow: 0 0 0 0.15rem rgba(var(--bs-primary-rgb), 0.15);
}
/* Input внутри wrapper */
.recipient-input {
flex: 1;
min-width: 200px;
border: none;
outline: none;
padding: 0.25rem;
font-size: inherit;
background: transparent;
}
.recipient-input::placeholder {
color: var(--bs-secondary-color);
opacity: 0.7;
}
/* Chips (выбранные пользователи/отделы) */
.recipient-chip {
display: inline-flex;
align-items: center;
gap: 0.375rem;
padding: 0.25rem 0.5rem;
background: var(--bs-primary);
color: white;
border-radius: 1rem;
font-size: 0.875rem;
white-space: nowrap;
transition: background-color 0.15s;
}
.recipient-chip:hover {
background: var(--bs-primary-dark, #0056b3);
}
.recipient-chip.chip-cc {
background: var(--bs-secondary);
}
.recipient-chip.chip-cc:hover {
background: var(--bs-secondary-dark, #5a6268);
}
.chip-remove {
background: none;
border: none;
padding: 0;
color: white;
cursor: pointer;
display: flex;
align-items: center;
opacity: 0.8;
transition: opacity 0.15s;
}
.chip-remove:hover {
opacity: 1;
}
.chip-remove i {
font-size: 1.1em;
line-height: 1;
}
/* Chips для отделов */
.recipient-chips {
display: inline-flex;
flex-wrap: wrap;
gap: 0.375rem;
align-items: center;
}
/* Dropdown с autocomplete */
.recipient-dropdown {
position: absolute;
top: 100%;
left: 0;
right: 0;
margin-top: 0.25rem;
background: white;
border: 1px solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
max-height: 300px;
overflow-y: auto;
z-index: 1050;
}
.dropdown-item-user {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.625rem 1rem;
cursor: pointer;
transition: background-color 0.15s;
}
.dropdown-item-user:hover {
background-color: var(--bs-light);
}
.dropdown-item-empty {
padding: 0.75rem 1rem;
color: var(--bs-secondary);
text-align: center;
font-size: 0.875rem;
}
/* Аватар пользователя */
.user-avatar-small {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--bs-primary);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 0.75rem;
flex-shrink: 0;
}
/* Информация о пользователе */
.user-info {
flex: 1;
min-width: 0;
}
.user-name {
font-weight: 500;
color: var(--bs-body-color);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.user-subtitle {
font-size: 0.8125rem;
color: var(--bs-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Подсказки */
.alert-sm {
padding: 0.5rem 0.75rem;
margin-top: 0.75rem;
font-size: 0.875rem;
}
/* Адаптивность */
@media (max-width: 768px) {
.recipient-row {
flex-direction: column;
gap: 0.5rem;
}
.recipient-label {
min-width: auto;
padding-top: 0;
}
.recipient-input-wrapper {
min-width: 100%;
}
.recipient-input {
min-width: 150px;
}
}
@media (max-width: 576px) {
.recipient-chip {
font-size: 0.8125rem;
padding: 0.2rem 0.4rem;
}
.user-avatar-small {
width: 28px;
height: 28px;
font-size: 0.7rem;
}
.dropdown-item-user {
padding: 0.5rem 0.75rem;
}
}
/* Темная тема (если нужна) */
@media (prefers-color-scheme: dark) {
.recipient-input-wrapper {
background: var(--bs-dark);
border-color: var(--bs-gray-700);
}
.recipient-dropdown {
background: var(--bs-dark);
border-color: var(--bs-gray-700);
}
.dropdown-item-user:hover {
background-color: var(--bs-gray-800);
}
}