core/panel/styles.css
Untone c48f5f9368
All checks were successful
Deploy on push / deploy (push) Successful in 5s
0.5.7-shouts-admin
2025-06-28 13:47:08 +03:00

984 lines
17 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: #000000;
--primary-dark: #333333;
--primary-light: #F5F5F5;
--success-color: #000000;
--success-light: #F0F0F0;
--danger-color: #000000;
--danger-light: #F0F0F0;
--warning-color: #000000;
--warning-light: #F0F0F0;
--text-color: #000000;
--text-secondary: #666666;
--bg-color: #FFFFFF;
--card-bg: #FFFFFF;
--border-color: #E0E0E0;
--font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
body {
font-family: var(--font-family);
margin: 0;
padding: 0;
background-color: var(--bg-color);
color: var(--text-color);
line-height: 1.5;
}
/* Общие элементы интерфейса */
.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: 12px 16px;
margin-bottom: 20px;
border-radius: 8px;
font-size: 14px;
display: flex;
align-items: center;
gap: 10px;
}
.success-message {
background-color: var(--success-light);
border-left: 4px solid var(--success-color);
color: var(--success-color);
padding: 12px 16px;
margin-bottom: 20px;
border-radius: 8px;
font-size: 14px;
display: flex;
align-items: center;
gap: 10px;
}
.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: 12px;
border: 1px solid var(--border-color);
border-radius: 8px;
font-size: 14px;
transition: all 0.2s ease;
}
.form-group input:focus {
outline: none;
border-color: var(--text-color);
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);
}
button {
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 8px;
padding: 10px 16px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
width: 100%;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
}
button:hover {
background-color: var(--primary-dark);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
}
button:disabled {
background-color: #E5E9F2;
color: #A0AEC0;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* Стили для страницы входа */
.login-page {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 20px;
background-color: var(--bg-color);
}
.login-container {
background-color: var(--card-bg);
border-radius: 16px;
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
padding: 40px;
width: 100%;
max-width: 440px;
border: none;
text-align: center;
}
.login-container h1 {
margin-top: 0;
margin-bottom: 24px;
text-align: center;
color: var(--text-color);
font-size: 28px;
font-weight: 700;
}
.login-logo {
width: 120px;
height: auto;
margin-bottom: 24px;
display: block;
margin-left: auto;
margin-right: auto;
}
/* Стили для админ-панели */
.admin-page {
max-width: 1260px;
margin: 0 auto;
padding: 20px;
min-height: 100vh;
display: flex;
flex-direction: column;
}
header {
background-color: var(--card-bg);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
padding: 15px 20px;
border-radius: 10px;
margin-bottom: 24px;
}
.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%;
padding: 0 10px;
}
header h1 {
margin: 0;
color: var(--text-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;
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(211, 47, 47, 0.15);
}
.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: 10px 16px;
cursor: pointer;
font-size: 14px;
border-bottom: 2px solid transparent;
transition: all 0.2s;
width: auto;
color: var(--text-secondary);
font-weight: 500;
}
.admin-tabs button.active {
border-bottom-color: var(--text-color);
color: var(--text-color);
font-weight: 600;
background-color: transparent;
}
.admin-tabs button:hover:not(.active) {
color: var(--text-color);
border-bottom-color: #E5E9F2;
}
.admin-tabs button:hover {
background-color: rgba(0, 0, 0, 0.05);
}
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: separate;
border-spacing: 0;
border: none;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
background-color: var(--card-bg);
}
thead {
background-color: #F5F7FA;
}
th, td {
padding: 14px 16px;
text-align: left;
border-bottom: 1px solid var(--border-color);
font-size: 14px;
}
th {
font-weight: 600;
color: var(--text-secondary);
background-color: #F5F7FA;
text-transform: uppercase;
font-size: 12px;
letter-spacing: 0.05em;
}
tr:hover {
background-color: rgba(0, 0, 0, 0.03);
}
/* Стили для редактирования ролей */
.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: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 8px;
border: 1px solid var(--border-color);
background-color: white;
color: var(--text-color);
border-radius: 6px;
cursor: pointer;
transition: all 0.2s ease;
font-size: 14px;
}
.pagination-button:hover:not(:disabled) {
background-color: #f3f4f6;
border-color: #d1d5db;
}
.pagination-button.active {
background-color: var(--text-color);
color: white;
border-color: var(--text-color);
font-weight: 600;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
}
.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: 10px 14px;
border: 1px solid var(--border-color);
border-radius: 8px 0 0 8px;
font-size: 14px;
transition: all 0.2s ease;
}
.search-input:focus {
border-color: var(--text-color);
outline: none;
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);
}
.search-button {
padding: 10px 16px;
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 0 8px 8px 0;
cursor: pointer;
transition: all 0.2s ease;
font-size: 14px;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 6px;
}
.search-button:hover {
background-color: var(--primary-dark);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
}
/* Адаптивные стили */
@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: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
padding: 24px;
margin-bottom: 24px;
border: 1px solid var(--border-color);
}
.section-name {
margin-top: 0;
color: var(--text-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: 6px 12px;
font-size: 12px;
border: none;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s ease;
width: auto;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 4px;
}
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: #EDF2FC;
color: var(--primary-color);
border: 1px solid #DCE7FD;
border-radius: 8px;
padding: 10px 16px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
width: auto;
transition: all 0.2s ease;
}
button.save-button {
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 8px;
padding: 10px 16px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
width: auto;
transition: all 0.2s ease;
}
button.cancel-button:hover {
background-color: #DCE7FD;
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(76, 125, 216, 0.1);
}
button.save-button:hover {
background-color: var(--primary-dark);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(76, 125, 216, 0.15);
}
/* Стили для компонентов ролей */
.roles-cell {
max-width: 200px;
}
.roles-container {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.role-badge {
display: inline-flex;
align-items: center;
padding: 4px 10px;
border-radius: 20px;
background-color: #F5F5F5;
color: var(--text-color);
margin: 2px 0;
white-space: nowrap;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.role-badge:hover {
background-color: #E0E0E0;
}
.edit-role-badge {
background-color: #E0E0E0;
border: 1px dashed #999;
}
.edit-role-badge:hover {
background-color: #D0D0D0;
}
.role-icon {
margin-right: 6px;
font-size: 14px;
}
/* Стили для сортировки таблицы */
th.sortable {
cursor: pointer;
user-select: none;
position: relative;
padding-right: 24px;
transition: background-color 0.2s ease;
}
th.sortable:hover {
background-color: rgba(0, 0, 0, 0.05);
}
th.sortable.sorted {
background-color: rgba(0, 0, 0, 0.08);
}
.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: var(--primary-color);
font-weight: bold;
}
.btn {
text-decoration: none;
margin-left: 6px;
cursor: pointer;
user-select: none;
}
/* Стили для таблицы публикаций */
.shouts-controls {
display: flex;
gap: 20px;
align-items: center;
margin-bottom: 16px;
flex-wrap: wrap;
}
.status-filter select {
padding: 8px 12px;
border: 1px solid var(--border-color);
border-radius: 6px;
background-color: white;
font-size: 14px;
min-width: 150px;
}
.shouts-list {
overflow-x: auto;
margin-top: 1rem;
}
.shouts-list table {
min-width: 1200px;
}
.status-badge {
display: inline-block;
padding: 4px 8px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
text-align: center;
min-width: 70px;
}
.status-published {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.status-draft {
background-color: #fff3cd;
color: #856404;
border: 1px solid #ffeaa7;
}
.status-deleted {
background-color: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.authors-list, .topics-list {
display: flex;
flex-wrap: wrap;
gap: 4px;
max-width: 200px;
}
.author-badge, .topic-badge {
display: inline-block;
padding: 2px 6px;
background-color: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 8px;
font-size: 11px;
color: #495057;
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.author-badge {
background-color: #e3f2fd;
border-color: #bbdefb;
color: #1565c0;
}
.topic-badge {
background-color: #f3e5f5;
border-color: #e1bee7;
color: #7b1fa2;
}
.body-preview {
max-width: 300px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 13px;
color: #666;
}
.media-count {
font-size: 12px;
color: #6c757d;
font-style: italic;
}
.no-data {
color: #adb5bd;
font-style: italic;
font-size: 13px;
}
/* Адаптивные стили для публикаций */
@media (max-width: 768px) {
.shouts-controls {
flex-direction: column;
align-items: stretch;
}
.status-filter select {
min-width: unset;
}
.shouts-list table {
font-size: 12px;
}
.authors-list, .topics-list {
max-width: 150px;
}
.body-preview {
max-width: 200px;
}
}