:root { /* --- Base Palette --- */ --brilliant-blue: #5bcefa; --brilliant-pink: #f5a9b8; --brilliant-white: #ffffff; --dark-bg-base: #18181b; --dark-bg-root: #111113; /* --- Themed Variables (Light Mode Default) --- */ --c-bg: var(--brilliant-white); --c-text-primary: var(--dark-bg-base); --c-text-secondary: #888; --c-primary: var(--brilliant-blue); --c-secondary: var(--brilliant-pink); --c-panel-bg: var(--brilliant-white); --c-panel-border: var(--brilliant-pink); --c-panel-shadow: 0 8px 25px rgba(91, 206, 250, 0.07); --c-header-bg: var(--c-panel-bg); --c-header-border: transparent; --c-footer-bg: var(--c-panel-bg); --c-footer-border: #f0f0f0; --c-dropzone-bg: #fafdff; --c-dropzone-border: var(--c-panel-border); --c-dropzone-hover-bg: linear-gradient(135deg, rgba(91,206,250,0.12), rgba(245,169,184,0.08)); --c-progress-track: #e0e0e0; --c-btn-primary-bg: linear-gradient(90deg, rgba(91,206,250,0.12) 0%, rgba(245,169,184,0.10) 100%); --c-btn-secondary-bg: linear-gradient(90deg, rgba(245,169,184,0.12) 0%, rgba(91,206,250,0.08) 100%); --c-success: #50c878; --c-danger: #ef4444; } body[data-theme="dark"] { /* --- Themed Variables (Dark Mode Overrides) --- */ --c-bg: var(--dark-bg-root); --c-text-primary: #f4f4f5; --c-text-secondary: #a1a1aa; --c-panel-bg: var(--dark-bg-base); --c-panel-border: rgba(245, 169, 184, 0.4); --c-panel-shadow: 0 0 0 1px rgba(255, 255, 255, 0.05), 0 4px 12px rgba(0, 0, 0, 0.2); --c-header-bg: #111113; --c-header-border: var(--c-primary); --c-footer-bg: #111113; --c-footer-border: rgba(255, 255, 255, 0.1); --c-dropzone-bg: rgba(255, 255, 255, 0.02); --c-dropzone-border: rgba(245, 169, 184, 0.25); --c-dropzone-hover-bg: linear-gradient(135deg, rgba(91,206,250,0.1), rgba(245,169,184,0.08)); --c-progress-track: #37373d; --c-btn-primary-bg: linear-gradient(90deg, rgba(91,206,250,0.15) 0%, rgba(245,169,184,0.12) 100%); --c-btn-secondary-bg: linear-gradient(90deg, rgba(245,169,184,0.15) 0%, rgba(91,206,250,0.10) 100%); --c-success: #3ec6a8; --c-danger: #f87171; } /* --- Global Styles --- */ *, *::before, *::after { box-sizing: border-box; } body { font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, Arial, sans-serif; background: var(--c-bg); color: var(--c-text-primary); margin: 0; padding: 0; min-height: 100vh; overflow-x: hidden; display: flex; flex-direction: column; transition: background 0.3s ease, color 0.3s ease; } .header { width: 100%; padding: 1.5em 1.5em; display: flex; align-items: center; justify-content: space-between; position: absolute; top: 0; left: 0; z-index: 1000; background: var(--c-header-bg); border-bottom: 0px solid var(--c-header-border); transition: background 0.3s ease, border-color 0.3s ease; } .header .logo { font-size: 1.5em; font-weight: 800; color: var(--c-primary); display: flex; align-items: center; gap: 0.5em; text-decoration: none; } .header .logo img { height: 1.8em; vertical-align: middle; } .header-nav { display: flex; align-items: center; gap: 0.75rem; } @media (min-width: 768px) { .header { padding: 1.5em 2em; } .header-nav { gap: 1.5rem; } } .header-nav-link { background: none; border: none; font-family: 'IBM Plex Sans', sans-serif; font-weight: 600; font-size: 0.95rem; color: var(--c-text-secondary); cursor: pointer; padding: 0.5em; transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, transform 0.1s ease-out; text-decoration: none; display: flex; align-items: center; justify-content: center; border-radius: 6px; /* Added for pill shape */ min-width: 38px; min-height: 38px; } .brand-text { font-size: clamp(1rem, 4vw, 2rem); /* Dynamic resizing */ white-space: nowrap; /* No wrapping by default */ transition: font-size 0.2s; } @media (max-width: 400px) { .brand-text { white-space: normal; /* Allow wrapping below 400px */ } } @media (max-width: 350px) { .brand-text { display: none; /* Hide below 350px */ } } .header-nav-link:hover, .header-nav-link:focus { color: var(--c-primary); outline: none; background-color: rgba(91, 206, 250, 0.08); } .header-nav-link svg { transition: color 0.2s ease-in-out; width: 22px; height: 22px; } .header-nav-link:hover svg, .header-nav-link:focus svg { color: var(--c-primary); } /* --- NEW: Theme Toggle Button --- */ #theme-toggle .sun-icon { display: none; } #theme-toggle .moon-icon { display: block; } body[data-theme="dark"] #theme-toggle .sun-icon { display: block; } body[data-theme="dark"] #theme-toggle .moon-icon { display: none; } /* --- Initial Setup Screen --- */ .main-content { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; flex-grow: 1; padding: 8rem 2em 2em; gap: 3em; background: var(--c-bg); } .tagline-section { flex-basis: 50%; text-align: center; background: var(--c-panel-bg); border-radius: 18px; box-shadow: 0 2px 16px rgba(91, 206, 250, 0.04); padding: 2em 2em 2em 2em; margin-bottom: 2em; max-width: 600px; border: 1.5px solid rgba(245, 169, 184, 0.18); } body[data-theme="dark"] .tagline-section { border: 1.5px solid rgba(245, 169, 184, 0.3); } .tagline-section h1 { font-size: clamp(3em, 8vw, 5.5em); font-weight: 800; line-height: 1.1; margin: 0 0 0.5em 0; color: var(--c-primary); letter-spacing: 0.01em; text-shadow: 0 2px 8px rgba(91, 206, 250, 0.08); } body[data-theme="dark"] .tagline-section h1 { text-shadow: none; } .tagline-section p { font-size: 1.1em; color: var(--c-text-secondary); max-width: 450px; margin: 0 auto; } .flight-ticket-panel-wrapper { position: relative; width: 100%; max-width: 380px; } body[data-theme="dark"] .flight-ticket-panel-wrapper { filter: drop-shadow(0 0 15px rgba(91, 206, 250, 0.1)); } .flight-ticket { background: var(--c-panel-bg); color: var(--c-text-primary); border-radius: 20px; padding: 2rem; box-shadow: 0 4px 32px 0 rgba(91, 206, 250, 0.07), 0 1.5px 0 0 var(--c-secondary); border: 1.5px solid var(--c-primary); transition: box-shadow 0.2s, background 0.3s ease, color 0.3s ease; } body[data-theme="dark"] .flight-ticket { box-shadow: 0 4px 32px 0 rgba(0, 0, 0, 0.2), 0 1.5px 0 0 var(--c-secondary); } .flight-ticket h2 { font-family: "IBM Plex Mono", monospace; margin: 0; font-weight: 700; color: var(--c-primary); letter-spacing: 0.02em; text-shadow: 0 1px 0 #fff, 0 0 2px #fff; } body[data-theme="dark"] .flight-ticket h2 { text-shadow: none; } .flight-ticket p { opacity: 0.8; margin: 0.5rem 0 1.5rem 0; color: var(--c-text-primary); } .ticket-actions { font-family: "IBM Plex Sans"; display: flex; flex-direction: column; gap: 0.8em; } .ticket-actions button { width: 100%; padding: 1em; font-size: 1em; border-radius: 12px; border: 1.5px solid var(--c-primary); font-weight: 600; cursor: pointer; transition: all 0.2s, transform 0.1s ease-out; background: var(--c-btn-primary-bg); color: var(--c-primary); box-shadow: 0 1px 4px rgba(91, 206, 250, 0.06); } .ticket-actions button:hover, .ticket-actions button:focus { background: var(--c-primary); color: var(--brilliant-white); border-color: var(--c-secondary); outline: none; } .or-separator { display: flex; align-items: center; text-align: center; margin: 1em 0; color: var(--c-primary); opacity: 0.6; font-weight: 500; font-size: 0.95em; } .or-separator::before, .or-separator::after { content: ''; flex: 1; border-bottom: 2px dashed var(--c-secondary); } .or-separator:not(:empty)::before { margin-right: .5em; } .or-separator:not(:empty)::after { margin-left: .5em; } .flight-code-input-wrapper { display: flex; background: var(--c-panel-bg); border-radius: 12px; overflow: hidden; border: 1.5px solid var(--c-primary); box-shadow: 0 1px 4px rgba(91, 206, 250, 0.04); transition: border-color 0.2s, background 0.3s ease, transform 0.2s ease-in-out; } .flight-code-input-wrapper:focus-within { border-color: var(--c-secondary); } /* --- NEW: Invalid Code Styling --- */ @keyframes shake { 10%, 90% { transform: translateX(-1px); } 20%, 80% { transform: translateX(2px); } 30%, 50%, 70% { transform: translateX(-4px); } 40%, 60% { transform: translateX(4px); } } .flight-code-input-wrapper.input-error { border-color: var(--c-danger); animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both; } .flight-code-input-wrapper input { flex: 1 1 auto; font-family: "IBM Plex Mono", monospace; font-size: 1.2rem; font-weight: 700; letter-spacing: 1em; width: calc(1ch * 6 + 1.5em); background: none; border: none; color: var(--c-text-primary); padding: 1em 1em; outline: none; text-align: center; box-sizing: content-box; text-transform: uppercase; } .flight-code-input-wrapper button { width: auto; background: none; color: var(--c-primary); padding: 0.5em 0.8em; cursor: pointer; font-size: 1.8em; border-radius: 10px; border: none; transition: color 0.2s, transform 0.1s ease-out; } .flight-code-input-wrapper button:hover, .flight-code-input-wrapper button:focus { color: var(--c-secondary); background: rgba(91, 206, 250, 0.08); outline: none; } @media (min-width: 992px) { .main-content { flex-direction: row; } .tagline-section { text-align: left; padding-right: 3em; margin-bottom: 0; } .tagline-section p { margin: 0; } } /* --- NEW DASHBOARD UI --- */ #dashboard { width: 100%; max-width: 1200px; margin: 0 auto; padding: 8rem 1rem 2rem; display: none; flex-direction: column; gap: 1.5rem; flex-grow: 1; } @media (min-width: 768px) { #dashboard { padding: 8rem 2rem 2rem; } } .panel { background-color: var(--c-panel-bg); border-radius: 16px; padding: 1.5rem; box-shadow: var(--c-panel-shadow); border: 2px solid var(--c-panel-border); min-width: 0; transition: background 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease; } #dashboard-header { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 1rem; border-bottom: 2px solid var(--c-primary); } #dashboard-flight-code { display: inline-block; background: linear-gradient( 90deg, rgba(91,206,250,0.12) 0%, rgba(245,169,184,0.10) 100% ); color: var(--c-primary); font-family: "IBM Plex Mono", monospace; font-size: 1em; font-weight: 700; border-radius: 10px; padding: 0.25em 0.7em; letter-spacing: 0.15em; margin-left: 0.5em; border: 1.5px solid var(--c-secondary); box-shadow: 0 1px 4px rgba(91, 206, 250, 0.06); backdrop-filter: blur(6px) saturate(1.2); -webkit-backdrop-filter: blur(6px) saturate(1.2); outline: 1px solid rgba(255,255,255,0.18); transition: box-shadow 0.2s, border-color 0.2s, background 0.2s, color 0.2s, transform 0.15s; cursor: pointer; user-select: none; position: relative; overflow: hidden; } body[data-theme="dark"] #dashboard-flight-code { outline: none; } #dashboard-flight-code:active { transform: scale(0.97); } #dashboard-flight-code.copied { background: linear-gradient( 90deg, rgba(62,198,168,0.18) 0%, rgba(127,234,210,0.18) 100% ); color: var(--c-success); border-color: var(--c-success); box-shadow: 0 0 0 2px #3ec6a833; } #dashboard-flight-code .copy-feedback { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); background: rgba(255,255,255,0.95); color: var(--c-success); font-size: 0.95em; font-weight: 700; border-radius: 6px; padding: 0.2em 0.8em; opacity: 0; pointer-events: none; transition: opacity 0.2s; z-index: 2; } body[data-theme="dark"] #dashboard-flight-code .copy-feedback { background: var(--dark-bg-root); } #dashboard-flight-code.copied .copy-feedback { opacity: 1; } .flight-info { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; } .flight-info__code { font-size: 1.5rem; font-weight: 700; } .flight-info__code span { font-weight: 800; color: var(--c-primary); } .flight-info__status { background-color: var(--c-panel-bg); color: var(--c-secondary); font-weight: 600; padding: 0.5em 1em; border-radius: 99px; font-size: 0.9em; border: 1.5px solid var(--c-primary); } .flight-actions { display: flex; gap: 0.8rem; } .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(24, 24, 27, 0.8); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); display: none; align-items: center; justify-content: center; z-index: 2000; opacity: 0; transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .modal-overlay.show { display: flex; opacity: 1; } .invite-modal { background: var(--c-panel-bg); border-radius: 20px; padding: 2rem; box-shadow: 0 20px 60px rgba(91, 206, 250, 0.15), 0 8px 32px rgba(245, 169, 184, 0.1), 0 0 0 1px rgba(91, 206, 250, 0.1); border: 2px solid var(--c-primary); max-width: 400px; width: 90%; max-height: 90vh; overflow-y: auto; position: relative; transform: scale(0.95) translateY(20px); transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), background 0.3s ease; } .modal-overlay.show .invite-modal { transform: scale(1) translateY(0); } .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 2px solid var(--c-primary); } .modal-header h3 { margin: 0; color: var(--c-primary); font-size: 1.4rem; font-weight: 700; } .modal-close { background: none; border: none; font-size: 1.5rem; color: var(--c-secondary); cursor: pointer; padding: 0.5rem; border-radius: 50%; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; position: relative; overflow: hidden; } .modal-close:hover { background: linear-gradient(135deg, rgba(245,169,184,0.15), rgba(91,206,250,0.1)); color: var(--c-primary); transform: rotate(90deg); } .modal-close:active { transform: rotate(90deg) scale(0.95); } .modal-body { padding-top: 0.5rem; color: var(--c-text-secondary); } .modal-body p { line-height: 1.6; margin-bottom: 1rem; } .modal-body .flight-code-display a.code { text-decoration: none; color: var(--c-primary); transition: color 0.2s, transform 0.1s ease-out; } .modal-body .flight-code-display a.code:hover { color: var(--c-secondary); } .modal-body .flight-code-display a.code:active { transform: scale(0.97); } /* --- NEW: Staggered Modal Content Animation --- */ .modal-overlay .modal-header, .modal-overlay .modal-body, .modal-overlay .flight-code-display, .modal-overlay .qr-section, .modal-overlay .share-actions { opacity: 0; transform: translateY(10px); transition: opacity 0.4s ease-out, transform 0.4s ease-out; } .modal-overlay.show .modal-header, .modal-overlay.show .modal-body, .modal-overlay.show .flight-code-display, .modal-overlay.show .qr-section, .modal-overlay.show .share-actions { opacity: 1; transform: translateY(0); } .modal-overlay.show .modal-header { transition-delay: 0.05s; } .modal-overlay.show .flight-code-display { transition-delay: 0.1s; } .modal-overlay.show .modal-body { transition-delay: 0.1s; } .modal-overlay.show .qr-section { transition-delay: 0.15s; } .modal-overlay.show .share-actions { transition-delay: 0.2s; } .qr-section { text-align: center; margin-bottom: 2rem; } .qr-container { background: linear-gradient(135deg, rgba(91,206,250,0.08), rgba(245,169,184,0.05)); border-radius: 16px; padding: 1.5rem; margin: 1rem 0; border: 1.5px solid rgba(91, 206, 250, 0.2); box-shadow: 0 4px 16px rgba(91, 206, 250, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.1); } .qr-container canvas { border-radius: 12px; box-shadow: 0 4px 16px rgba(91, 206, 250, 0.15); } .qr-description { color: var(--c-text-secondary); font-size: 0.9rem; margin-top: 1rem; line-height: 1.4; } .share-actions { display: flex; flex-direction: column; gap: 1rem; } .share-btn { display: flex; align-items: center; justify-content: center; gap: 0.75rem; padding: 1rem 1.5rem; border-radius: 12px; border: 1.5px solid var(--c-primary); background: var(--c-btn-primary-bg); color: var(--c-primary); font-weight: 600; cursor: pointer; transition: all 0.2s ease, transform 0.1s ease-out; text-decoration: none; font-size: 0.95rem; position: relative; overflow: hidden; } .share-btn:hover { background: var(--c-primary); color: var(--brilliant-white); border-color: var(--c-secondary); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(91, 206, 250, 0.25); } .share-btn:active { transform: translateY(0) scale(0.97); } .share-btn.secondary { border-color: var(--c-secondary); color: var(--c-secondary); background: var(--c-btn-secondary-bg); } .share-btn.secondary:hover { background: var(--c-secondary); color: var(--brilliant-white); border-color: var(--c-primary); } .share-btn.success { background: linear-gradient(90deg, rgba(80,200,120,0.15) 0%, rgba(127,234,210,0.12) 100%); border-color: var(--c-success); color: var(--c-success); } .share-btn svg { width: 20px; height: 20px; flex-shrink: 0; } .flight-code-display { background: linear-gradient(135deg, rgba(91,206,250,0.15), rgba(245,169,184,0.1)); border: 1.5px solid var(--c-primary); border-radius: 12px; padding: 1rem; margin: 1rem 0; text-align: center; } .flight-code-display .code { font-family: "IBM Plex Mono", monospace; font-size: 1.5rem; font-weight: 700; color: var(--c-primary); letter-spacing: 0.2em; margin-bottom: 0.5rem; } .flight-code-display .label { color: var(--c-text-secondary); font-size: 0.85rem; font-weight: 500; } @media (max-width: 480px) { .invite-modal { padding: 1.5rem; margin: 1rem; } .share-actions { gap: 0.8rem; } .share-btn { padding: 0.9rem 1.2rem; font-size: 0.9rem; } } .btn { padding: 0.8em 1.5em; border-radius: 12px; border: 1.5px solid; font-weight: 600; font-size: 0.9em; cursor: pointer; transition: all 0.2s ease, transform 0.1s ease-out; display: inline-flex; align-items: center; justify-content: center; gap: 0.5em; text-decoration: none; box-shadow: 0 1px 4px rgba(91, 206, 250, 0.06); backdrop-filter: blur(6px) saturate(1.2); -webkit-backdrop-filter: blur(6px) saturate(1.2); outline: 1px solid rgba(255,255,255,0.18); } body[data-theme="dark"] .btn { outline: none; } .btn-primary { background: var(--c-btn-primary-bg); color: var(--c-primary); border-color: var(--c-primary); } .btn-primary:hover { background: var(--c-primary); color: var(--brilliant-white); border-color: var(--c-secondary); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(91, 206, 250, 0.25); } .btn-secondary { background: var(--c-btn-secondary-bg); color: var(--c-secondary); border-color: var(--c-secondary); } .btn-secondary:hover { background: var(--c-secondary); color: var(--brilliant-white); border-color: var(--c-primary); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(245, 169, 184, 0.25); } .dashboard-grid { display: grid; grid-template-columns: 1fr; gap: 1.5rem; } @media (min-width: 992px) { .dashboard-grid { grid-template-columns: 2fr 1fr; } .grid-col-span-2 { grid-column: span 2 / span 2; } } .drop-zone { border: 2px dashed var(--c-dropzone-border); text-align: center; padding: 3rem 1rem; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1rem; background-color: var(--c-dropzone-bg); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .drop-zone.drag-over { border-color: var(--c-primary); background: var(--c-dropzone-hover-bg); transform: scale(1.02); box-shadow: 0 8px 32px rgba(91, 206, 250, 0.15), 0 0 0 2px rgba(91, 206, 250, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2); } body[data-theme="dark"] .drop-zone.drag-over { box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(91, 206, 250, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.05); } .drop-zone.drag-over::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient( 90deg, transparent, rgba(91, 206, 250, 0.3), transparent ); animation: shimmer 1.5s infinite; pointer-events: none; } @keyframes shimmer { 0% { left: -100%; } 100% { left: 100%; } } .drop-zone.drag-over .drop-zone__icon { color: var(--c-primary); transform: scale(1.1); filter: drop-shadow(0 4px 8px rgba(91, 206, 250, 0.3)); } .drop-zone.drag-over p { color: var(--c-primary); font-weight: 700; } .drop-zone.drag-over .secondary-text { color: var(--c-secondary); font-weight: 600; } .drop-zone.drag-active { border-color: var(--c-secondary); background: linear-gradient(135deg, rgba(245,169,184,0.15), rgba(91,206,250,0.08)); transform: scale(1.05); } .drop-zone.drag-active .drop-zone__icon { color: var(--c-secondary); animation: bounce 0.6s ease-in-out infinite alternate; } @keyframes bounce { 0% { transform: scale(1.1) translateY(0); } 100% { transform: scale(1.2) translateY(-4px); } } body.dragging * { pointer-events: none; } body.dragging .drop-zone { pointer-events: all; } .drop-zone__icon { color: var(--c-primary); } .drop-zone p { margin: 0; font-weight: 600; } .drop-zone__buttons { display: flex; gap: 1rem; } .panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; } .panel-header h3 { margin: 0; font-size: 1.1rem; color: var(--c-primary);} .panel-header .icon-btn { background: none; border: none; cursor: pointer; color: var(--c-text-secondary); font-size: 1.5rem; padding: 0.2em; } .empty-state { text-align: center; color: var(--c-text-secondary); padding: 1rem 0; font-size: 0.9em; } /* --- STYLES FOR CONNECTION PANEL --- */ #connection-panel-list { display: flex; flex-direction: column; gap: 0.5rem; } .network-user-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem; border-radius: 12px; background: linear-gradient(90deg, rgba(91,206,250,0.05) 0%, rgba(245,169,184,0.04) 100%); transition: background 0.2s ease; } .network-user-item:hover { background: linear-gradient(90deg, rgba(91,206,250,0.1) 0%, rgba(245,169,184,0.08) 100%); } .network-user-details { display: flex; flex-direction: column; } .network-user-name { font-weight: 600; } .network-user-id { font-family: 'IBM Plex Mono', monospace; font-size: 0.8em; color: var(--c-text-secondary); opacity: 0.8; } .invite-user-btn { padding: 0.5em 1em; font-size: 0.85em; } .invite-user-btn:disabled { cursor: not-allowed; opacity: 0.5; background: transparent; border-color: var(--c-text-secondary); color: var(--c-text-secondary); } /* --- NEW: Styles for "In Flight" view --- */ .inflight-user-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem; border-radius: 12px; background: linear-gradient(90deg, rgba(91,206,250,0.05) 0%, rgba(245,169,184,0.04) 100%); } .inflight-user-details { display: flex; align-items: center; gap: 0.75rem; } .inflight-user-name { font-weight: 600; } .user-badge { font-size: 0.75em; font-weight: 700; padding: 0.2em 0.6em; border-radius: 99px; background-color: var(--c-primary); color: var(--brilliant-white); text-transform: uppercase; } .inflight-user-id { font-family: 'IBM Plex Mono', monospace; font-size: 0.8em; color: var(--c-text-secondary); opacity: 0.8; } @keyframes marquee-scroll { from { transform: translateX(0); } to { transform: translateX(calc(-100% + 200px)); } } .queue-item { display: flex; align-items: center; gap: 1rem; padding: 1rem 0.5rem; border-bottom: 1px solid var(--c-panel-border); } .queue-item:last-child { border-bottom: none; } .file-icon { flex-shrink: 0; background: linear-gradient(135deg, rgba(91,206,250,0.10), rgba(245,169,184,0.10)); width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; border-radius: 12px; font-size: 1.5rem; transition: box-shadow 0.2s; box-shadow: 0 1px 4px rgba(91, 206, 250, 0.06); } .file-icon svg { width: 28px; height: 28px; display: block; } .file-icon:hover, .file-icon:focus { box-shadow: 0 2px 8px rgba(91, 206, 250, 0.18); background: linear-gradient(135deg, rgba(91,206,250,0.18), rgba(245,169,184,0.18)); } .file-details { flex-grow: 1; min-width: 0; } .file-details__name { font-weight: 600; margin-bottom: 0.3em; white-space: nowrap; overflow: hidden; -webkit-mask-image: linear-gradient(to right, black 90%, transparent 100%); mask-image: linear-gradient(to right, black 90%, transparent 100%); } body[data-theme="dark"] .file-details__name { -webkit-mask-image: linear-gradient(to right, var(--dark-bg-base) 90%, transparent 100%); mask-image: linear-gradient(to right, var(--dark-bg-base) 90%, transparent 100%); } .file-details__name span { display: inline-block; padding-right: 2rem; } .file-details__name:hover span { animation: marquee-scroll 8s linear infinite alternate; } .file-details__progress-bar { width: 100%; height: 8px; border-radius: 4px; overflow: hidden; background-color: var(--c-progress-track); border: none; accent-color: var(--c-primary); } .file-details__progress-bar::-webkit-progress-bar { background-color: var(--c-progress-track); border-radius: 4px; } .file-details__progress-bar::-webkit-progress-value { background: linear-gradient(90deg, #3ec6a8 0%, #7fead2 100%); border-radius: 4px; } .file-details__progress-bar::-moz-progress-bar { background: linear-gradient(90deg, #3ec6a8 0%, #7fead2 100%); border-radius: 4px; } .file-details__status { font-size: 0.8em; color: var(--c-text-secondary); display: flex; justify-content: space-between; margin-top: 0.3em; } .file-action { flex-shrink: 0; min-width: 170px; text-align: right; } .file-action a { display: block; padding: 0.8em 1.2em; border-radius: 8px; text-decoration: none; font-weight: 600; text-align: center; white-space: nowrap; transition: all 0.2s ease, transform 0.1s ease-out; background: var(--c-btn-primary-bg); color: var(--c-primary); border: 1.5px solid var(--c-primary); box-shadow: 0 1px 4px rgba(91, 206, 250, 0.06); backdrop-filter: blur(6px) saturate(1.2); -webkit-backdrop-filter: blur(6px) saturate(1.2); outline: 1px solid rgba(255,255,255,0.18); } body[data-theme="dark"] .file-action a { outline: none; } .file-action a:hover { background: var(--c-primary); color: var(--brilliant-white); border-color: var(--c-secondary); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(91, 206, 250, 0.25); } .dashboard-footer-grid { display: grid; grid-template-columns: 1fr; gap: 1.5rem; } @media (min-width: 992px) { .dashboard-footer-grid { grid-template-columns: 1fr 1fr; } } .metrics-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 1rem; } .metrics-list li { display: flex; align-items: center; gap: 1rem; } .metrics-list .icon { display: flex; align-items: center; justify-content: center; color: var(--c-primary); width: 28px; height: 28px; min-width: 28px; min-height: 28px; background: linear-gradient(135deg, rgba(91,206,250,0.10), rgba(245,169,184,0.10)); border-radius: 8px; margin-right: 0.5em; transition: color 0.2s, background 0.2s; } .metrics-list li:nth-child(1) .icon { color: var(--c-primary); } .metrics-list li:nth-child(2) .icon { color: var(--c-secondary); } .metrics-list li:nth-child(3) .icon { color: #fbbf24; } .metrics-list .icon svg { width: 20px; height: 20px; display: block; } .metrics-list .icon:hover, .metrics-list .icon:focus { background: linear-gradient(135deg, rgba(91,206,250,0.18), rgba(245,169,184,0.18)); filter: brightness(1.1); } .promo-panel .btn { margin-top: 1rem; } .site-footer { background-color: var(--c-footer-bg); padding: 1.5rem 2rem; border-top: 1px solid var(--c-footer-border); font-size: 0.9em; color: var(--c-text-secondary); margin-top: auto; transition: background 0.3s ease, border-color 0.3s ease; } .footer-content { max-width: 1200px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem; } .footer-copyright { flex-shrink: 0; } .footer-nav { display: flex; gap: 0.5rem; flex-wrap: wrap; } .footer-nav-link { background: none; border: none; font-family: 'IBM Plex Sans', sans-serif; font-weight: 500; font-size: 1em; color: var(--c-text-secondary); cursor: pointer; padding: 0.5em; border-radius: 6px; transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, transform 0.1s ease-out; text-decoration: none; } .footer-nav-link:hover, .footer-nav-link:focus { color: var(--c-primary); background-color: rgba(91, 206, 250, 0.08); outline: none; } @media (max-width: 600px) { .footer-content { flex-direction: column; align-items: center; text-align: center; } } /* --- NEW: Custom Scrollbar for Modals --- */ .invite-modal::-webkit-scrollbar { width: 8px; } .invite-modal::-webkit-scrollbar-track { background: transparent; } .invite-modal::-webkit-scrollbar-thumb { background-color: var(--c-primary); border-radius: 20px; border: 2px solid var(--c-panel-bg); } .invite-modal::-webkit-scrollbar-thumb:hover { background-color: #379fd6; } .invite-modal::-webkit-scrollbar-button { display: none; height: 0; } .invite-modal { scrollbar-width: thin; scrollbar-color: var(--c-primary) transparent; } /* --- Toast Notification Styles --- */ #toast-container { position: fixed; top: 80px; right: 20px; z-index: 9999; display: flex; flex-direction: column; gap: 1rem; } .toast { background: var(--c-panel-bg); color: var(--c-text-primary); padding: 1rem 1.5rem; border-radius: 12px; box-shadow: var(--c-panel-shadow); border: 2px solid var(--c-primary); width: 350px; max-width: 90vw; opacity: 0; transform: translateX(100%); transition: all 0.4s cubic-bezier(0.215, 0.610, 0.355, 1); } .toast.show { opacity: 1; transform: translateX(0); } /* --- NEW: Danger Toast Variant --- */ .toast.toast-danger { border-color: var(--c-danger); } .toast.toast-danger .toast-header strong { color: var(--c-danger); } .toast-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.75rem; } .toast-header strong { color: var(--c-primary); font-weight: 700; } .toast-close { background: none; border: none; font-size: 1.2rem; color: var(--c-text-secondary); cursor: pointer; padding: 0.2rem; } .toast-body { font-size: 0.95em; line-height: 1.5; margin-bottom: 1rem; } .toast-actions { display: flex; gap: 0.5rem; justify-content: flex-end; } .toast-actions .btn { font-size: 0.85em; padding: 0.6em 1.2em; } /* --- MODIFIED: Consistent Tactile Button Feedback on :active --- */ .btn:active, .ticket-actions button:active, .header-nav-link:active, .footer-nav-link:active, .flight-code-input-wrapper button:active, .file-action a:active { transform: translateY(0) scale(0.97); transition-duration: 0.1s; } /* --- APPEND TO END OF styles.css --- */ /* --- NEW: Action buttons for receiver queue --- */ .file-action-group { display: flex; gap: 0.5rem; } .file-action-group .btn { padding: 0.8em 1em; font-size: 0.85em; flex-grow: 1; /* Make buttons take up equal space */ } .file-action a.btn { padding: 0.8em 1em; font-size: 0.9em; } /* --- NEW: VIDEO PLAYER STYLES --- */ #video-player-container { position: relative; /* Changed from fixed */ z-index: 1; /* Sits above the overlay */ background-color: #000; font-family: 'IBM Plex Sans', sans-serif; display: flex; /* Helps center the video element */ align-items: center; justify-content: center; border-radius: 16px; overflow: hidden; /* Important for rounded corners on the video */ box-shadow: 0 20px 60px rgba(0,0,0,0.4); border: 2px solid var(--c-primary); /* Responsive aspect-ratio magic */ max-width: 90vw; max-height: 85vh; aspect-ratio: 16 / 9; /* Default aspect ratio, will be overridden by video */ /* Animation for modal pop-in */ transform: scale(0.95) translateY(20px); transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); } #videoModal.show #video-player-container { transform: scale(1) translateY(0); } #video-element { display: block; /* This makes the video fill the container while respecting its own aspect ratio */ width: 100%; height: 100%; object-fit: contain; } #close-video-btn { position: absolute; top: 1rem; right: 1rem; z-index: 20; background: rgba(24, 24, 27, 0.5); backdrop-filter: blur(4px); border: none; font-size: 1.5rem; color: var(--brilliant-white); cursor: pointer; padding: 0.5rem; border-radius: 50%; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.3s ease, background 0.2s ease, transform 0.2s ease; } #video-player-container.paused #close-video-btn, #video-player-container.controls-visible #close-video-btn { opacity: 1; } #close-video-btn:hover { background: linear-gradient(135deg, rgba(245,169,184,0.15), rgba(91,206,250,0.1)), rgba(24, 24, 27, 0.7); background-blend-mode: overlay; color: var(--c-primary); transform: rotate(90deg); } .video-controls-container { position: absolute; bottom: 0; left: 0; right: 0; color: white; z-index: 10; opacity: 0; transition: opacity 0.3s ease-in-out; background: linear-gradient(to top, rgba(0,0,0,0.75), transparent); padding: 0.5rem; user-select: none; } #video-player-container.paused .video-controls-container, #video-player-container.controls-visible .video-controls-container { opacity: 1; } .controls { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem 0.75rem; } .controls-left, .controls-right { display: flex; align-items: center; gap: 1rem; } .video-controls-container button { background: none; border: none; color: #fff; padding: 0; cursor: pointer; opacity: 0.85; transition: opacity 0.2s, transform 0.2s; } .video-controls-container button:hover { opacity: 1; transform: scale(1.1); } .video-controls-container button svg { width: 22px; height: 22px; display: block; stroke-width: 2.5; } .play-pause-btn .pause-icon { display: block; } .play-pause-btn .play-icon { display: none; } #video-player-container.paused .play-pause-btn .pause-icon { display: none; } #video-player-container.paused .play-pause-btn .play-icon { display: block; } .play-pause-btn .play-icon, .play-pause-btn .pause-icon { fill: currentColor; } .volume-container { display: flex; align-items: center; } .volume-slider { width: 0; transform: scaleX(0); transform-origin: left; transition: width 0.2s ease-in-out, transform 0.2s ease-in-out; cursor: pointer; } .volume-container:hover .volume-slider { width: 80px; transform: scaleX(1); } .volume-btn .low-volume-icon, .volume-btn .muted-icon { display: none; } .volume-btn .high-volume-icon, .volume-btn .low-volume-icon, .volume-btn .muted-icon { width: 24px; height: 24px; } .volume-btn svg { stroke-width: 0; fill: currentColor;} .time-container { font-size: 0.9rem; font-family: 'IBM Plex Mono', monospace; width: 100px; } .timeline-container { padding: 0 0.75rem; cursor: pointer; } .timeline { height: 5px; width: 100%; background-color: rgba(255, 255, 255, 0.3); border-radius: 3px; position: relative; } .timeline-container:hover .timeline { height: 8px; } .timeline .progress-bar { height: 100%; width: 0%; background-color: var(--c-primary); border-radius: 3px; position: relative; transition: width 0.1s linear; } .timeline .progress-bar::after { content: ''; position: absolute; right: -6px; top: 50%; transform: translateY(-50%) scale(0); width: 12px; height: 12px; border-radius: 50%; background-color: var(--brilliant-white); transition: transform 0.2s; } .timeline-container:hover .timeline .progress-bar::after { transform: translateY(-50%) scale(1); } .timeline .buffered-bar { position: absolute; top: 0; left: 0; height: 100%; width: 0%; background-color: rgba(255, 255, 255, 0.5); border-radius: 3px; } .timeline .hover-indicator { position: absolute; top: 0; height: 100%; width: 0; background-color: rgba(255, 255, 255, 0.5); border-radius: 3px; } .settings-menu-container { position: relative; } .settings-menu { position: absolute; bottom: calc(100% + 10px); right: 0; background: rgba(24, 24, 27, 0.9); backdrop-filter: blur(8px); border-radius: 8px; padding: 0.5rem; border: 1px solid rgba(255, 255, 255, 0.1); display: none; width: 150px; } .settings-menu button { width: 100%; text-align: left; padding: 0.5rem 0.75rem; border-radius: 4px; font-size: 0.9rem; color: var(--brilliant-white); } body[data-theme="light"] .settings-menu { background: rgba(255, 255, 255, 0.9); } body[data-theme="light"] .settings-menu button { color: var(--c-text-primary); } .settings-menu button:hover { background-color: var(--c-primary); color: var(--brilliant-white) !important; transform: none; } .settings-menu button.active { background-color: var(--c-secondary); color: var(--brilliant-white) !important; font-weight: 600; } input[type=range].volume-slider { -webkit-appearance: none; appearance: none; background: transparent; } input[type=range].volume-slider::-webkit-slider-runnable-track { height: 5px; background: rgba(255, 255, 255, 0.3); border-radius: 3px; } input[type=range].volume-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; margin-top: -3.5px; background-color: #fff; height: 12px; width: 12px; border-radius: 50%; } input[type=range].volume-slider::-moz-range-track { height: 5px; background: rgba(255, 255, 255, 0.3); border-radius: 3px; } input[type=range].volume-slider::-moz-range-thumb { background-color: #fff; height: 12px; width: 12px; border-radius: 50%; border: none; } .fullscreen-btn .exit-fullscreen-icon { display: none; } #video-player-container.fullscreen .fullscreen-btn .exit-fullscreen-icon { display: block; } #video-player-container.fullscreen .fullscreen-btn .enter-fullscreen-icon { display: none; } .audio-track-btn, .captions-btn { display: flex !important; /* Overcome inline style from demo */ } .audio-track-btn svg, .captions-btn svg { fill: currentColor; stroke-width: 0; } @media (max-width: 600px) { .controls-left, .controls-right { gap: 0.5rem; } .time-container { display: none; } .download-btn { display: none; } } /* --- NEW: reCAPTCHA container styling --- */ #recaptcha-container { display: flex; justify-content: center; margin: 1.5rem 0; }