@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;300;400;500;700&display=swap'); :root { --primary-color: #ffffff; --secondary-color: #a855f7; --background-color: #050505; --glass-bg: rgba(255, 255, 255, 0.03); --glass-border: rgba(255, 255, 255, 0.08); } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: 'Inter', sans-serif; background: var(--background-color); color: white; line-height: 1.5; overflow-x: hidden; min-height: 100vh; } /* Background elements */ canvas#canvas3d { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 0; pointer-events: none; } .atmospheric-grain { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; pointer-events: none; opacity: 0.03; filter: contrast(150%) brightness(150%); background-image: url('https://grainy-gradients.vercel.app/noise.svg'); } .container { position: relative; z-index: 20; width: 100%; margin: 0 auto; padding: 0.5rem 1rem; display: flex; flex-direction: column; min-height: 100vh; box-sizing: border-box; } nav { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem 0; } .nav-logo { font-size: 10px; letter-spacing: 0.4em; font-weight: 700; text-transform: uppercase; } .nav-meta { display: flex; gap: 1.5rem; font-size: 8px; letter-spacing: 0.2em; opacity: 0.5; } /* Typography */ header { margin: 1.5rem 0; text-align: left; } .label-mini { font-size: 9px; letter-spacing: 0.3em; font-weight: 700; text-transform: uppercase; opacity: 0.5; margin-bottom: 0.5rem; } h1 { font-size: clamp(2.5rem, 8vw, 6rem); font-weight: 700; letter-spacing: -0.04em; line-height: 0.9; text-transform: uppercase; } h1 .italic { font-style: italic; font-weight: 300; opacity: 0.4; } /* Components */ .upload-card { background: rgba(255, 255, 255, 0.03); backdrop-filter: blur(15px); border: 1px solid rgba(255, 255, 255, 0.05); padding: clamp(1.5rem, 3vw, 2.5rem); margin: 1rem 0; width: 100%; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); border-radius: 8px; } .form-group { margin-bottom: 1.5rem; } label { display: block; font-size: 10px; letter-spacing: 0.15em; text-transform: uppercase; margin-bottom: 1rem; opacity: 0.8; color: var(--secondary-color); } /* Custom File Input Styling */ input[type="file"] { display: block; width: 100%; padding: 0.8rem; background: rgba(255, 255, 255, 0.02); border: 1px solid rgba(255, 255, 255, 0.1); color: rgba(255, 255, 255, 0.6); font-size: 12px; cursor: pointer; transition: all 0.3s; } input[type="file"]::file-selector-button { background: rgba(168, 85, 247, 0.15); border: 1px solid var(--secondary-color); color: var(--secondary-color); padding: 0.5rem 1rem; margin-right: 1rem; text-transform: uppercase; font-size: 9px; font-weight: 700; letter-spacing: 0.1em; cursor: pointer; transition: 0.3s; } input[type="file"]:hover::file-selector-button { background: var(--secondary-color); color: white; } .btn-launch { display: inline-block; padding: 1.2rem 3rem; background: white; color: black; text-transform: uppercase; font-size: 11px; font-weight: 700; letter-spacing: 0.2em; border: none; cursor: pointer; transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1); } .btn-launch:hover { background: var(--secondary-color); color: white; letter-spacing: 0.3em; } /* Metrics Dashboard */ .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; margin: 1.5rem 0; } .metric-item { background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.1); padding: 1.2rem; transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1); box-shadow: 0 4px 24px -1px rgba(0, 0, 0, 0.2); overflow: hidden; display: flex; flex-direction: column; } .metric-item:hover { transform: translateY(-8px); background: rgba(255, 255, 255, 0.08); border-color: var(--secondary-color); } .metric-value { font-size: clamp(1.8rem, 4vw, 2.8rem); font-weight: 900; letter-spacing: -0.05em; display: block; color: white; margin-bottom: 0.2rem; line-height: 1; } .metric-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.2em; opacity: 0.8; font-weight: 800; margin-bottom: 0.2rem; display: block; } .metric-note { font-size: 11px; opacity: 0.4; line-height: 1.4; margin-top: 0.5rem; text-transform: none; letter-spacing: 0.02em; } .summary-metrics { display: flex; gap: 2rem; margin-top: 2rem; flex-wrap: wrap; } .summary-card { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.1); padding: 1.5rem; flex: 1; min-width: 150px; text-align: center; } .summary-card .val { font-size: 2rem; font-weight: 900; display: block; color: var(--secondary-color); } .summary-card .lbl { font-size: 10px; text-transform: uppercase; letter-spacing: 0.2em; opacity: 0.6; } /* Table */ .table-wrapper { width: 100%; overflow-x: auto; overflow-y: auto; max-height: 420px; background: rgba(255, 255, 255, 0.03); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 4px; scrollbar-width: thin; scrollbar-color: var(--secondary-color) transparent; position: relative; } /* Smart indicating effect: show more contrast on inner content */ .table-wrapper table { position: relative; z-index: 1; } .table-wrapper::-webkit-scrollbar { width: 4px; height: 4px; } .table-wrapper::-webkit-scrollbar-thumb { background: var(--secondary-color); border-radius: 10px; box-shadow: 0 0 10px var(--secondary-color); } table { width: 100%; border-collapse: collapse; min-width: 800px; } th { text-align: left; padding: 1rem; font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; opacity: 0.5; border-bottom: 1px solid var(--glass-border); } td { padding: 1rem; font-size: 13px; border-bottom: 1px solid rgba(255, 255, 255, 0.05); } .badge-oob { font-size: 8px; padding: 0.15rem 0.4rem; border: 1px solid var(--secondary-color); color: var(--secondary-color); text-transform: uppercase; font-weight: 700; } /* Loader Overlay */ #loader-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.98); z-index: 10000; display: none; flex-direction: column; align-items: center; justify-content: center; } .loader-container { position: relative; width: 300px; text-align: center; } .loader-line { width: 100%; height: 2px; background: rgba(255, 255, 255, 0.05); margin-bottom: 2rem; position: relative; overflow: hidden; } .loader-progress { height: 100%; width: 0%; background: var(--secondary-color); box-shadow: 0 0 20px var(--secondary-color); transition: width 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); } /* Scanning effect */ .loader-line::after { content: ''; position: absolute; top: 0; left: -100%; width: 50%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); animation: scan 1.5s infinite; } @keyframes scan { from { left: -100%; } to { left: 200%; } } .loader-text { font-size: 11px; letter-spacing: 0.4em; text-transform: uppercase; color: white; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 0.4; transform: scale(0.98); } 50% { opacity: 1; transform: scale(1); } } /* Confusion Matrix */ .cm-container { margin-top: 3rem; overflow-x: auto; } .cm-table { border-collapse: collapse; font-size: 11px; } .cm-table th, .cm-table td { padding: 0.4rem; border: 1px solid rgba(255, 255, 255, 0.05); text-align: center; min-width: 35px; font-size: 10px; } .cm-label-row th { background: rgba(255, 255, 255, 0.03); color: var(--secondary-color); } .cm-value { font-weight: 700; transition: background 0.3s; } .cm-match { background: rgba(168, 85, 247, 0.2); color: white; } .cm-dimmed { opacity: 0.2; } .significance-tag { font-size: 9px; padding: 2px 6px; background: rgba(255, 255, 255, 0.1); border-radius: 3px; margin-left: 8px; vertical-align: middle; letter-spacing: 0; opacity: 0.8; } .tooltip-v { position: relative; cursor: help; } .tooltip-v::after { content: attr(data-tip); position: absolute; bottom: 120%; left: 50%; transform: translateX(-50%); padding: 8px 12px; background: #111; border: 1px solid var(--secondary-color); color: white; font-size: 10px; white-space: nowrap; opacity: 0; pointer-events: none; transition: 0.3s; z-index: 100; letter-spacing: 0.05em; text-transform: none; } .tooltip-v:hover::after { opacity: 1; bottom: 140%; } /* Responsivity fixes */ @media (max-width: 768px) { .container { padding: 1rem; } header { margin: 2rem 0; } .upload-card { padding: 1.5rem; } } .animate-up { animation: slideUp 0.8s cubic-bezier(0.23, 1, 0.32, 1) forwards; } @keyframes slideUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .img-thumb { width: 44px; height: 44px; object-fit: cover; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 4px; cursor: pointer; transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); } .img-thumb:hover { transform: scale(1.1) rotate(2deg); border-color: var(--secondary-color); box-shadow: 0 0 15px rgba(168, 85, 247, 0.3); } #image-modal { display: none; position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.95); z-index: 9999; justify-content: center; align-items: center; backdrop-filter: blur(15px); } #image-modal.active { display: flex; animation: fadeIn 0.3s ease; } #modal-img { max-width: 90%; max-height: 85%; border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 0 40px rgba(0, 0, 0, 0.5); } .modal-close { position: absolute; top: 2rem; right: 2rem; color: white; font-size: 24px; cursor: pointer; opacity: 0.5; transition: opacity 0.3s; } .modal-close:hover { opacity: 1; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Ultra-Dense Dashboard Grid */ .dashboard-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; margin: 0.5rem 0; } @media (min-width: 1100px) { .dashboard-grid { grid-template-columns: 1fr 1fr; gap: 1.5rem; } } .dashboard-main { display: flex; flex-direction: column; gap: 1rem; } .dashboard-sidebar { display: flex; flex-direction: column; gap: 1rem; height: 100%; } /* Compact KPI Row */ .kpi-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.8rem; } .kpi-card { background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); padding: 1rem 1.2rem; text-align: center; transition: all 0.3s; } .kpi-card:hover { background: rgba(255, 255, 255, 0.08); border-color: var(--secondary-color); } .kpi-value { display: block; font-size: 1.8rem; font-weight: 900; color: white; line-height: 1; margin-bottom: 0.3rem; } .kpi-label { display: block; font-size: 9px; letter-spacing: 0.15em; text-transform: uppercase; opacity: 0.7; font-weight: 700; } /* Section Labels */ .section-label { font-size: 8px; letter-spacing: 0.2em; text-transform: uppercase; opacity: 0.5; font-weight: 700; margin-bottom: 0.5rem; } /* Compact Table Section */ .compact-table-section { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.05); padding: 1rem; } .compact-table-wrapper { max-height: 280px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--secondary-color) transparent; } .compact-table-wrapper::-webkit-scrollbar { width: 3px; } .compact-table-wrapper::-webkit-scrollbar-thumb { background: var(--secondary-color); border-radius: 10px; } .compact-table { width: 100%; border-collapse: collapse; font-size: 11px; } .compact-table th { text-align: left; padding: 0.4rem; font-size: 8px; letter-spacing: 0.1em; text-transform: uppercase; opacity: 0.5; border-bottom: 1px solid rgba(255, 255, 255, 0.05); position: sticky; top: 0; background: rgba(5, 5, 5, 0.95); } .compact-table td { padding: 0.4rem; border-bottom: 1px solid rgba(255, 255, 255, 0.03); } .compact-table .grade-col { font-weight: 700; color: var(--secondary-color); } .compact-table .sup-col { opacity: 0.4; } /* Compact Confusion Matrix */ .cm-compact { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.05); padding: 1rem; display: flex; flex-direction: column; height: 100%; } .cm-compact-table { width: 100%; border-collapse: collapse; font-size: 8px; table-layout: auto; } .cm-compact-table th, .cm-compact-table td { padding: 0.3rem 0.35rem; text-align: center; border: 1px solid rgba(255, 255, 255, 0.05); font-size: 8px; } .cm-compact-table th { font-size: 7px; letter-spacing: 0.03em; background: rgba(255, 255, 255, 0.02); color: var(--secondary-color); font-weight: 600; } .cm-corner { width: 30px; } .cm-row-label { background: rgba(255, 255, 255, 0.02); font-weight: 700; color: var(--secondary-color); } .cm-cell { font-weight: 600; } .cm-diag { background: rgba(168, 85, 247, 0.15); color: white; } .cm-zero { opacity: 0.2; } /* Summary Mini Cards */ .summary-mini { display: grid; grid-template-columns: 1fr 1fr; gap: 0.6rem; } .summary-mini-card { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.08); padding: 0.6rem; text-align: center; } .summary-mini-label { display: block; font-size: 7px; letter-spacing: 0.1em; text-transform: uppercase; opacity: 0.6; margin-bottom: 0.2rem; } .summary-mini-value { display: block; font-size: 1.2rem; font-weight: 900; color: var(--secondary-color); } /* Manifest Section (Collapsible) */ .manifest-section { margin-top: 1rem; background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.05); padding: 0.8rem; } .manifest-header { display: flex; justify-content: space-between; align-items: center; cursor: pointer; user-select: none; } .toggle-icon { font-size: 10px; opacity: 0.5; transition: transform 0.3s; } .manifest-content { transition: all 0.3s; } .stone-id-col { font-weight: 700; color: white; font-size: 11px; } .result-col { font-weight: 700; color: var(--secondary-color); font-size: 11px; } /* Sticky header row in manifest table */ .manifest-content table thead th { position: sticky; top: 0; background: rgba(5, 5, 5, 0.98); z-index: 10; border-bottom: 2px solid rgba(168, 85, 247, 0.3); } .flush-section { margin-top: 2rem; padding-top: 1.5rem; border-top: 1px solid rgba(255, 255, 255, 0.05); } .btn-flush-data { padding: 0.8rem 2rem; background: transparent; color: #ef4444; /* Red color for danger */ border: 1px solid #ef4444; text-transform: uppercase; font-size: 10px; font-weight: 700; letter-spacing: 0.1em; cursor: pointer; transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); } .btn-flush-data:hover { background: #ef4444; color: white; } .flush-hint { font-size: 9px; opacity: 0.4; margin-top: 0.8rem; letter-spacing: 0.05em; } /* Flash Messages */ .flash-container { position: fixed; top: 2rem; left: 50%; transform: translateX(-50%); z-index: 11000; width: auto; max-width: 90%; } .flash-message { background: var(--secondary-color); color: white; padding: 1rem 2rem; border-radius: 4px; font-size: 12px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.1em; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); margin-bottom: 0.5rem; transition: opacity 0.5s ease; animation: slideDownFlash 0.5s cubic-bezier(0.23, 1, 0.32, 1); } @keyframes slideDownFlash { from { transform: translateY(-20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }