/* ============================================ 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; }