| |
| |
| |
|
|
|
|
| :root {
|
|
|
| --primary: #2dd4bf;
|
| --primary-dark: #14b8a6;
|
| --primary-light: #5eead4;
|
| --secondary: #3b82f6;
|
| --success: #10b981;
|
| --warning: #f59e0b;
|
| --danger: #ef4444;
|
| --info: #06b6d4;
|
|
|
|
|
| --bg-primary: #0a0e27;
|
| --bg-secondary: #0f1419;
|
| --bg-card: rgba(15, 20, 25, 0.9);
|
| --bg-hover: rgba(255, 255, 255, 0.05);
|
|
|
|
|
| --text-primary: #ffffff;
|
| --text-secondary: #94a3b8;
|
| --text-muted: #64748b;
|
|
|
|
|
| --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
| --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
| --shadow-md: 0 8px 16px -2px rgba(0, 0, 0, 0.2);
|
| --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.3);
|
| --shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
|
|
|
|
|
| --radius-sm: 0.375rem;
|
| --radius: 0.5rem;
|
| --radius-md: 0.75rem;
|
| --radius-lg: 1rem;
|
| --radius-xl: 1.5rem;
|
|
|
|
|
| --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
| --transition-fast: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
| }
|
|
|
|
|
| * {
|
| outline-color: var(--primary);
|
| }
|
|
|
| body {
|
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
| -webkit-font-smoothing: antialiased;
|
| -moz-osx-font-smoothing: grayscale;
|
| text-rendering: optimizeLegibility;
|
| }
|
|
|
|
|
| .btn,
|
| button:not(.unstyled) {
|
| position: relative;
|
| display: inline-flex;
|
| align-items: center;
|
| justify-content: center;
|
| gap: 0.5rem;
|
| padding: 0.625rem 1.25rem;
|
| font-size: 0.875rem;
|
| font-weight: 600;
|
| line-height: 1.5;
|
| text-align: center;
|
| white-space: nowrap;
|
| border: 1px solid transparent;
|
| border-radius: var(--radius-md);
|
| cursor: pointer;
|
| user-select: none;
|
| transition: var(--transition);
|
| overflow: hidden;
|
| }
|
|
|
| .btn::before {
|
| content: '';
|
| position: absolute;
|
| inset: 0;
|
| background: radial-gradient(circle at center, rgba(255,255,255,0.15) 0%, transparent 70%);
|
| opacity: 0;
|
| transition: opacity 0.3s;
|
| }
|
|
|
| .btn:hover::before {
|
| opacity: 1;
|
| }
|
|
|
| .btn:active {
|
| transform: scale(0.98);
|
| }
|
|
|
| .btn:disabled {
|
| opacity: 0.5;
|
| cursor: not-allowed;
|
| pointer-events: none;
|
| }
|
|
|
|
|
| .btn-primary,
|
| .btn-gradient {
|
| background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
|
| color: white;
|
| box-shadow: 0 4px 12px rgba(45, 212, 191, 0.3);
|
| }
|
|
|
| .btn-primary:hover,
|
| .btn-gradient:hover {
|
| box-shadow: 0 6px 16px rgba(45, 212, 191, 0.4);
|
| transform: translateY(-2px);
|
| }
|
|
|
| .btn-secondary {
|
| background: var(--bg-card);
|
| color: var(--text-primary);
|
| border-color: rgba(255, 255, 255, 0.1);
|
| }
|
|
|
| .btn-secondary:hover {
|
| background: var(--bg-hover);
|
| border-color: rgba(255, 255, 255, 0.2);
|
| }
|
|
|
| .btn-success {
|
| background: var(--success);
|
| color: white;
|
| }
|
|
|
| .btn-success:hover {
|
| background: #059669;
|
| }
|
|
|
| .btn-danger {
|
| background: var(--danger);
|
| color: white;
|
| }
|
|
|
| .btn-danger:hover {
|
| background: #dc2626;
|
| }
|
|
|
| .btn-warning {
|
| background: var(--warning);
|
| color: white;
|
| }
|
|
|
| .btn-warning:hover {
|
| background: #d97706;
|
| }
|
|
|
|
|
| .btn-sm {
|
| padding: 0.375rem 0.75rem;
|
| font-size: 0.8125rem;
|
| }
|
|
|
| .btn-lg {
|
| padding: 0.875rem 1.75rem;
|
| font-size: 1rem;
|
| }
|
|
|
| .btn-block {
|
| width: 100%;
|
| }
|
|
|
|
|
| .btn-icon {
|
| padding: 0.5rem;
|
| width: 2.5rem;
|
| height: 2.5rem;
|
| background: var(--bg-card);
|
| border: 1px solid rgba(255, 255, 255, 0.1);
|
| border-radius: var(--radius-md);
|
| color: var(--text-primary);
|
| transition: var(--transition);
|
| }
|
|
|
| .btn-icon:hover {
|
| background: var(--bg-hover);
|
| border-color: var(--primary);
|
| color: var(--primary);
|
| transform: translateY(-2px);
|
| }
|
|
|
| .btn-icon svg {
|
| width: 1.25rem;
|
| height: 1.25rem;
|
| }
|
|
|
|
|
| .card,
|
| .panel-card,
|
| .stat-card {
|
| background: var(--bg-card);
|
| border: 1px solid rgba(255, 255, 255, 0.08);
|
| border-radius: var(--radius-lg);
|
| padding: 1.5rem;
|
| transition: var(--transition);
|
| backdrop-filter: blur(20px);
|
| }
|
|
|
| .card:hover,
|
| .panel-card:hover {
|
| border-color: rgba(255, 255, 255, 0.15);
|
| box-shadow: var(--shadow-lg);
|
| transform: translateY(-2px);
|
| }
|
|
|
|
|
| .form-input,
|
| .form-select,
|
| .form-textarea,
|
| select,
|
| input[type="text"],
|
| input[type="email"],
|
| input[type="password"],
|
| input[type="number"],
|
| textarea {
|
| width: 100%;
|
| padding: 0.625rem 1rem;
|
| font-size: 0.875rem;
|
| line-height: 1.5;
|
| color: var(--text-primary);
|
| background: rgba(255, 255, 255, 0.05);
|
| border: 1px solid rgba(255, 255, 255, 0.1);
|
| border-radius: var(--radius-md);
|
| transition: var(--transition);
|
| }
|
|
|
| .form-input:focus,
|
| .form-select:focus,
|
| .form-textarea:focus,
|
| select:focus,
|
| input:focus,
|
| textarea:focus {
|
| outline: none;
|
| border-color: var(--primary);
|
| box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.1);
|
| background: rgba(255, 255, 255, 0.08);
|
| }
|
|
|
| .form-input:disabled,
|
| .form-select:disabled,
|
| select:disabled,
|
| input:disabled {
|
| opacity: 0.5;
|
| cursor: not-allowed;
|
| }
|
|
|
|
|
| .form-select,
|
| select {
|
| appearance: none;
|
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
|
| background-repeat: no-repeat;
|
| background-position: right 0.75rem center;
|
| background-size: 1.25rem;
|
| padding-right: 2.5rem;
|
| }
|
|
|
|
|
| .spinner,
|
| .loading-spinner {
|
| display: inline-block;
|
| width: 2rem;
|
| height: 2rem;
|
| border: 3px solid rgba(255, 255, 255, 0.1);
|
| border-top-color: var(--primary);
|
| border-radius: 50%;
|
| animation: spin 0.8s linear infinite;
|
| }
|
|
|
| @keyframes spin {
|
| to {
|
| transform: rotate(360deg);
|
| }
|
| }
|
|
|
| .loading-container {
|
| display: flex;
|
| flex-direction: column;
|
| align-items: center;
|
| justify-content: center;
|
| gap: 1rem;
|
| padding: 3rem;
|
| text-align: center;
|
| }
|
|
|
|
|
| .toast,
|
| #toast-container > div {
|
| position: fixed;
|
| top: 1rem;
|
| right: 1rem;
|
| min-width: 300px;
|
| max-width: 500px;
|
| padding: 1rem 1.25rem;
|
| background: var(--bg-card);
|
| border: 1px solid rgba(255, 255, 255, 0.1);
|
| border-radius: var(--radius-lg);
|
| box-shadow: var(--shadow-xl);
|
| backdrop-filter: blur(20px);
|
| animation: slideInRight 0.3s ease-out;
|
| z-index: 9999;
|
| }
|
|
|
| @keyframes slideInRight {
|
| from {
|
| transform: translateX(100%);
|
| opacity: 0;
|
| }
|
| to {
|
| transform: translateX(0);
|
| opacity: 1;
|
| }
|
| }
|
|
|
| .toast.success {
|
| border-left: 4px solid var(--success);
|
| }
|
|
|
| .toast.error {
|
| border-left: 4px solid var(--danger);
|
| }
|
|
|
| .toast.warning {
|
| border-left: 4px solid var(--warning);
|
| }
|
|
|
| .toast.info {
|
| border-left: 4px solid var(--info);
|
| }
|
|
|
|
|
| .modal {
|
| position: fixed;
|
| inset: 0;
|
| z-index: 9998;
|
| display: none;
|
| align-items: center;
|
| justify-content: center;
|
| padding: 1rem;
|
| }
|
|
|
| .modal.active {
|
| display: flex;
|
| }
|
|
|
| .modal-backdrop {
|
| position: absolute;
|
| inset: 0;
|
| background: rgba(0, 0, 0, 0.75);
|
| backdrop-filter: blur(4px);
|
| animation: fadeIn 0.2s ease-out;
|
| }
|
|
|
| @keyframes fadeIn {
|
| from { opacity: 0; }
|
| to { opacity: 1; }
|
| }
|
|
|
| .modal-content {
|
| position: relative;
|
| max-width: 600px;
|
| width: 100%;
|
| max-height: 90vh;
|
| background: var(--bg-card);
|
| border: 1px solid rgba(255, 255, 255, 0.1);
|
| border-radius: var(--radius-xl);
|
| box-shadow: var(--shadow-xl);
|
| overflow: hidden;
|
| animation: slideUp 0.3s ease-out;
|
| }
|
|
|
| @keyframes slideUp {
|
| from {
|
| transform: translateY(2rem);
|
| opacity: 0;
|
| }
|
| to {
|
| transform: translateY(0);
|
| opacity: 1;
|
| }
|
| }
|
|
|
|
|
| svg:not(.unstyled) {
|
| flex-shrink: 0;
|
| }
|
|
|
| .icon {
|
| display: inline-flex;
|
| align-items: center;
|
| justify-content: center;
|
| width: 1.5rem;
|
| height: 1.5rem;
|
| }
|
|
|
| .icon-sm {
|
| width: 1rem;
|
| height: 1rem;
|
| }
|
|
|
| .icon-lg {
|
| width: 2rem;
|
| height: 2rem;
|
| }
|
|
|
| .icon-xl {
|
| width: 3rem;
|
| height: 3rem;
|
| }
|
|
|
|
|
| .badge {
|
| display: inline-flex;
|
| align-items: center;
|
| gap: 0.25rem;
|
| padding: 0.25rem 0.75rem;
|
| font-size: 0.75rem;
|
| font-weight: 600;
|
| line-height: 1;
|
| border-radius: 9999px;
|
| white-space: nowrap;
|
| }
|
|
|
| .badge-primary {
|
| background: rgba(45, 212, 191, 0.2);
|
| color: var(--primary);
|
| }
|
|
|
| .badge-success {
|
| background: rgba(16, 185, 129, 0.2);
|
| color: var(--success);
|
| }
|
|
|
| .badge-warning {
|
| background: rgba(245, 158, 11, 0.2);
|
| color: var(--warning);
|
| }
|
|
|
| .badge-danger {
|
| background: rgba(239, 68, 68, 0.2);
|
| color: var(--danger);
|
| }
|
|
|
|
|
| [data-tooltip] {
|
| position: relative;
|
| }
|
|
|
| [data-tooltip]::after {
|
| content: attr(data-tooltip);
|
| position: absolute;
|
| bottom: calc(100% + 0.5rem);
|
| left: 50%;
|
| transform: translateX(-50%) translateY(-0.25rem);
|
| padding: 0.5rem 0.75rem;
|
| font-size: 0.75rem;
|
| line-height: 1.2;
|
| white-space: nowrap;
|
| background: var(--bg-secondary);
|
| border: 1px solid rgba(255, 255, 255, 0.1);
|
| border-radius: var(--radius);
|
| opacity: 0;
|
| pointer-events: none;
|
| transition: opacity 0.2s, transform 0.2s;
|
| z-index: 9999;
|
| }
|
|
|
| [data-tooltip]:hover::after {
|
| opacity: 1;
|
| transform: translateX(-50%) translateY(0);
|
| }
|
|
|
|
|
| @media (max-width: 768px) {
|
| .btn {
|
| font-size: 0.8125rem;
|
| padding: 0.5rem 1rem;
|
| }
|
|
|
| .card {
|
| padding: 1rem;
|
| }
|
|
|
| .modal-content {
|
| margin: 1rem;
|
| }
|
| }
|
|
|
|
|
| ::-webkit-scrollbar {
|
| width: 0.5rem;
|
| height: 0.5rem;
|
| }
|
|
|
| ::-webkit-scrollbar-track {
|
| background: rgba(255, 255, 255, 0.05);
|
| }
|
|
|
| ::-webkit-scrollbar-thumb {
|
| background: rgba(255, 255, 255, 0.2);
|
| border-radius: 0.25rem;
|
| }
|
|
|
| ::-webkit-scrollbar-thumb:hover {
|
| background: rgba(255, 255, 255, 0.3);
|
| }
|
|
|
|
|
| *:focus-visible {
|
| outline: 2px solid var(--primary);
|
| outline-offset: 2px;
|
| }
|
|
|
|
|
| ::selection {
|
| background: rgba(45, 212, 191, 0.3);
|
| color: var(--text-primary);
|
| }
|
|
|
|
|
| .sr-only {
|
| position: absolute;
|
| width: 1px;
|
| height: 1px;
|
| padding: 0;
|
| margin: -1px;
|
| overflow: hidden;
|
| clip: rect(0, 0, 0, 0);
|
| white-space: nowrap;
|
| border-width: 0;
|
| }
|
|
|
|
|
| @keyframes pulse {
|
| 0%, 100% {
|
| opacity: 1;
|
| }
|
| 50% {
|
| opacity: 0.5;
|
| }
|
| }
|
|
|
| .pulse {
|
| animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
| }
|
|
|
| @keyframes bounce {
|
| 0%, 100% {
|
| transform: translateY(-25%);
|
| animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
|
| }
|
| 50% {
|
| transform: translateY(0);
|
| animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
| }
|
| }
|
|
|
| .bounce {
|
| animation: bounce 1s infinite;
|
| }
|
|
|
|
|
| @media print {
|
| .btn,
|
| .modal,
|
| .toast,
|
| .sidebar {
|
| display: none !important;
|
| }
|
| }
|
|
|