Files

954 lines
23 KiB
CSS

/* ========================================
Status Page - Scoped Component Styles
========================================
Inherits from app.css:
- .access-denied, .empty-icon, .access-denied-icon (section 19)
- .alert, .alert-danger/success/warning (section 7)
- .form-control, .form-select, .form-label (section 4)
- .btn, .btn-primary/secondary/danger, .btn-sm, .btn-close (section 5)
- .spinner-border, @keyframes spin (section 11)
- Reduced motion (section 17)
Only page-specific additions and overrides below.
======================================== */
/* ========================================
Page Container
======================================== */
.status-container {
padding: var(--space-6) var(--space-page-x);
max-width: 1600px;
margin: 0 auto;
}
@media (min-width: 1024px) {
.status-container {
padding: var(--space-8) var(--space-12);
}
}
@media (min-width: 1440px) {
.status-container {
padding: var(--space-10) 4rem;
}
}
/* ========================================
Header
======================================== */
.status-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--space-8);
gap: var(--space-6);
}
.header-content h1 {
margin: 0 0 var(--space-2) 0;
font-size: clamp(1.5rem, 3vw, 2rem);
color: var(--text-primary);
font-family: var(--font-family-heading);
letter-spacing: -0.02em;
}
.header-subtitle {
margin: 0;
color: var(--text-tertiary);
font-size: var(--text-base);
font-family: var(--font-family-base);
}
/* ========================================
Status Grid
======================================== */
.status-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
gap: var(--space-5);
}
@media (min-width: 1200px) {
.status-grid {
grid-template-columns: repeat(3, 1fr);
gap: var(--space-6);
}
}
@media (min-width: 1600px) {
.status-grid {
grid-template-columns: repeat(3, 1fr);
gap: var(--space-8);
}
}
.status-card {
background: var(--surface-elevated);
border: 0.5px solid var(--border-default);
border-radius: var(--radius-xl);
overflow: hidden;
transition: all var(--duration-fast) var(--ease-out);
box-shadow: var(--shadow-md);
}
.status-card:hover {
transform: translateY(-3px);
border-color: rgba(220, 38, 38, 0.4);
box-shadow: var(--shadow-xl);
}
.status-card-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--space-5) var(--space-6);
background: rgba(0, 0, 0, 0.25);
border-bottom: 0.5px solid var(--border-light);
}
.card-title {
display: flex;
align-items: center;
gap: var(--space-3);
}
.card-title svg {
color: var(--color-primary-light);
width: 20px;
height: 20px;
}
.card-title h3 {
margin: 0;
font-size: var(--text-sm);
font-weight: var(--font-weight-semibold);
color: var(--text-primary);
font-family: var(--font-family-base);
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* ========================================
Status Badges
======================================== */
.status-badge {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
text-transform: uppercase;
letter-spacing: 0.04em;
font-family: var(--font-family-base);
}
.status-badge.status-ok {
background: rgba(34, 197, 94, 0.15);
color: var(--color-success-light);
}
.status-badge.status-error {
background: rgba(220, 38, 38, 0.15);
color: var(--color-error-light);
}
.status-badge.status-warning {
background: rgba(234, 179, 8, 0.15);
color: var(--color-warning-light);
}
.status-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: currentColor;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
/* ========================================
Card Body & Status Items
======================================== */
.status-card-body {
padding: var(--space-4) var(--space-6) var(--space-5);
}
.status-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--space-3) 0;
border-bottom: 0.5px solid var(--border-light);
}
.status-item:last-child {
border-bottom: none;
padding-bottom: 0;
}
.status-item .label {
color: var(--text-tertiary);
font-size: var(--text-sm);
font-family: var(--font-family-base);
}
.status-item .value {
color: var(--text-primary);
font-weight: var(--font-weight-medium);
font-size: var(--text-sm);
text-align: right;
max-width: 55%;
word-break: break-all;
font-family: var(--font-family-base);
}
.status-item .value.mono {
font-family: 'SF Mono', 'Consolas', monospace;
font-size: var(--text-xs);
color: var(--text-secondary);
}
.status-item .value.small {
font-size: var(--text-xs);
}
.status-item .value.highlight {
color: var(--color-error-light);
font-weight: var(--font-weight-semibold);
}
.status-item .value.text-success {
color: var(--color-success-light);
}
.status-item .value.text-danger {
color: var(--color-error-light);
}
.status-item .value .text-success {
color: var(--color-success-light);
}
.status-item .value .text-danger {
color: var(--color-error-light);
}
.status-item .value .text-muted {
color: var(--text-placeholder);
}
.status-divider {
height: 1px;
background: var(--border-light);
margin: var(--space-1) 0;
}
/* ========================================
Environment & Role Badges
======================================== */
.env-badge {
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
text-transform: uppercase;
font-family: var(--font-family-base);
}
.env-badge.dev {
background: rgba(59, 130, 246, 0.15);
color: var(--color-info);
}
.env-badge.prod {
background: rgba(34, 197, 94, 0.15);
color: var(--color-success-light);
}
.role-badge {
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
background: rgba(220, 38, 38, 0.15);
color: var(--color-error-light);
font-family: var(--font-family-base);
}
/* ========================================
Stats Grid
======================================== */
.stats-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-3);
text-align: center;
margin-bottom: var(--space-4);
}
.stat-item {
padding: var(--space-5) var(--space-3);
background: rgba(0, 0, 0, 0.2);
border-radius: var(--radius-lg);
border: 0.5px solid var(--border-light);
transition: all var(--duration-fast) var(--ease-default);
}
.stat-item:hover {
background: rgba(0, 0, 0, 0.3);
border-color: rgba(220, 38, 38, 0.2);
}
.stat-value {
display: block;
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: var(--font-weight-bold);
color: var(--color-error-light);
font-family: var(--font-family-heading);
line-height: var(--line-height-tight);
}
.stat-label {
display: block;
font-size: var(--text-xs);
color: var(--text-tertiary);
text-transform: uppercase;
letter-spacing: 0.05em;
margin-top: var(--space-2);
font-family: var(--font-family-base);
}
/* Stats Detail */
.stats-detail {
display: flex;
flex-direction: column;
gap: var(--space-3);
padding-top: var(--space-4);
border-top: 0.5px solid var(--border-light);
}
.stats-detail-item {
display: flex;
justify-content: space-between;
font-family: var(--font-family-base);
font-size: var(--text-sm);
}
.stats-detail-item .label {
color: var(--text-tertiary);
}
.stats-detail-item .value {
color: var(--text-primary);
font-weight: var(--font-weight-medium);
}
/* ========================================
Quick Actions
======================================== */
.quick-actions {
margin-top: var(--space-10);
padding-top: var(--space-8);
border-top: 0.5px solid var(--border-light);
}
.quick-actions h3 {
margin: 0 0 var(--space-5) 0;
font-family: var(--font-family-base);
font-size: var(--text-base);
font-weight: var(--font-weight-semibold);
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.actions-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: var(--space-4);
}
@media (min-width: 1024px) {
.actions-grid {
grid-template-columns: repeat(3, 1fr);
}
}
.action-btn {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-5) var(--space-6);
background: var(--surface-elevated);
border: 0.5px solid var(--border-default);
border-radius: var(--radius-xl);
color: var(--text-secondary);
font-family: var(--font-family-base);
font-weight: var(--font-weight-medium);
font-size: var(--text-base);
cursor: pointer;
transition: all var(--duration-fast) var(--ease-out);
text-decoration: none;
}
.action-btn:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(220, 38, 38, 0.4);
color: var(--text-primary);
text-decoration: none;
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.action-btn:active {
transform: scale(0.98);
}
.action-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
.action-btn svg {
color: var(--color-primary-light);
flex-shrink: 0;
width: 22px;
height: 22px;
}
/* Action Message */
.action-message {
margin-top: var(--space-6);
padding: var(--space-4) var(--space-5);
border-radius: var(--radius-lg);
font-family: var(--font-family-base);
font-size: var(--text-base);
text-align: center;
}
.action-message.success {
background: rgba(34, 197, 94, 0.12);
border: 0.5px solid rgba(34, 197, 94, 0.25);
color: var(--color-success-light);
}
.action-message.error {
background: rgba(220, 38, 38, 0.12);
border: 0.5px solid rgba(220, 38, 38, 0.25);
color: var(--color-error-light);
}
/* ========================================
Loading & Auth States
======================================== */
.loading-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: var(--space-12) var(--space-8);
color: var(--text-tertiary);
}
.loading-state .spinner-border {
width: 3rem;
height: 3rem;
margin-bottom: var(--space-6);
color: var(--color-primary-light);
}
.auth-required {
text-align: center;
padding: var(--space-10) var(--space-8);
background: var(--surface-elevated);
border: 0.5px solid var(--border-default);
border-radius: var(--radius-2xl);
max-width: 420px;
margin: var(--space-12) auto;
}
.auth-icon {
font-size: 3rem;
margin-bottom: var(--space-5);
}
.auth-required h2 {
margin: 0 0 var(--space-3) 0;
color: var(--text-primary);
font-family: var(--font-family-base);
font-size: var(--text-2xl);
}
.auth-required p {
color: var(--text-tertiary);
margin-bottom: var(--space-8);
font-family: var(--font-family-base);
font-size: var(--text-base);
}
/* ========================================
Footer
======================================== */
.status-footer {
text-align: center;
margin-top: var(--space-10);
padding-top: var(--space-6);
border-top: 0.5px solid var(--border-light);
}
.status-footer p {
margin: 0;
color: var(--text-placeholder);
font-size: var(--text-sm);
font-family: var(--font-family-base);
}
/* ========================================
Responsive - Mobile
======================================== */
@media (max-width: 768px) {
.status-container {
padding: var(--space-4) var(--space-3);
padding-bottom: calc(var(--space-4) + var(--safe-area-bottom));
}
.status-header {
flex-direction: column;
align-items: stretch;
gap: var(--space-4);
}
.status-header .btn {
width: 100%;
justify-content: center;
}
.status-grid {
grid-template-columns: 1fr;
}
.status-card {
border-radius: var(--radius-xl);
}
.status-card-header {
padding: var(--space-4);
}
.status-card-body {
padding: var(--space-4);
}
.status-item {
flex-direction: column;
align-items: flex-start;
gap: var(--space-1);
padding: var(--space-3) 0;
}
.status-item .value {
text-align: left;
max-width: 100%;
}
.stats-grid {
grid-template-columns: repeat(3, 1fr);
gap: var(--space-3);
}
.stat-item {
padding: var(--space-4) var(--space-3);
}
.stat-value {
font-size: 1.25rem;
}
.actions-grid {
grid-template-columns: 1fr;
}
.action-btn {
padding: var(--space-4);
}
}
/* ========================================
Banner Settings Panel (Gold Theme)
======================================== */
.banner-settings-panel {
margin-top: var(--space-8);
background: var(--surface-primary);
border: 1px solid rgba(218, 165, 32, 0.3);
border-radius: var(--radius-xl);
overflow: hidden;
box-shadow: 0 8px 32px rgba(218, 165, 32, 0.1);
}
.panel-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--space-5) var(--space-6);
background: linear-gradient(135deg, rgba(218, 165, 32, 0.15) 0%, rgba(184, 134, 11, 0.1) 100%);
border-bottom: 1px solid rgba(218, 165, 32, 0.2);
}
.panel-header h3 {
margin: 0;
font-family: var(--font-family-base);
font-size: var(--text-lg);
font-weight: var(--font-weight-semibold);
color: #daa520;
}
.panel-header .btn-close {
background: rgba(255, 255, 255, 0.1);
border: none;
color: var(--text-tertiary);
width: 32px;
height: 32px;
border-radius: var(--radius-md);
cursor: pointer;
font-size: var(--text-base);
display: flex;
align-items: center;
justify-content: center;
transition: all var(--duration-fast) var(--ease-default);
}
.panel-header .btn-close:hover {
background: rgba(255, 255, 255, 0.15);
color: var(--text-primary);
}
.panel-body {
padding: var(--space-6);
}
.panel-body .form-group {
margin-bottom: var(--space-5);
}
.panel-body .form-group label {
display: block;
margin-bottom: var(--space-2);
font-family: var(--font-family-base);
font-size: var(--text-sm);
font-weight: var(--font-weight-medium);
color: var(--text-secondary);
}
.panel-body .form-control {
width: 100%;
padding: var(--space-3) var(--space-4);
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: var(--radius-lg);
color: var(--text-primary);
-webkit-text-fill-color: var(--text-primary);
font-family: var(--font-family-base);
font-size: var(--text-base);
transition: all var(--duration-fast) var(--ease-default);
}
.panel-body .form-control:focus {
outline: none;
border-color: #daa520;
box-shadow: 0 0 0 3px rgba(218, 165, 32, 0.15);
color: var(--text-primary);
-webkit-text-fill-color: var(--text-primary);
}
.panel-body .form-control:-webkit-autofill,
.panel-body .form-control:-webkit-autofill:hover,
.panel-body .form-control:-webkit-autofill:focus {
-webkit-text-fill-color: var(--text-primary);
-webkit-box-shadow: 0 0 0 1000px rgba(0, 0, 0, 0.3) inset;
transition: background-color 5000s ease-in-out 0s;
}
.panel-body .form-control::placeholder {
color: var(--text-placeholder);
}
.form-hint {
display: block;
margin-top: var(--space-2);
font-size: var(--text-xs);
color: var(--text-placeholder);
font-family: var(--font-family-base);
}
.panel-body textarea.form-control {
resize: vertical;
min-height: 100px;
}
.panel-body .form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-4);
}
@media (max-width: 640px) {
.panel-body .form-row {
grid-template-columns: 1fr;
}
}
/* ========================================
Toggle Switch
======================================== */
.toggle-group {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.toggle-label-text {
font-family: var(--font-family-base);
font-size: var(--text-sm);
font-weight: var(--font-weight-medium);
color: var(--text-secondary);
}
.toggle-container {
display: flex;
align-items: center;
cursor: pointer;
}
.toggle-container input[type="checkbox"] {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.toggle-switch {
position: relative;
flex-shrink: 0;
width: 48px;
height: 26px;
background: rgba(255, 255, 255, 0.15);
border-radius: 13px;
transition: all var(--duration-normal) var(--ease-default);
}
.toggle-switch::after {
content: '';
position: absolute;
top: 3px;
left: 3px;
width: 20px;
height: 20px;
background: var(--text-primary);
border-radius: 50%;
transition: all var(--duration-normal) var(--ease-default);
}
.toggle-container input[type="checkbox"]:checked + .toggle-switch {
background: #daa520;
}
.toggle-container input[type="checkbox"]:checked + .toggle-switch::after {
transform: translateX(22px);
}
/* ========================================
Panel Actions (Gold Theme)
======================================== */
.panel-actions {
display: flex;
justify-content: flex-end;
gap: var(--space-3);
margin-top: var(--space-6);
padding-top: var(--space-6);
border-top: 1px solid var(--border-light);
}
.panel-actions .btn {
padding: var(--space-3) var(--space-6);
border-radius: var(--radius-lg);
font-family: var(--font-family-base);
font-weight: var(--font-weight-semibold);
font-size: var(--text-sm);
cursor: pointer;
transition: all var(--duration-fast) var(--ease-default);
display: inline-flex;
align-items: center;
gap: var(--space-2);
}
.panel-actions .btn-outline {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.2);
color: var(--text-secondary);
}
.panel-actions .btn-outline:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.3);
color: var(--text-primary);
}
.panel-actions .btn-primary {
background: linear-gradient(135deg, #daa520 0%, #b8860b 100%);
border: none;
color: #000;
}
.panel-actions .btn-primary:hover {
box-shadow: 0 4px 16px rgba(218, 165, 32, 0.4);
transform: translateY(-1px);
}
.panel-actions .btn-primary:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* ========================================
Banner Message
======================================== */
.banner-message {
margin-top: var(--space-4);
padding: var(--space-3) var(--space-4);
border-radius: var(--radius-lg);
font-family: var(--font-family-base);
font-size: var(--text-sm);
text-align: center;
}
.banner-message.success {
background: rgba(34, 197, 94, 0.12);
border: 1px solid rgba(34, 197, 94, 0.25);
color: var(--color-success-light);
}
.banner-message.error {
background: rgba(220, 38, 38, 0.12);
border: 1px solid rgba(220, 38, 38, 0.25);
color: var(--color-error-light);
}
/* ========================================
Banner Status Info
======================================== */
.banner-status-info {
margin: var(--space-4) 0;
padding: var(--space-3) var(--space-4);
background: rgba(0, 0, 0, 0.2);
border-radius: var(--radius-lg);
text-align: center;
}
.status-indicator {
display: inline-flex;
align-items: center;
gap: var(--space-2);
font-family: var(--font-family-base);
font-size: var(--text-sm);
font-weight: var(--font-weight-medium);
}
.status-indicator.active {
color: var(--color-success-light);
}
.status-indicator.inactive {
color: var(--text-tertiary);
}
/* ========================================
Status Icons
======================================== */
.status-icon {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
flex-shrink: 0;
}
.status-icon.active-icon {
background: var(--color-success);
box-shadow: 0 0 8px rgba(34, 197, 94, 0.5);
}
.status-icon.active-icon::after {
content: '';
display: block;
width: 100%;
height: 100%;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center/10px no-repeat;
}
.status-icon.disabled-icon {
background: rgba(255, 255, 255, 0.2);
border: 2px solid rgba(255, 255, 255, 0.3);
}
.status-icon.scheduled-icon {
background: var(--color-info);
box-shadow: 0 0 8px rgba(59, 130, 246, 0.5);
}
.status-icon.scheduled-icon::after {
content: '';
display: block;
width: 100%;
height: 100%;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 6v6l4 2'/%3E%3C/svg%3E") center/12px no-repeat;
}
.status-icon.expired-icon {
background: #6b7280;
}
.status-icon.expired-icon::after {
content: '';
display: block;
width: 100%;
height: 100%;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2'%3E%3Crect x='6' y='6' width='12' height='12'/%3E%3C/svg%3E") center/10px no-repeat;
}
.status-icon.warning-icon {
background: var(--color-warning);
box-shadow: 0 0 8px rgba(245, 158, 11, 0.5);
}
.status-icon.warning-icon::after {
content: '!';
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
font-size: 12px;
font-weight: bold;
color: white;
}
/* ========================================
Panel Section Titles
======================================== */
.panel-section-title {
font-size: var(--text-base);
font-weight: var(--font-weight-semibold);
color: var(--text-primary);
margin: var(--space-2) 0 var(--space-4);
padding-bottom: var(--space-2);
border-bottom: 1px solid var(--border-light);
}