/* ======================================== CANNIBAL GIRLS - ARCHIVE TERMINAL Art Direction & Implementation ======================================== */ /* ---- 1. COLOR PALETTE ---- Primary: #E85D75 - Reddish Pink (accents, highlights) Dark Pink: #B8304E - Deep crimson (hover states, active) Background: #0F0D0D - Warm near-black Surface: #181414 - Panel backgrounds Surface Lit: #1E1A1A - Elevated panels Border: #3A2A2A - Dark brown-red borders Border Light: #4A3535 - Subtle borders Text Primary: #E8D5D5 - Warm off-white Text Sec: #8B6F6F - Muted pink-gray Text Dim: #5A4545 - Very muted Accent Green: #4A7C59 - Terminal cursor, sparing use Accent Rust: #8B4513 - Warnings, sparing use Shadow: rgba(0, 0, 0, 0.9) Glow: rgba(232, 93, 117, 0.2) */ /* ---- 2. FONTS ---- Display: 'VT323', monospace - Large headers, pixelated terminal feel Primary: 'Courier Prime', monospace - Body text, clean but vintage UI: 'Space Mono', monospace - UI labels, structured data Fallback: 'Courier New', Courier, monospace */ /* ---- 3. BASE RESET ---- */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } ::selection { background: #E85D75; color: #0F0D0D; } ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #0F0D0D; border-left: 1px solid #3A2A2A; } ::-webkit-scrollbar-thumb { background: #3A2A2A; border: 1px solid #4A3535; } ::-webkit-scrollbar-thumb:hover { background: #4A3535; } html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: 'Courier Prime', 'Courier New', Courier, monospace; background: #0F0D0D; color: #E8D5D5; overflow: hidden; height: 100vh; width: 100vw; line-height: 1.4; } /* ---- 4. OVERLAY EFFECTS ---- */ /* Scanlines - subtle horizontal lines */ .scanlines { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9998; background: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(0, 0, 0, 0.03) 2px, rgba(0, 0, 0, 0.03) 4px ); animation: scanlineMove 8s linear infinite; } @keyframes scanlineMove { 0% { background-position: 0 0; } 100% { background-position: 0 100%; } } /* Noise texture overlay */ .noise-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9997; opacity: 0.04; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); } /* Vignette - dark edges */ .vignette { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9996; background: radial-gradient( ellipse at center, transparent 0%, transparent 50%, rgba(15, 13, 13, 0.4) 100% ); } /* ---- 5. LOADING SCREEN ---- */ .loading-screen { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #0F0D0D; display: flex; align-items: center; justify-content: center; z-index: 1000; transition: opacity 0.8s ease-out, visibility 0.8s; } .loading-screen.hidden { opacity: 0; visibility: hidden; pointer-events: none; } .loading-content { width: 100%; max-width: 800px; height: 100vh; display: flex; flex-direction: column; padding: 2rem; position: relative; } .loading-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 1rem; border-bottom: 1px solid #3A2A2A; font-family: 'Space Mono', monospace; font-size: 0.75rem; letter-spacing: 0.1em; color: #5A4545; } .status-line { display: flex; align-items: center; gap: 0.5rem; } .status-indicator { display: inline-block; width: 8px; height: 8px; background: #4A7C59; animation: blink 2s ease-in-out infinite; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } .loading-center { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1.5rem; } .loading-title { font-family: 'VT323', monospace; font-size: clamp(3rem, 10vw, 6rem); font-weight: 400; color: #E85D75; text-transform: uppercase; letter-spacing: 0.15em; text-shadow: 0 0 10px rgba(232, 93, 117, 0.3), 0 0 40px rgba(232, 93, 117, 0.1); line-height: 1; animation: titleFlicker 4s ease-in-out infinite; } @keyframes titleFlicker { 0%, 90%, 100% { opacity: 1; } 92% { opacity: 0.8; } 94% { opacity: 0.95; } 96% { opacity: 0.7; } } .loading-separator { display: flex; align-items: center; gap: 1rem; width: 100%; max-width: 400px; } .sep-line { flex: 1; height: 1px; background: #3A2A2A; } .sep-diamond { color: #B8304E; font-size: 0.6rem; animation: diamondPulse 2s ease-in-out infinite; } @keyframes diamondPulse { 0%, 100% { opacity: 0.5; transform: scale(1); } 50% { opacity: 1; transform: scale(1.2); } } .loading-subtitle { font-family: 'Space Mono', monospace; font-size: 0.85rem; color: #5A4545; letter-spacing: 0.3em; text-transform: uppercase; } .load-btn { margin-top: 2rem; background: transparent; border: 1px solid #E85D75; color: #E85D75; padding: 1rem 2.5rem; font-family: 'VT323', monospace; font-size: 1.5rem; letter-spacing: 0.2em; cursor: pointer; position: relative; transition: all 0.2s ease; text-transform: uppercase; } .load-btn::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(232, 93, 117, 0.05); opacity: 0; transition: opacity 0.2s ease; } .load-btn:hover::before { opacity: 1; } .load-btn:hover { border-color: #B8304E; color: #B8304E; box-shadow: 0 0 15px rgba(232, 93, 117, 0.2), inset 0 0 15px rgba(232, 93, 117, 0.05); text-shadow: 0 0 8px rgba(232, 93, 117, 0.3); } .load-btn:active { transform: scale(0.98); } .btn-bracket { color: #5A4545; transition: color 0.2s; } .load-btn:hover .btn-bracket { color: #8B6F6F; } .loading-footer { padding-top: 1rem; border-top: 1px solid #3A2A2A; font-family: 'Space Mono', monospace; font-size: 0.7rem; color: #5A4545; display: flex; flex-direction: column; gap: 0.5rem; } .footer-top, .footer-bottom { display: flex; gap: 0.5rem; align-items: baseline; } .footer-label { color: #8B6F6F; min-width: 80px; } .footer-value { color: #E8D5D5; } .session-id { font-size: 0.65rem; color: #8B6F6F; word-break: break-all; letter-spacing: 0.05em; } /* ---- 6. LOADING PHASE ---- */ .loading-phase { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #0F0D0D; display: flex; align-items: center; justify-content: center; z-index: 1001; transition: opacity 0.5s ease-out, visibility 0.5s; } .loading-phase.hidden { opacity: 0; visibility: hidden; pointer-events: none; } .phase-content { width: 100%; max-width: 700px; padding: 2rem; } .phase-header { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 2rem; padding-bottom: 1rem; border-bottom: 1px solid #3A2A2A; font-family: 'Space Mono', monospace; font-size: 0.8rem; color: #E85D75; letter-spacing: 0.15em; } .phase-icon { animation: blink 1s ease-in-out infinite; } .phase-terminal { background: #181414; border: 1px solid #3A2A2A; padding: 1.5rem; margin-bottom: 2rem; min-height: 200px; font-family: 'Courier Prime', monospace; font-size: 0.85rem; line-height: 1.6; color: #8B6F6F; position: relative; overflow: hidden; } .phase-terminal::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 2px; background: #E85D75; opacity: 0.3; } .terminal-output { display: flex; flex-direction: column; gap: 0.25rem; } .terminal-line { display: flex; gap: 0.5rem; } .terminal-line .line-prompt { color: #4A7C59; white-space: nowrap; } .terminal-line .line-content { color: #E8D5D5; } .terminal-line .line-content.success { color: #4A7C59; } .terminal-line .line-content.warning { color: #8B4513; } .terminal-line .line-content.error { color: #B8304E; } .terminal-cursor { display: inline-block; color: #4A7C59; animation: cursorBlink 0.7s step-end infinite; margin-top: 0.5rem; } @keyframes cursorBlink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } .phase-progress { border: 1px solid #3A2A2A; padding: 1.5rem; background: #181414; } .progress-label { display: flex; justify-content: space-between; margin-bottom: 0.75rem; font-family: 'Space Mono', monospace; font-size: 0.75rem; letter-spacing: 0.1em; color: #8B6F6F; } .progress-bar { width: 100%; height: 4px; background: #1E1A1A; border: 1px solid #3A2A2A; position: relative; overflow: hidden; } .progress-fill { height: 100%; background: #E85D75; width: 0%; transition: width 0.3s ease-out; box-shadow: 0 0 10px rgba(232, 93, 117, 0.3); } /* ---- 7. ARCHIVE BROWSER ---- */ .archive-browser { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #0F0D0D; display: flex; flex-direction: column; z-index: 100; opacity: 0; visibility: hidden; transition: opacity 0.5s ease-out, visibility 0.5s; } .archive-browser.active { opacity: 1; visibility: visible; } /* Header */ .archive-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1.5rem; border-bottom: 1px solid #3A2A2A; background: #181414; min-height: 50px; } .header-left { display: flex; align-items: baseline; gap: 0.75rem; } .archive-title { font-family: 'VT323', monospace; font-size: 1.5rem; font-weight: 400; color: #E85D75; letter-spacing: 0.1em; text-shadow: 0 0 10px rgba(232, 93, 117, 0.2); } .header-separator { color: #3A2A2A; font-family: 'Space Mono', monospace; } .header-subtitle { font-family: 'Space Mono', monospace; font-size: 0.75rem; color: #5A4545; letter-spacing: 0.2em; } .header-right { display: flex; align-items: center; gap: 2rem; } .header-stats { display: flex; gap: 1.5rem; } .stat-item { display: flex; gap: 0.5rem; font-family: 'Space Mono', monospace; font-size: 0.7rem; letter-spacing: 0.1em; } .stat-label { color: #5A4545; } .stat-value { color: #E8D5D5; } .header-time { font-family: 'Space Mono', monospace; font-size: 0.7rem; color: #8B6F6F; letter-spacing: 0.1em; } /* Body Layout */ .archive-body { flex: 1; display: grid; grid-template-columns: 220px 1fr 320px; overflow: hidden; } /* Sidebar */ .archive-sidebar { background: #181414; border-right: 1px solid #3A2A2A; display: flex; flex-direction: column; overflow-y: auto; } .sidebar-section { padding: 1.25rem; border-bottom: 1px solid #3A2A2A; } .sidebar-title { font-family: 'Space Mono', monospace; font-size: 0.65rem; color: #5A4545; letter-spacing: 0.2em; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 1px solid #2B1D1A; } .sidebar-menu { list-style: none; display: flex; flex-direction: column; gap: 0.25rem; } .sidebar-item { display: flex; align-items: center; gap: 0.75rem; padding: 0.6rem 0.75rem; cursor: pointer; transition: all 0.15s ease; font-family: 'Courier Prime', monospace; font-size: 0.8rem; border: 1px solid transparent; } .sidebar-item:hover { background: rgba(232, 93, 117, 0.05); border-color: #3A2A2A; } .sidebar-item.active { background: rgba(232, 93, 117, 0.08); border-color: #E85D75; color: #E85D75; } .sidebar-item.active .item-icon { color: #E85D75; } .item-icon { color: #5A4545; font-size: 0.7rem; width: 16px; text-align: center; } .item-label { flex: 1; letter-spacing: 0.05em; } .item-count { font-family: 'Space Mono', monospace; font-size: 0.65rem; color: #5A4545; background: #1E1A1A; padding: 0.1rem 0.4rem; border: 1px solid #3A2A2A; } .system-info { display: flex; flex-direction: column; gap: 0.5rem; } .sys-row { display: flex; justify-content: space-between; font-family: 'Space Mono', monospace; font-size: 0.7rem; } .sys-label { color: #5A4545; } .sys-value { color: #8B6F6F; } .sys-value.status-ok { color: #4A7C59; } /* Content Area */ .archive-content { display: flex; flex-direction: column; overflow: hidden; background: #0F0D0D; } /* Toolbar */ .content-toolbar { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1.25rem; border-bottom: 1px solid #3A2A2A; background: #181414; gap: 1rem; } .toolbar-left { display: flex; align-items: center; gap: 1.5rem; } .view-switcher { display: flex; gap: 0.25rem; } .view-btn { display: flex; align-items: center; gap: 0.4rem; padding: 0.4rem 0.75rem; background: transparent; border: 1px solid #3A2A2A; color: #5A4545; font-family: 'Space Mono', monospace; font-size: 0.65rem; letter-spacing: 0.1em; cursor: pointer; transition: all 0.15s ease; } .view-btn:hover { border-color: #4A3535; color: #8B6F6F; } .view-btn.active { border-color: #E85D75; color: #E85D75; background: rgba(232, 93, 117, 0.05); } .view-icon { font-size: 0.8rem; } .sort-controls { display: flex; align-items: center; gap: 0.5rem; } .sort-label { font-family: 'Space Mono', monospace; font-size: 0.65rem; color: #5A4545; letter-spacing: 0.1em; } .sort-select { background: #181414; border: 1px solid #3A2A2A; color: #8B6F6F; font-family: 'Courier Prime', monospace; font-size: 0.75rem; padding: 0.35rem 0.5rem; cursor: pointer; outline: none; } .sort-select:focus { border-color: #E85D75; } .sort-select option { background: #181414; color: #E8D5D5; } .toolbar-right { display: flex; align-items: center; } .search-box { display: flex; align-items: center; gap: 0.5rem; background: #181414; border: 1px solid #3A2A2A; padding: 0.35rem 0.75rem; transition: border-color 0.15s; } .search-box:focus-within { border-color: #E85D75; } .search-icon { color: #5A4545; font-size: 0.9rem; } .search-input { background: transparent; border: none; color: #E8D5D5; font-family: 'Courier Prime', monospace; font-size: 0.8rem; outline: none; width: 200px; } .search-input::placeholder { color: #5A4545; } /* File List Container */ .file-list-container { flex: 1; overflow-y: auto; padding: 0.5rem 0; } .file-list-header { display: grid; grid-template-columns: 1fr 100px 100px 140px; gap: 0.5rem; padding: 0.5rem 1.25rem; font-family: 'Space Mono', monospace; font-size: 0.65rem; color: #5A4545; letter-spacing: 0.15em; border-bottom: 1px solid #2B1D1A; position: sticky; top: 0; background: #0F0D0D; z-index: 10; } .file-list { display: flex; flex-direction: column; } /* File Item - List View */ .file-item { display: grid; grid-template-columns: 1fr 100px 100px 140px; gap: 0.5rem; padding: 0.65rem 1.25rem; align-items: center; cursor: pointer; border-bottom: 1px solid #1E1A1A; transition: all 0.15s ease; font-family: 'Courier Prime', monospace; font-size: 0.8rem; position: relative; } .file-item::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 2px; background: transparent; transition: background 0.15s; } .file-item:hover { background: rgba(232, 93, 117, 0.03); } .file-item:hover::before { background: #E85D75; } .file-item.selected { background: rgba(232, 93, 117, 0.06); border-bottom-color: #3A2A2A; } .file-item.selected::before { background: #E85D75; } .file-name-cell { display: flex; align-items: center; gap: 0.75rem; } .file-icon { color: #5A4545; font-size: 0.9rem; width: 20px; text-align: center; } .file-name { color: #E8D5D5; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .file-type { color: #8B6F6F; font-family: 'Space Mono', monospace; font-size: 0.7rem; text-transform: uppercase; } .file-size { color: #8B6F6F; font-family: 'Space Mono', monospace; font-size: 0.75rem; } .file-date { color: #5A4545; font-family: 'Space Mono', monospace; font-size: 0.7rem; } /* File Item - Grid View */ .file-list.grid-view { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 1px; padding: 0.5rem; } .file-list.grid-view .file-item { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1.5rem 1rem; gap: 0.5rem; text-align: center; aspect-ratio: 1; border: 1px solid #1E1A1A; } .file-list.grid-view .file-item::before { display: none; } .file-list.grid-view .file-name-cell { flex-direction: column; gap: 0.5rem; } .file-list.grid-view .file-icon { font-size: 1.5rem; color: #8B6F6F; } .file-list.grid-view .file-name { font-size: 0.75rem; max-width: 120px; } .file-list.grid-view .file-type, .file-list.grid-view .file-size, .file-list.grid-view .file-date { font-size: 0.65rem; } /* Preview Pane */ .archive-preview { background: #181414; border-left: 1px solid #3A2A2A; display: flex; flex-direction: column; overflow-y: auto; transition: transform 0.3s ease; } .archive-preview.closed { transform: translateX(100%); width: 0; border: none; } .preview-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1rem; border-bottom: 1px solid #3A2A2A; } .preview-title { font-family: 'Space Mono', monospace; font-size: 0.65rem; color: #5A4545; letter-spacing: 0.2em; } .preview-close { background: transparent; border: 1px solid #3A2A2A; color: #5A4545; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; cursor: pointer; font-size: 0.7rem; transition: all 0.15s; } .preview-close:hover { border-color: #B8304E; color: #B8304E; } .preview-content { flex: 1; display: flex; align-items: center; justify-content: center; padding: 2rem 1rem; border-bottom: 1px solid #3A2A2A; } .preview-placeholder { display: flex; flex-direction: column; align-items: center; gap: 1rem; color: #5A4545; } .placeholder-icon { font-size: 2rem; opacity: 0.3; } .placeholder-text { font-family: 'Space Mono', monospace; font-size: 0.65rem; letter-spacing: 0.15em; text-align: center; } .preview-file-icon { font-size: 4rem; color: #E85D75; opacity: 0.8; text-shadow: 0 0 20px rgba(232, 93, 117, 0.2); } .preview-meta { padding: 1rem; display: flex; flex-direction: column; gap: 0.5rem; border-bottom: 1px solid #3A2A2A; } .meta-row { display: flex; justify-content: space-between; font-family: 'Space Mono', monospace; font-size: 0.65rem; gap: 0.5rem; } .meta-label { color: #5A4545; white-space: nowrap; } .meta-value { color: #8B6F6F; text-align: right; word-break: break-all; } .meta-value.checksum { font-size: 0.55rem; color: #5A4545; } .preview-actions { padding: 1rem; display: flex; flex-direction: column; gap: 0.5rem; } .action-btn { display: flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.6rem; background: transparent; border: 1px solid #3A2A2A; color: #8B6F6F; font-family: 'Space Mono', monospace; font-size: 0.7rem; letter-spacing: 0.1em; cursor: pointer; transition: all 0.15s; } .action-btn:hover { border-color: #E85D75; color: #E85D75; background: rgba(232, 93, 117, 0.05); } .action-icon { font-size: 0.8rem; } /* Footer */ .archive-footer { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem 1.5rem; border-top: 1px solid #3A2A2A; background: #181414; font-family: 'Space Mono', monospace; font-size: 0.65rem; color: #5A4545; letter-spacing: 0.1em; min-height: 36px; } .footer-item { white-space: nowrap; } .footer-center { color: #4A7C59; } .session-truncated { color: #5A4545; } /* ---- 8. GLITCH EFFECTS ---- */ .glitch-text { position: relative; } .glitch-text::before, .glitch-text::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .glitch-text::before { left: 2px; text-shadow: -2px 0 #B8304E; clip: rect(24px, 550px, 90px, 0); animation: glitch-anim-1 2.5s infinite linear alternate-reverse; } .glitch-text::after { left: -2px; text-shadow: -2px 0 #4A7C59; clip: rect(85px, 550px, 140px, 0); animation: glitch-anim-2 3s infinite linear alternate-reverse; } @keyframes glitch-anim-1 { 0% { clip: rect(20px, 9999px, 15px, 0); } 20% { clip: rect(60px, 9999px, 70px, 0); } 40% { clip: rect(20px, 9999px, 5px, 0); } 60% { clip: rect(80px, 9999px, 50px, 0); } 80% { clip: rect(10px, 9999px, 40px, 0); } 100% { clip: rect(50px, 9999px, 20px, 0); } } @keyframes glitch-anim-2 { 0% { clip: rect(25px, 9999px, 90px, 0); } 20% { clip: rect(10px, 9999px, 30px, 0); } 40% { clip: rect(90px, 9999px, 100px, 0); } 60% { clip: rect(15px, 9999px, 5px, 0); } 80% { clip: rect(70px, 9999px, 60px, 0); } 100% { clip: rect(40px, 9999px, 80px, 0); } } /* ---- 9. PANEL REVEAL ANIMATIONS ---- */ @keyframes slideInLeft { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes panelReveal { from { opacity: 0; transform: scaleX(0); transform-origin: left; } to { opacity: 1; transform: scaleX(1); transform-origin: left; } } .animate-slide-left { animation: slideInLeft 0.4s ease-out forwards; } .animate-slide-right { animation: slideInRight 0.4s ease-out forwards; } .animate-fade-up { animation: fadeInUp 0.3s ease-out forwards; } /* Staggered animations */ .stagger-1 { animation-delay: 0.05s; } .stagger-2 { animation-delay: 0.1s; } .stagger-3 { animation-delay: 0.15s; } .stagger-4 { animation-delay: 0.2s; } .stagger-5 { animation-delay: 0.25s; } /* ---- 10. RESPONSIVE ---- */ @media (max-width: 1024px) { .archive-body { grid-template-columns: 180px 1fr 280px; } } @media (max-width: 768px) { .archive-body { grid-template-columns: 1fr; grid-template-rows: auto 1fr; } .archive-sidebar { display: none; } .archive-preview { position: fixed; right: 0; top: 50px; bottom: 36px; width: 100%; max-width: 400px; z-index: 200; transform: translateX(100%); } .archive-preview.active { transform: translateX(0); } .file-list-header { grid-template-columns: 1fr 80px 80px; } .file-item { grid-template-columns: 1fr 80px 80px; } .col-date { display: none; } } /* ---- 11. UTILITY ---- */ .hidden { display: none !important; } .text-pink { color: #E85D75; } .text-dim { color: #5A4545; } .text-muted { color: #8B6F6F; } /* Focus states */ button:focus-visible, select:focus-visible, input:focus-visible { outline: 1px solid #E85D75; outline-offset: 1px; } /* Hover glow for interactive elements */ .interactive-glow:hover { box-shadow: 0 0 8px rgba(232, 93, 117, 0.15); } /* Subtle border glow animation */ .border-glow { animation: borderGlow 3s ease-in-out infinite; } @keyframes borderGlow { 0%, 100% { border-color: #3A2A2A; } 50% { border-color: #4A3535; } } /* Terminal text effect */ .typing-effect { overflow: hidden; white-space: nowrap; animation: typing 2s steps(40, end); } @keyframes typing { from { width: 0; } to { width: 100%; } } /* Subtle shake for errors */ .shake { animation: shake 0.3s ease-in-out; } @keyframes shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-3px); } 75% { transform: translateX(3px); } } /* Loading spinner for small elements */ .spinner { display: inline-block; width: 12px; height: 12px; border: 1px solid #3A2A2A; border-top-color: #E85D75; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } }