core/panel/styles.css
2025-05-21 01:34:02 +03:00

884 lines
15 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.

/**
* Основные стили приложения
*/
/* Сброс стилей */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
/* Общие стили */
:root {
--primary-color: #3498db;
--primary-dark: #2980b9;
--success-color: #2ecc71;
--success-light: #d1fae5;
--danger-color: #e74c3c;
--danger-light: #fee2e2;
--warning-color: #f39c12;
--warning-light: #fef3c7;
--text-color: #333;
--bg-color: #f5f5f5;
--card-bg: #fff;
--border-color: #ddd;
}
body {
font-family: system-ui, -apple-system, sans-serif;
margin: 0;
padding: 0;
background-color: var(--bg-color);
color: var(--text-color);
}
/* Общие элементы интерфейса */
.loading-screen, .loading {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 200px;
padding: 20px;
text-align: center;
color: var(--primary-color);
}
.loading-spinner {
border: 4px solid rgba(0, 0, 0, 0.1);
border-left-color: var(--primary-color);
border-radius: 50%;
width: 40px;
height: 40px;
margin-bottom: 20px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.error-message {
background-color: var(--danger-light);
border-left: 4px solid var(--danger-color);
color: var(--danger-color);
padding: 10px;
margin-bottom: 20px;
border-radius: 4px;
}
.success-message {
background-color: var(--success-light);
border-left: 4px solid var(--success-color);
color: var(--success-color);
padding: 10px;
margin-bottom: 20px;
border-radius: 4px;
}
.empty-state {
text-align: center;
padding: 40px;
color: #999;
font-style: italic;
}
/* Стили для формы и кнопок */
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: 500;
}
.form-group input {
width: 100%;
padding: 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
font-size: 16px;
}
button {
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 4px;
padding: 10px 15px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.2s;
width: 100%;
}
button:hover {
background-color: var(--primary-dark);
}
button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
/* Стили для страницы входа */
.login-page {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 20px;
}
.login-container {
background-color: var(--card-bg);
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 30px;
width: 100%;
max-width: 400px;
}
.login-container h1 {
margin-top: 0;
margin-bottom: 20px;
text-align: center;
color: var(--primary-color);
}
/* Стили для админ-панели */
.admin-page {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
min-height: 100vh;
display: flex;
flex-direction: column;
}
header {
background-color: var(--card-bg);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
padding: 15px 20px;
}
.header-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
width: 100%;
}
header h1 {
margin: 0;
color: var(--primary-color);
font-size: 24px;
}
.logout-button {
background-color: transparent;
color: var(--danger-color);
border: 1px solid var(--danger-color);
width: auto;
padding: 8px 16px;
font-size: 14px;
}
.logout-button:hover {
background-color: var(--danger-color);
color: white;
}
.admin-tabs {
display: flex;
border-bottom: 1px solid #ddd;
margin-bottom: 1.5rem;
gap: 10px;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
}
.admin-tabs button {
background: none;
border: none;
padding: 8px 16px;
cursor: pointer;
font-size: 16px;
border-bottom: 3px solid transparent;
transition: all 0.2s;
width: auto;
color: var(--text-color);
}
.admin-tabs button.active {
border-bottom-color: var(--primary-color);
color: var(--primary-color);
font-weight: 600;
background-color: transparent;
}
.admin-tabs button:hover {
background-color: rgba(52, 152, 219, 0.1);
}
main {
padding: 20px;
max-width: 1200px;
margin: 0 auto;
width: 100%;
flex-grow: 1;
}
/* Таблица пользователей */
.users-list {
overflow-x: auto;
margin-top: 1rem;
}
table {
width: 100%;
border-collapse: collapse;
border: 1px solid var(--border-color);
}
thead {
background-color: #f3f4f6;
}
th, td {
padding: 10px;
text-align: left;
border-bottom: 1px solid var(--border-color);
}
th {
font-weight: 600;
background-color: #f9f9f9;
}
tr:hover {
background-color: rgba(52, 152, 219, 0.05);
}
tr.blocked {
background-color: rgba(231, 76, 60, 0.05);
}
/* Статусы пользователей */
.status {
display: inline-block;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
font-weight: 600;
margin-right: 4px;
}
.status.active {
background-color: var(--success-light);
color: var(--success-color);
}
.status.blocked {
background-color: var(--danger-light);
color: var(--danger-color);
}
.status.muted {
background-color: var(--warning-light);
color: var(--warning-color);
}
/* Кнопки действий */
.actions {
display: flex;
gap: 5px;
}
.actions button {
padding: 5px 10px;
font-size: 12px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
width: auto;
}
button.block {
background-color: var(--danger-color);
}
button.unblock {
background-color: var(--success-color);
}
button.mute {
background-color: var(--warning-color);
}
button.unmute {
background-color: var(--primary-color);
}
/* Стили для редактирования ролей */
.roles-container {
display: flex;
align-items: center;
gap: 8px;
}
.roles-text {
flex: 1;
}
.edit-roles-button {
background: none;
border: none;
cursor: pointer;
font-size: 16px;
padding: 0;
opacity: 0.6;
transition: opacity 0.2s;
width: auto;
color: var(--primary-color);
}
.edit-roles-button:hover {
opacity: 1;
background-color: rgba(52, 152, 219, 0.1);
border-radius: 4px;
}
/* Модальное окно */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal-content {
background: white;
padding: 20px;
border-radius: 8px;
width: 90%;
max-width: 500px;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.modal-content h2 {
margin-top: 0;
color: var(--primary-color);
}
.roles-list {
margin: 16px 0;
}
.role-item {
margin-bottom: 12px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
}
.role-item:last-child {
border-bottom: none;
}
.role-item label {
display: flex;
align-items: center;
gap: 8px;
font-weight: 500;
}
.role-description {
margin-top: 4px;
margin-left: 24px;
font-size: 14px;
color: #6b7280;
}
.modal-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 20px;
}
.cancel-button {
color: #333 !important;
padding: 8px 16px;
background-color: #ccc;
width: auto;
border: 1px solid #ccc;
}
.save-button {
padding: 8px 16px;
background-color: var(--primary-color);
width: auto;
}
.save-button:hover {
background-color: var(--primary-dark);
}
/* Стили для пагинации */
.pagination {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20px;
padding: 10px 0;
flex-wrap: wrap;
gap: 10px;
}
.pagination-info {
color: #6b7280;
font-size: 14px;
}
.pagination-controls {
display: flex;
gap: 5px;
align-items: center;
}
.pagination-button {
min-width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 5px;
border: 1px solid var(--border-color);
background-color: white;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
}
.pagination-button:hover:not(:disabled) {
background-color: #f3f4f6;
border-color: #d1d5db;
}
.pagination-button.active {
background-color: var(--primary-color);
color: white;
border-color: var(--primary-color);
}
.pagination-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.pagination-ellipsis {
padding: 0 8px;
color: #6b7280;
}
.pagination-per-page {
display: flex;
align-items: center;
font-size: 14px;
color: #6b7280;
}
.pagination-per-page select {
margin-left: 8px;
padding: 4px 8px;
border: 1px solid var(--border-color);
border-radius: 4px;
background-color: white;
}
/* Поиск */
.users-controls {
margin-bottom: 16px;
}
.search-container {
max-width: 500px;
width: 100%;
}
.search-input-group {
display: flex;
width: 100%;
}
.search-input {
flex: 1;
padding: 8px 12px;
border: 1px solid var(--border-color);
border-radius: 4px 0 0 4px;
font-size: 14px;
}
.search-input:focus {
border-color: var(--primary-color);
outline: none;
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
}
.search-button {
padding: 8px 16px;
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 0 4px 4px 0;
cursor: pointer;
transition: background-color 0.2s;
font-size: 14px;
}
.search-button:hover {
background-color: var(--primary-dark);
}
/* Адаптивные стили */
@media (max-width: 768px) {
.pagination {
flex-direction: column;
align-items: start;
}
.actions {
flex-direction: column;
}
.users-list {
font-size: 14px;
}
th, td {
padding: 8px 5px;
}
.pagination-per-page {
margin-top: 10px;
}
.header-container {
flex-direction: column;
gap: 10px;
}
}
.loading-spinner {
width: 40px;
height: 40px;
border-radius: 50%;
animation: spin 6s linear infinite;
background-color: transparent;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Стили для вкладки с переменными окружения */
.env-variables-container {
margin-top: 1.5rem;
}
.env-section {
background-color: var(--card-bg);
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
padding: 20px;
margin-bottom: 20px;
}
.section-name {
margin-top: 0;
color: var(--primary-color);
font-size: 20px;
margin-bottom: 10px;
}
.section-description {
color: var(--text-secondary);
margin-bottom: 15px;
font-size: 14px;
}
.variable-edit-form {
margin-bottom: 20px;
}
.variable-description {
margin-top: 10px;
font-style: italic;
color: var(--text-secondary);
font-size: 14px;
}
.empty-value {
color: var(--text-secondary);
font-style: italic;
}
button.edit-button {
background-color: var(--primary-color);
color: white;
padding: 5px 10px;
font-size: 12px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
width: auto;
}
button.edit-button:hover {
background-color: var(--primary-dark);
}
.success-message {
background-color: var(--success-light);
color: var(--success-color);
padding: 10px 15px;
border-radius: 4px;
margin-bottom: 15px;
}
.error-message {
background-color: var(--danger-light);
color: var(--danger-color);
padding: 10px 15px;
border-radius: 4px;
margin-bottom: 15px;
}
/* Стили для модального окна редактирования */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
width: 100%;
max-width: 500px;
}
.modal-content h2 {
margin-top: 0;
color: var(--primary-color);
}
.modal-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 20px;
}
button.cancel-button {
background-color: var(--text-secondary);
color: white;
border: none;
border-radius: 4px;
padding: 8px 16px;
font-size: 14px;
cursor: pointer;
width: auto;
}
button.save-button {
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 4px;
padding: 8px 16px;
font-size: 14px;
cursor: pointer;
width: auto;
}
button.cancel-button:hover {
background-color: #999;
}
button.save-button:hover {
background-color: var(--primary-dark);
}
/* Стили для компонентов ролей */
.roles-cell {
max-width: 200px;
}
.roles-container {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.role-badge {
display: inline-flex;
align-items: center;
padding: 2px 6px;
border-radius: 12px;
background-color: rgba(0, 0, 0, 0.05);
margin: 2px 0;
white-space: nowrap;
font-size: 0.85em;
}
.role-icon {
margin-right: 4px;
font-size: 1.1em;
}
.edit-roles {
background-color: #8a2be2;
color: white;
border: none;
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
margin-left: 4px;
}
.edit-roles:hover {
background-color: #7b1fa2;
}
/* Стили компонентов ролей */
.roles-cell {
max-width: 200px;
}
.roles-container {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.role-badge {
display: inline-flex;
align-items: center;
padding: 2px 6px;
border-radius: 12px;
background-color: rgba(0, 0, 0, 0.05);
margin: 2px 0;
white-space: nowrap;
font-size: 0.85em;
}
.role-icon {
margin-right: 4px;
font-size: 1.1em;
}
.edit-roles {
background-color: #8a2be2;
color: white;
border: none;
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
margin-left: 4px;
}
.edit-roles:hover {
background-color: #7b1fa2;
}
/* Стили для сортировки таблицы */
th.sortable {
cursor: pointer;
user-select: none;
position: relative;
padding-right: 20px;
}
th.sortable:hover {
background-color: rgba(0, 0, 0, 0.05);
}
th.sortable.sorted {
background-color: rgba(65, 105, 225, 0.1);
}
.sort-icon {
display: inline-block;
position: absolute;
right: 5px;
top: 50%;
transform: translateY(-50%);
color: #888;
font-size: 14px;
}
th.sortable.sorted .sort-icon {
color: #4169e1;
font-weight: bold;
}
/* Стили для сортировки таблицы */
th.sortable {
cursor: pointer;
user-select: none;
position: relative;
padding-right: 20px;
}
th.sortable:hover {
background-color: rgba(0, 0, 0, 0.05);
}
th.sortable.sorted {
background-color: rgba(65, 105, 225, 0.1);
}
.sort-icon {
display: inline-block;
position: absolute;
right: 5px;
top: 50%;
transform: translateY(-50%);
color: #888;
font-size: 14px;
}
th.sortable.sorted .sort-icon {
color: #4169e1;
font-weight: bold;
}