Большое обновление GUI интерфейс
Большое обновление GUI интерфейс - Добавлен фраемворr Walles - Удалена консольная версия - Проработан интерфейс и дизайн - Добавлено кеширование для быстрой реакции. - Сделан .ps1 сборщик для удобной сборки проекта. - Обновлён Readme
This commit is contained in:
87
Backend/admin/frontend/assets/css/components/badges.css
Normal file
87
Backend/admin/frontend/assets/css/components/badges.css
Normal file
@@ -0,0 +1,87 @@
|
||||
/* ============================================
|
||||
Badges Component
|
||||
Единая система бейджей
|
||||
============================================ */
|
||||
|
||||
/* Base Badge */
|
||||
.badge {
|
||||
padding: 4px 12px;
|
||||
border-radius: 20px;
|
||||
font-size: var(--text-xs);
|
||||
font-weight: var(--font-bold);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
backdrop-filter: var(--backdrop-blur-light);
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/* Status Badges */
|
||||
.badge-online {
|
||||
background: linear-gradient(135deg, rgba(16, 185, 129, 0.25), rgba(16, 185, 129, 0.15));
|
||||
color: var(--accent-green);
|
||||
border: 1px solid rgba(16, 185, 129, 0.4);
|
||||
box-shadow: 0 0 12px rgba(16, 185, 129, 0.3);
|
||||
}
|
||||
|
||||
.badge-offline {
|
||||
background: linear-gradient(135deg, rgba(239, 68, 68, 0.25), rgba(239, 68, 68, 0.15));
|
||||
color: var(--accent-red);
|
||||
border: 1px solid rgba(239, 68, 68, 0.4);
|
||||
box-shadow: 0 0 12px rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
|
||||
.badge-pending {
|
||||
background: linear-gradient(135deg, rgba(245, 158, 11, 0.25), rgba(245, 158, 11, 0.15));
|
||||
color: var(--accent-yellow);
|
||||
border: 1px solid rgba(245, 158, 11, 0.4);
|
||||
box-shadow: 0 0 12px rgba(245, 158, 11, 0.3);
|
||||
}
|
||||
|
||||
/* Yes/No Badges */
|
||||
.badge-yes {
|
||||
background: rgba(34, 197, 94, 0.2);
|
||||
color: var(--accent-green);
|
||||
border: 1px solid var(--accent-green);
|
||||
}
|
||||
|
||||
.badge-no {
|
||||
background: rgba(100, 116, 139, 0.2);
|
||||
color: var(--text-muted);
|
||||
border: 1px solid var(--text-muted);
|
||||
}
|
||||
|
||||
/* Status Indicator (Dot) */
|
||||
.status-indicator {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: var(--radius-full);
|
||||
box-shadow: 0 0 8px currentColor;
|
||||
}
|
||||
|
||||
.status-online {
|
||||
background: var(--accent-green);
|
||||
color: var(--accent-green);
|
||||
}
|
||||
|
||||
.status-offline {
|
||||
background: var(--accent-red);
|
||||
color: var(--accent-red);
|
||||
}
|
||||
|
||||
/* Mini Tags (для таблиц) */
|
||||
.mini-tag {
|
||||
display: inline-block;
|
||||
padding: 4px 10px;
|
||||
background: rgba(139, 92, 246, 0.15);
|
||||
border-radius: var(--radius-sm);
|
||||
font-size: 12px;
|
||||
font-family: var(--font-mono);
|
||||
color: var(--accent-purple-light);
|
||||
margin: 2px;
|
||||
transition: all var(--transition-base);
|
||||
|
||||
&:hover {
|
||||
background: rgba(139, 92, 246, 0.25);
|
||||
}
|
||||
}
|
||||
|
||||
308
Backend/admin/frontend/assets/css/components/buttons.css
Normal file
308
Backend/admin/frontend/assets/css/components/buttons.css
Normal file
@@ -0,0 +1,308 @@
|
||||
/* ============================================
|
||||
Buttons Component
|
||||
Единая система кнопок
|
||||
============================================ */
|
||||
|
||||
/* Base Button Styles */
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: var(--space-sm);
|
||||
padding: var(--space-sm) var(--space-md);
|
||||
border: none;
|
||||
border-radius: var(--radius-md);
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
white-space: nowrap;
|
||||
|
||||
&:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
&:not(:disabled):active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
}
|
||||
|
||||
/* Action Button - Основная кнопка действия */
|
||||
.action-btn {
|
||||
padding: var(--space-sm) var(--space-md);
|
||||
background: rgba(139, 92, 246, 0.15);
|
||||
backdrop-filter: var(--backdrop-blur-light);
|
||||
border: 1px solid rgba(139, 92, 246, 0.3);
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--accent-purple-light);
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: rgba(139, 92, 246, 0.25);
|
||||
border-color: rgba(139, 92, 246, 0.5);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
i {
|
||||
font-size: var(--text-md);
|
||||
}
|
||||
}
|
||||
|
||||
/* Save Button Variant */
|
||||
.save-btn {
|
||||
background: rgba(16, 185, 129, 0.15);
|
||||
border-color: rgba(16, 185, 129, 0.3);
|
||||
color: var(--accent-green);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: rgba(16, 185, 129, 0.25);
|
||||
border-color: rgba(16, 185, 129, 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
/* Icon Button - Квадратная кнопка с иконкой */
|
||||
.icon-btn {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
padding: 0;
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
border: 1px solid rgba(139, 92, 246, 0.3);
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--accent-purple-light);
|
||||
font-size: var(--text-md);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: rgba(139, 92, 246, 0.25);
|
||||
border-color: rgba(139, 92, 246, 0.5);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
}
|
||||
|
||||
/* Small Icon Button */
|
||||
.icon-btn-small {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
background: rgba(239, 68, 68, 0.1);
|
||||
border: 1px solid rgba(239, 68, 68, 0.3);
|
||||
border-radius: var(--radius-sm);
|
||||
color: var(--accent-red);
|
||||
font-size: 12px;
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
}
|
||||
}
|
||||
|
||||
/* Window Control Buttons */
|
||||
.window-btn {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--text-secondary);
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: var(--radius-sm);
|
||||
transition: all var(--transition-base);
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
&:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
}
|
||||
|
||||
.close-btn:hover {
|
||||
background: var(--accent-red);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Server Control Button */
|
||||
.server-control-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
padding: var(--space-sm) 18px;
|
||||
background: linear-gradient(135deg, rgba(239, 68, 68, 0.2), rgba(239, 68, 68, 0.1));
|
||||
backdrop-filter: var(--backdrop-blur-light);
|
||||
border: 1px solid rgba(239, 68, 68, 0.4);
|
||||
border-radius: 20px;
|
||||
color: var(--accent-red);
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
box-shadow: var(--shadow-red);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: linear-gradient(135deg, rgba(239, 68, 68, 0.3), rgba(239, 68, 68, 0.15));
|
||||
border-color: rgba(239, 68, 68, 0.6);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
&:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
i {
|
||||
font-size: var(--text-md);
|
||||
}
|
||||
}
|
||||
|
||||
.server-control-btn.start-mode {
|
||||
background: linear-gradient(135deg, rgba(16, 185, 129, 0.2), rgba(16, 185, 129, 0.1));
|
||||
border-color: rgba(16, 185, 129, 0.4);
|
||||
color: var(--accent-green);
|
||||
box-shadow: var(--shadow-green);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: linear-gradient(135deg, rgba(16, 185, 129, 0.3), rgba(16, 185, 129, 0.15));
|
||||
border-color: rgba(16, 185, 129, 0.6);
|
||||
}
|
||||
}
|
||||
|
||||
/* Status Toggle Buttons */
|
||||
.status-toggle {
|
||||
display: flex;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
.status-btn {
|
||||
flex: 1;
|
||||
padding: 10px var(--space-md);
|
||||
background: rgba(100, 116, 139, 0.1);
|
||||
border: 1px solid rgba(100, 116, 139, 0.3);
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--text-muted);
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: var(--space-sm);
|
||||
|
||||
&:hover {
|
||||
background: rgba(100, 116, 139, 0.15);
|
||||
}
|
||||
|
||||
&.active {
|
||||
background: rgba(16, 185, 129, 0.2);
|
||||
border-color: rgba(16, 185, 129, 0.5);
|
||||
color: var(--accent-green);
|
||||
box-shadow: 0 0 12px rgba(16, 185, 129, 0.2);
|
||||
}
|
||||
|
||||
&:last-child.active {
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
border-color: rgba(239, 68, 68, 0.5);
|
||||
color: var(--accent-red);
|
||||
}
|
||||
}
|
||||
|
||||
/* Navigation Buttons */
|
||||
.nav-item {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-radius: var(--radius-lg);
|
||||
color: var(--text-secondary);
|
||||
font-size: 20px;
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: -16px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 3px;
|
||||
height: 0;
|
||||
background: linear-gradient(180deg, var(--accent-purple), var(--accent-purple-light));
|
||||
border-radius: 0 2px 2px 0;
|
||||
transition: height var(--transition-base);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
color: var(--accent-purple-light);
|
||||
}
|
||||
|
||||
&.active {
|
||||
background: rgba(139, 92, 246, 0.15);
|
||||
color: var(--accent-purple-light);
|
||||
|
||||
&::before {
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Breadcrumb Buttons */
|
||||
.breadcrumb-item {
|
||||
font-size: var(--text-md);
|
||||
color: var(--text-muted);
|
||||
background: none;
|
||||
border: none;
|
||||
padding: var(--space-sm) var(--space-lg);
|
||||
border-radius: var(--radius-md);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
|
||||
&:hover {
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
color: var(--accent-purple-light);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: var(--text-primary);
|
||||
font-weight: var(--font-medium);
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tab Buttons */
|
||||
.vaccess-tab {
|
||||
flex: 0 0 auto;
|
||||
padding: 10px 18px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--text-muted);
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-medium);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
|
||||
&:hover {
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
&.active {
|
||||
background: var(--accent-purple);
|
||||
color: white;
|
||||
box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
191
Backend/admin/frontend/assets/css/components/cards.css
Normal file
191
Backend/admin/frontend/assets/css/components/cards.css
Normal file
@@ -0,0 +1,191 @@
|
||||
/* ============================================
|
||||
Cards Component
|
||||
Единая система карточек
|
||||
============================================ */
|
||||
|
||||
/* Service Card */
|
||||
.service-card {
|
||||
background: var(--glass-bg-light);
|
||||
backdrop-filter: var(--backdrop-blur);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: var(--radius-2xl);
|
||||
padding: var(--space-lg);
|
||||
transition: all var(--transition-bounce);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
/* Градиентная линия сверху */
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 3px;
|
||||
background: linear-gradient(90deg, var(--accent-purple), var(--accent-purple-light), var(--accent-cyan));
|
||||
opacity: 0;
|
||||
transition: opacity var(--transition-slow);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: var(--shadow-purple);
|
||||
border-color: var(--glass-border-hover);
|
||||
background: rgba(20, 20, 40, 0.5);
|
||||
|
||||
&::before {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.service-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.service-name {
|
||||
font-size: var(--text-md);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-primary);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
|
||||
i {
|
||||
color: var(--accent-purple-light);
|
||||
font-size: var(--text-lg);
|
||||
}
|
||||
}
|
||||
|
||||
.service-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-size: var(--text-sm);
|
||||
color: var(--text-secondary);
|
||||
font-weight: var(--font-medium);
|
||||
}
|
||||
|
||||
.info-value {
|
||||
font-size: 12px;
|
||||
color: var(--text-primary);
|
||||
font-weight: var(--font-semibold);
|
||||
}
|
||||
|
||||
/* Settings Card */
|
||||
.settings-card {
|
||||
background: var(--glass-bg-light);
|
||||
backdrop-filter: var(--backdrop-blur);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: var(--radius-xl);
|
||||
padding: var(--space-lg);
|
||||
}
|
||||
|
||||
.settings-card-title {
|
||||
font-size: var(--text-lg);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
|
||||
i {
|
||||
color: var(--accent-purple-light);
|
||||
}
|
||||
}
|
||||
|
||||
/* vAccess Rule Card */
|
||||
.vaccess-rule-card {
|
||||
background: rgba(10, 14, 26, 0.4);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--space-lg);
|
||||
}
|
||||
|
||||
.rule-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: var(--space-md);
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
.rule-number {
|
||||
font-size: var(--text-md);
|
||||
font-weight: var(--font-bold);
|
||||
color: var(--accent-purple-light);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.rule-content {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20px;
|
||||
|
||||
> .form-group:first-child {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Help Cards */
|
||||
.help-card {
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
border-radius: var(--radius-xl);
|
||||
padding: var(--space-xl);
|
||||
border: 1px solid var(--glass-border);
|
||||
transition: all var(--transition-slow);
|
||||
|
||||
&:hover {
|
||||
border-color: var(--glass-border-hover);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: var(--text-2xl);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--accent-purple-light);
|
||||
margin: 0 0 20px 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-lg);
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
padding: 12px 0;
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.6;
|
||||
border-bottom: 1px solid rgba(139, 92, 246, 0.05);
|
||||
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.help-examples {
|
||||
background: linear-gradient(135deg, rgba(139, 92, 246, 0.05) 0%, rgba(99, 102, 241, 0.05) 100%);
|
||||
}
|
||||
|
||||
219
Backend/admin/frontend/assets/css/components/forms.css
Normal file
219
Backend/admin/frontend/assets/css/components/forms.css
Normal file
@@ -0,0 +1,219 @@
|
||||
/* ============================================
|
||||
Forms Component
|
||||
Единая система форм
|
||||
============================================ */
|
||||
|
||||
/* Form Container */
|
||||
.settings-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
/* Form Group */
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
/* Form Row (2 columns) */
|
||||
.form-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
/* Form Label */
|
||||
.form-label {
|
||||
font-size: 12px;
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-secondary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.field-hint {
|
||||
font-size: var(--text-xs);
|
||||
color: var(--text-muted);
|
||||
font-weight: var(--font-normal);
|
||||
text-transform: none;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
/* Form Input */
|
||||
.form-input {
|
||||
padding: 10px 14px;
|
||||
background: var(--glass-bg-dark);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--text-primary);
|
||||
font-size: var(--text-base);
|
||||
outline: none;
|
||||
transition: all var(--transition-base);
|
||||
|
||||
&:focus {
|
||||
border-color: rgba(139, 92, 246, 0.5);
|
||||
box-shadow: 0 0 12px rgba(139, 92, 246, 0.2);
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
color: var(--text-muted);
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
/* Form Info */
|
||||
.form-info {
|
||||
font-size: var(--text-sm);
|
||||
color: var(--text-muted);
|
||||
line-height: 1.5;
|
||||
padding: 12px;
|
||||
background: rgba(139, 92, 246, 0.05);
|
||||
border-radius: var(--radius-md);
|
||||
border-left: 3px solid var(--accent-purple);
|
||||
}
|
||||
|
||||
/* Toggle Switch */
|
||||
.toggle-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-lg);
|
||||
}
|
||||
|
||||
.toggle-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
height: 26px;
|
||||
|
||||
input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
|
||||
&:checked + .toggle-slider {
|
||||
background: rgba(16, 185, 129, 0.2);
|
||||
border-color: rgba(16, 185, 129, 0.5);
|
||||
box-shadow: 0 0 16px rgba(16, 185, 129, 0.3);
|
||||
|
||||
&::before {
|
||||
transform: translateX(24px);
|
||||
background: var(--accent-green);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.toggle-slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
border: 1px solid rgba(239, 68, 68, 0.4);
|
||||
transition: all var(--transition-slow);
|
||||
border-radius: 26px;
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 18px;
|
||||
width: 18px;
|
||||
left: 3px;
|
||||
bottom: 3px;
|
||||
background: rgba(239, 68, 68, 0.8);
|
||||
box-shadow: var(--shadow-sm);
|
||||
transition: all var(--transition-slow);
|
||||
border-radius: var(--radius-full);
|
||||
}
|
||||
}
|
||||
|
||||
.toggle-label {
|
||||
font-size: var(--text-md);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* Checkbox */
|
||||
.checkbox-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
cursor: pointer;
|
||||
font-size: var(--text-base);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* Tags Container */
|
||||
.tags-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-sm);
|
||||
padding: 12px;
|
||||
background: var(--glass-bg-dark);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: var(--radius-md);
|
||||
min-height: 48px;
|
||||
margin-top: var(--space-sm);
|
||||
}
|
||||
|
||||
.tag {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
padding: 4px 10px;
|
||||
background: rgba(139, 92, 246, 0.2);
|
||||
border: 1px solid rgba(139, 92, 246, 0.4);
|
||||
border-radius: 16px;
|
||||
color: var(--text-primary);
|
||||
font-size: 12px;
|
||||
font-weight: var(--font-medium);
|
||||
}
|
||||
|
||||
.tag-remove {
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: var(--accent-red);
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: var(--radius-full);
|
||||
transition: all var(--transition-base);
|
||||
|
||||
&:hover {
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
}
|
||||
}
|
||||
|
||||
.tag-input-wrapper {
|
||||
display: flex;
|
||||
gap: var(--space-sm);
|
||||
|
||||
.form-input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.action-btn {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Field Editor */
|
||||
.field-editor {
|
||||
padding: 20px;
|
||||
|
||||
h3 {
|
||||
font-size: var(--text-xl);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--accent-purple-light);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
223
Backend/admin/frontend/assets/css/components/modals.css
Normal file
223
Backend/admin/frontend/assets/css/components/modals.css
Normal file
@@ -0,0 +1,223 @@
|
||||
/* ============================================
|
||||
Modals Component
|
||||
Единая система модальных окон
|
||||
============================================ */
|
||||
|
||||
/* Modal Overlay */
|
||||
.modal-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
backdrop-filter: var(--backdrop-blur-light);
|
||||
z-index: var(--z-modal);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: opacity var(--transition-slow);
|
||||
|
||||
&.show {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
|
||||
.modal-window {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.notification-content {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Modal Window */
|
||||
.modal-window {
|
||||
background: rgba(20, 20, 40, 0.95);
|
||||
backdrop-filter: var(--backdrop-blur);
|
||||
border: 1px solid var(--glass-border-hover);
|
||||
border-radius: var(--radius-2xl);
|
||||
box-shadow: var(--shadow-lg);
|
||||
min-width: 900px;
|
||||
max-width: 1200px;
|
||||
max-height: 85vh;
|
||||
overflow: hidden;
|
||||
transform: scale(0.9);
|
||||
transition: transform var(--transition-slow);
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20px var(--space-lg);
|
||||
border-bottom: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
.modal-title {
|
||||
font-size: var(--text-xl);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.modal-close-btn {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--text-secondary);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
&:hover {
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
color: var(--accent-red);
|
||||
}
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
padding: var(--space-lg);
|
||||
max-height: 60vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: var(--space-lg);
|
||||
padding: 20px var(--space-lg);
|
||||
border-top: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
/* Notification Modal */
|
||||
.notification {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, 0.6);
|
||||
backdrop-filter: var(--backdrop-blur-light);
|
||||
z-index: var(--z-notification);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: opacity var(--transition-slow);
|
||||
|
||||
&.show {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.notification-content {
|
||||
min-width: 400px;
|
||||
max-width: 500px;
|
||||
padding: var(--space-xl) 40px;
|
||||
background: rgba(20, 20, 40, 0.95);
|
||||
backdrop-filter: var(--backdrop-blur);
|
||||
border: 1px solid var(--glass-border-hover);
|
||||
border-radius: var(--radius-2xl);
|
||||
box-shadow: var(--shadow-lg), 0 0 40px rgba(139, 92, 246, 0.3);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
text-align: center;
|
||||
transform: scale(0.9);
|
||||
transition: transform var(--transition-bounce);
|
||||
}
|
||||
|
||||
.notification.success .notification-content {
|
||||
border-color: rgba(16, 185, 129, 0.4);
|
||||
box-shadow: var(--shadow-lg), 0 0 40px rgba(16, 185, 129, 0.3);
|
||||
}
|
||||
|
||||
.notification.error .notification-content {
|
||||
border-color: rgba(239, 68, 68, 0.4);
|
||||
box-shadow: var(--shadow-lg), 0 0 40px rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
|
||||
.notification-icon {
|
||||
font-size: 56px;
|
||||
|
||||
i {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.notification.success .notification-icon {
|
||||
color: var(--accent-green);
|
||||
}
|
||||
|
||||
.notification.error .notification-icon {
|
||||
color: var(--accent-red);
|
||||
}
|
||||
|
||||
.notification-text {
|
||||
font-size: var(--text-lg);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* App Loader */
|
||||
.app-loader {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 50%, var(--bg-tertiary) 100%);
|
||||
z-index: var(--z-loader);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 1;
|
||||
transition: opacity 0.5s ease;
|
||||
|
||||
&.hide {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.loader-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.loader-icon {
|
||||
font-size: 64px;
|
||||
animation: bounce 1.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.loader-text {
|
||||
font-size: var(--text-xl);
|
||||
font-weight: var(--font-semibold);
|
||||
background: linear-gradient(135deg, #7c3aed 0%, #a78bfa 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
.loader-spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 3px solid rgba(139, 92, 246, 0.2);
|
||||
border-top-color: var(--accent-purple);
|
||||
border-radius: var(--radius-full);
|
||||
animation: spin 0.8s linear infinite;
|
||||
}
|
||||
|
||||
236
Backend/admin/frontend/assets/css/components/tables.css
Normal file
236
Backend/admin/frontend/assets/css/components/tables.css
Normal file
@@ -0,0 +1,236 @@
|
||||
/* ============================================
|
||||
Tables Component
|
||||
ЕДИНАЯ система таблиц для всего приложения
|
||||
============================================ */
|
||||
|
||||
/* Table Container */
|
||||
.table-container {
|
||||
background: var(--glass-bg-light);
|
||||
backdrop-filter: var(--backdrop-blur);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: var(--radius-2xl);
|
||||
overflow: hidden;
|
||||
box-shadow: var(--shadow-md);
|
||||
}
|
||||
|
||||
/* Base Table */
|
||||
.data-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
|
||||
thead {
|
||||
background: rgba(139, 92, 246, 0.12);
|
||||
backdrop-filter: var(--backdrop-blur-light);
|
||||
|
||||
tr {
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
th {
|
||||
padding: 18px 20px;
|
||||
text-align: left;
|
||||
font-size: var(--text-sm);
|
||||
font-weight: var(--font-bold);
|
||||
color: var(--text-secondary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1.2px;
|
||||
|
||||
&:last-child {
|
||||
width: 120px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
tbody {
|
||||
tr {
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
||||
transition: all var(--transition-base);
|
||||
|
||||
&:hover {
|
||||
background: rgba(139, 92, 246, 0.08);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 16px 20px;
|
||||
font-size: var(--text-base);
|
||||
color: var(--text-primary);
|
||||
|
||||
&:last-child {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* vAccess Table - использует те же стили что и data-table */
|
||||
.vaccess-table-container {
|
||||
margin-bottom: 20px;
|
||||
max-height: 55vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.vaccess-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
|
||||
thead {
|
||||
tr {
|
||||
background: rgba(139, 92, 246, 0.05);
|
||||
display: table-row;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
th {
|
||||
padding: 16px;
|
||||
text-align: left;
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-muted);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
border: none;
|
||||
display: table-cell;
|
||||
box-sizing: content-box;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
tbody {
|
||||
tr {
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
transition: all var(--transition-slow);
|
||||
cursor: grab;
|
||||
display: table-row;
|
||||
width: 100%;
|
||||
|
||||
&:hover {
|
||||
background: rgba(139, 92, 246, 0.08);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
&:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
&[draggable="true"] {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 20px 16px;
|
||||
font-size: var(--text-md);
|
||||
color: var(--text-primary);
|
||||
border-top: 1px solid rgba(139, 92, 246, 0.05);
|
||||
border-bottom: 1px solid rgba(139, 92, 246, 0.05);
|
||||
cursor: pointer;
|
||||
display: table-cell;
|
||||
box-sizing: content-box;
|
||||
|
||||
}
|
||||
|
||||
/* Принудительно растягиваем на всю ширину */
|
||||
thead, tbody {
|
||||
display: table-row-group;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Table Column Sizing - адаптивные размеры */
|
||||
.col-drag {
|
||||
width: 3%;
|
||||
min-width: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.col-type {
|
||||
width: 8%;
|
||||
min-width: 80px;
|
||||
}
|
||||
|
||||
.col-files {
|
||||
width: 15%;
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.col-paths {
|
||||
width: 18%;
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
.col-ips {
|
||||
width: 15%;
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.col-exceptions {
|
||||
width: 15%;
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.col-error {
|
||||
width: 10%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.col-actions {
|
||||
width: 5%;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Drag Handle */
|
||||
.drag-handle {
|
||||
color: var(--text-muted);
|
||||
opacity: 0.3;
|
||||
transition: all var(--transition-base);
|
||||
cursor: grab;
|
||||
text-align: center;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
color: var(--accent-purple-light);
|
||||
}
|
||||
|
||||
&:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
}
|
||||
|
||||
/* Empty Field */
|
||||
.empty-field {
|
||||
color: var(--text-muted);
|
||||
opacity: 0.4;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Clickable Link in Tables */
|
||||
.clickable-link {
|
||||
color: var(--accent-purple-light);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-base);
|
||||
text-decoration: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--space-xs);
|
||||
|
||||
&:hover {
|
||||
color: var(--accent-purple);
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsive Table */
|
||||
@media (max-width: 600px) {
|
||||
.table-container {
|
||||
overflow-x: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user