Files
DevOpsLab/app/static/css/forms.css
Сергей Антропов 1fbf9185a2 feat: добавлена пометка типа операции (Build/Push) в истории сборок Dockerfile
- Добавлена колонка 'Тип' во все таблицы истории сборок
- Для push операций отображается registry вместо платформ
- Сохранение пользователя при создании push лога
- Исправлена ошибка с logger в push_docker_image endpoint
- Улучшено отображение истории сборок с визуальными индикаторами
2026-02-15 22:59:02 +03:00

597 lines
14 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.

/* Современные стили для форм */
/* Автор: Сергей Антропов - 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;
}