/* Современные стили для форм */ /* Автор: Сергей Антропов - https://devops.org.ru */ :root { --input-border-color: #dee2e6; --input-focus-border-color: #667eea; --input-focus-box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25); --input-error-border-color: #dc3545; --input-error-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); --input-success-border-color: #198754; --input-success-box-shadow: 0 0 0 0.2rem rgba(25, 135, 84, 0.25); --form-bg: #ffffff; --form-border-radius: 0.75rem; --form-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --form-shadow-hover: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* Карточки форм */ .card { background: var(--form-bg); border: none; border-radius: var(--form-border-radius); box-shadow: var(--form-shadow); transition: var(--transition); overflow: hidden; } .card:hover { box-shadow: var(--form-shadow-hover); transform: translateY(-2px); } .card-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #fff; font-weight: 600; font-size: 1.25rem; padding: 1.25rem 1.5rem; border: none; border-radius: var(--form-border-radius) var(--form-border-radius) 0 0; } .card-body { padding: 2rem; } .card-footer { background: #f8f9fa; border-top: 1px solid #e9ecef; padding: 1.25rem 1.5rem; border-radius: 0 0 var(--form-border-radius) var(--form-border-radius); } /* Группы полей */ .form-group { margin-bottom: 1.75rem; position: relative; } .form-group:last-child { margin-bottom: 0; } /* Метки полей */ .form-label { font-weight: 600; font-size: 0.875rem; margin-bottom: 0.625rem; color: #374151; display: block; letter-spacing: 0.025em; text-transform: uppercase; transition: var(--transition); } .form-label::after { content: ''; display: block; width: 30px; height: 2px; background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); margin-top: 0.25rem; border-radius: 2px; transition: var(--transition); } .form-group:focus-within .form-label::after { width: 60px; } /* Поля ввода */ .form-control, .form-select { border: 2px solid var(--input-border-color); border-radius: 0.5rem; padding: 0.875rem 1rem; font-size: 1rem; transition: var(--transition); background-color: #fff; color: #1f2937; width: 100%; line-height: 1.5; } .form-control::placeholder { color: #9ca3af; opacity: 1; } .form-control:hover, .form-select:hover { border-color: #cbd5e1; } .form-control:focus, .form-select:focus { border-color: var(--input-focus-border-color); outline: 0; box-shadow: var(--input-focus-box-shadow); background-color: #fff; transform: translateY(-1px); } .form-control:disabled, .form-select:disabled { background-color: #f3f4f6; cursor: not-allowed; opacity: 0.6; } /* Состояния валидации */ .form-control.is-invalid, .form-select.is-invalid { border-color: var(--input-error-border-color); padding-right: calc(1.5em + 1rem); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath d='m5.8 3.6.4.4.4-.4m0 4.8h-.8'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right calc(0.5em + 0.25rem) center; background-size: calc(0.75em + 0.5rem) calc(0.75em + 0.5rem); } .form-control.is-invalid:focus, .form-select.is-invalid:focus { border-color: var(--input-error-border-color); box-shadow: var(--input-error-box-shadow); } .form-control.is-valid, .form-select.is-valid { border-color: var(--input-success-border-color); padding-right: calc(1.5em + 1rem); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right calc(0.5em + 0.25rem) center; background-size: calc(0.75em + 0.5rem) calc(0.75em + 0.5rem); } .form-control.is-valid:focus, .form-select.is-valid:focus { border-color: var(--input-success-border-color); box-shadow: var(--input-success-box-shadow); } /* Текстовые области */ textarea.form-control { min-height: 100px; resize: vertical; font-family: inherit; } /* Селекты */ .form-select { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right 0.75rem center; background-size: 16px 12px; padding-right: 2.5rem; appearance: none; cursor: pointer; } .form-select:focus { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23667eea' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); } /* Чекбоксы и переключатели */ .form-check { margin-bottom: 1rem; margin-top: 1rem; margin-left: 2rem !important; padding-left: 2rem; position: relative; } /* Отступ для чекбоксов внутри form-group, чтобы они были выровнены с текстовыми полями */ .form-group .form-check { margin-left: 0; padding-left: 2rem; } .form-check-input { width: 1.25em; height: 1.25em; margin-top: 0.125em; margin-left: -2rem; vertical-align: top; background-color: #fff; border: 2px solid var(--input-border-color); border-radius: 0.375em; cursor: pointer; transition: var(--transition); position: absolute; left: 0; top: 0.25em; } .form-check-input:hover { border-color: var(--input-focus-border-color); } .form-check-input:checked { background-color: #667eea; border-color: #667eea; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); } .form-check-input:focus { border-color: var(--input-focus-border-color); outline: 0; box-shadow: var(--input-focus-box-shadow); } .form-check-label { margin-left: 0; cursor: pointer; font-weight: 500; color: #374151; line-height: 1.6; } /* Переключатели (switches) */ .form-switch .form-check-input { width: 2.5em; height: 1.5em; border-radius: 2em; background-color: #d1d5db; border: none; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); background-position: left center; background-repeat: no-repeat; background-size: 1.25em 1.25em; transition: var(--transition); } .form-switch .form-check-input:checked { background-color: #667eea; background-position: right center; } .form-switch .form-check-input:focus { box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25); } /* Сообщения об ошибках */ .invalid-feedback { display: none; width: 100%; margin-top: 0.5rem; font-size: 0.875rem; color: var(--input-error-border-color); font-weight: 500; } .was-validated .form-control:invalid ~ .invalid-feedback, .was-validated .form-select:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback, .form-select.is-invalid ~ .invalid-feedback { display: block; animation: slideDown 0.3s ease; } @keyframes slideDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* Вспомогательный текст */ .form-text { margin-top: 0.5rem; font-size: 0.875rem; color: #6b7280; } /* Группы полей в ряд */ .form-row { display: flex; flex-wrap: wrap; margin-left: -0.5rem; margin-right: -0.5rem; } .form-row > * { padding-left: 0.5rem; padding-right: 0.5rem; } /* Форма авторизации */ .login-container { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 1rem; position: fixed; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden; z-index: 9999; } .login-container::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle, rgba(255, 255, 255, 0.1) 1px, transparent 1px); background-size: 50px 50px; animation: moveBackground 20s linear infinite; } @keyframes moveBackground { 0% { transform: translate(0, 0); } 100% { transform: translate(50px, 50px); } } .login-card { width: 100%; max-width: 420px; background: #fff; border-radius: 1.5rem; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); padding: 2.5rem; animation: fadeInUp 0.6s ease; position: relative; z-index: 1; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .login-card .card-header { text-align: center; font-size: 2rem; font-weight: 700; color: #1f2937; margin-bottom: 2rem; padding: 0; border: none; background: none; } .login-card .card-body { padding: 0; } .login-form .form-group { margin-bottom: 1.75rem; } .login-form .form-label { font-size: 0.875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: #374151; margin-bottom: 0.75rem; } .login-form .form-control { padding: 1rem 1.25rem; font-size: 1rem; border-radius: 0.75rem; border: 2px solid #e5e7eb; } .login-form .form-control:focus { border-color: #667eea; box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25); } /* Улучшенные отступы для форм */ .mb-2 { margin-bottom: 1rem !important; } .mb-3 { margin-bottom: 1.5rem !important; } .mt-3 { margin-top: 1.5rem !important; } /* Адаптивность */ @media (max-width: 768px) { .login-card { padding: 2rem 1.5rem; } .card-body { padding: 1.5rem; } .form-control, .form-select { font-size: 16px; /* Предотвращает зум на iOS */ } .form-label { font-size: 0.8125rem; } } /* Анимация появления полей */ .form-group { animation: fadeIn 0.4s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Стили для страниц форм */ .form-page { /* background: linear-gradient(180deg, #f8f9fa 0%, #e9ecef 100%); */ min-height: calc(100vh - 200px); padding: 2rem 0; } .form-page .card { border: none; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); } /* Улучшенные кнопки в формах */ .form-actions { display: flex; justify-content: flex-end; gap: 0.75rem; margin-top: 2rem; padding-top: 1.5rem; border-top: 1px solid #e5e7eb; } /* Priority Switch Styles */ .priority-switch-group { display: flex; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 0.5rem; } .priority-switch { display: none; } .priority-label { flex: 1; min-width: 100px; padding: 0.75rem 1rem; border: 2px solid #dee2e6; border-radius: 0.5rem; text-align: center; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); font-weight: 500; background: #ffffff; color: #495057; position: relative; overflow: hidden; } .priority-label::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: currentColor; opacity: 0.1; transform: scaleX(0); transform-origin: left; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .priority-label:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .priority-switch:checked + .priority-label { border-width: 3px; transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2); font-weight: 600; } .priority-switch:checked + .priority-label::before { transform: scaleX(1); } /* Priority Colors */ .priority-very-slow { border-color: #6c757d; color: #6c757d; } .priority-switch:checked + .priority-very-slow { background: linear-gradient(135deg, #6c757d 0%, #5a6268 100%); color: #ffffff; border-color: #5a6268; } .priority-slow { border-color: #0dcaf0; color: #0dcaf0; } .priority-switch:checked + .priority-slow { background: linear-gradient(135deg, #0dcaf0 0%, #0aa2c0 100%); color: #ffffff; border-color: #0aa2c0; } .priority-middle { border-color: #667eea; color: #667eea; } .priority-switch:checked + .priority-middle { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #ffffff; border-color: #764ba2; } .priority-fast { border-color: #ffc107; color: #ffc107; } .priority-switch:checked + .priority-fast { background: linear-gradient(135deg, #ffc107 0%, #ffb300 100%); color: #212529; border-color: #ffb300; } .priority-very-fast { border-color: #198754; color: #198754; } .priority-switch:checked + .priority-very-fast { background: linear-gradient(135deg, #198754 0%, #157347 100%); color: #ffffff; border-color: #157347; }