Spaces:
Running
Running
Satyam S
QR self-enrollment, multi-photo attendance, reject-and-rematch reinforcement, and enrollment reliability fixes
4f0aa08 | :root { | |
| color-scheme: light; | |
| --bg: #f6f0e8; | |
| --bg-accent: #e8f1ff; | |
| --panel: rgba(255, 255, 255, 0.82); | |
| --text: #1f232b; | |
| --muted: #5d6675; | |
| --border: rgba(31, 35, 43, 0.12); | |
| --accent: #0d6efd; | |
| --accent-strong: #0b5ed7; | |
| --shadow: 0 22px 60px rgba(31, 35, 43, 0.12); | |
| } | |
| * { | |
| box-sizing: border-box; | |
| } | |
| body { | |
| margin: 0; | |
| min-height: 100vh; | |
| font-family: "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif; | |
| color: var(--text); | |
| background: | |
| radial-gradient(circle at top left, rgba(13, 110, 253, 0.18), transparent 32%), | |
| radial-gradient(circle at top right, rgba(16, 124, 65, 0.14), transparent 28%), | |
| linear-gradient(135deg, var(--bg), var(--bg-accent)); | |
| } | |
| .shell { | |
| width: min(1100px, calc(100% - 32px)); | |
| margin: 0 auto; | |
| padding: 40px 0 56px; | |
| } | |
| .shell-narrow { | |
| width: min(640px, calc(100% - 32px)); | |
| } | |
| .hero { | |
| max-width: 720px; | |
| margin-bottom: 24px; | |
| } | |
| .eyebrow { | |
| margin: 0 0 8px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.18em; | |
| font-size: 0.78rem; | |
| color: var(--accent-strong); | |
| font-weight: 700; | |
| } | |
| h1 { | |
| margin: 0; | |
| font-size: clamp(2.4rem, 5vw, 4.6rem); | |
| line-height: 0.96; | |
| letter-spacing: -0.04em; | |
| } | |
| .lede { | |
| max-width: 60ch; | |
| font-size: 1.05rem; | |
| line-height: 1.6; | |
| color: var(--muted); | |
| margin: 16px 0 0; | |
| } | |
| .panel { | |
| background: var(--panel); | |
| border: 1px solid var(--border); | |
| border-radius: 28px; | |
| padding: 24px; | |
| box-shadow: var(--shadow); | |
| backdrop-filter: blur(12px); | |
| } | |
| .tabs-shell { | |
| display: grid; | |
| gap: 16px; | |
| } | |
| .tabs-bar { | |
| display: inline-flex; | |
| gap: 10px; | |
| padding: 8px; | |
| border: 1px solid var(--border); | |
| border-radius: 999px; | |
| background: rgba(255, 255, 255, 0.72); | |
| box-shadow: var(--shadow); | |
| width: fit-content; | |
| } | |
| .tab-button { | |
| border: 0; | |
| border-radius: 999px; | |
| padding: 12px 18px; | |
| background: transparent; | |
| color: var(--muted); | |
| font-weight: 700; | |
| box-shadow: none; | |
| } | |
| .tab-button.active { | |
| background: linear-gradient(135deg, var(--accent), var(--accent-strong)); | |
| color: white; | |
| } | |
| .tab-panel.hidden { | |
| display: none; | |
| } | |
| .attendance-grid { | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 18px; | |
| align-items: start; | |
| } | |
| .attendance-card { | |
| display: grid; | |
| gap: 14px; | |
| padding: 18px; | |
| border-radius: 22px; | |
| border: 1px solid var(--border); | |
| align-content: start; | |
| background: rgba(255, 255, 255, 0.72); | |
| } | |
| .attendance-card-wide { | |
| grid-column: 1 / -1; | |
| } | |
| .attendance-card-header h2 { | |
| margin: 0; | |
| font-size: 1.35rem; | |
| } | |
| .attendance-card-header p { | |
| margin: 6px 0 0; | |
| color: var(--muted); | |
| line-height: 1.5; | |
| } | |
| .stack-form { | |
| display: grid; | |
| gap: 14px; | |
| } | |
| .field-label { | |
| display: grid; | |
| gap: 8px; | |
| font-weight: 700; | |
| color: var(--text); | |
| } | |
| .field-label input, | |
| .field-label select { | |
| width: 100%; | |
| border: 1px solid rgba(31, 35, 43, 0.16); | |
| border-radius: 16px; | |
| padding: 14px 16px; | |
| font: inherit; | |
| background: rgba(255, 255, 255, 0.88); | |
| color: var(--text); | |
| } | |
| .classroom-picker { | |
| display: flex; | |
| align-items: baseline; | |
| gap: 14px; | |
| flex-wrap: wrap; | |
| margin-bottom: 18px; | |
| padding: 14px 18px; | |
| border-radius: 18px; | |
| border: 1px solid var(--border); | |
| background: rgba(255, 255, 255, 0.72); | |
| } | |
| .classroom-picker .field-label { | |
| flex-direction: row; | |
| align-items: center; | |
| gap: 10px; | |
| } | |
| .classroom-picker select { | |
| width: auto; | |
| min-width: 160px; | |
| padding: 8px 12px; | |
| } | |
| .classroom-picker-hint { | |
| margin: 0; | |
| font-size: 0.82rem; | |
| color: var(--muted); | |
| } | |
| .enroll-qr-toggle { | |
| margin-left: auto; | |
| padding: 8px 16px; | |
| border-radius: 12px; | |
| border: 1.5px dashed rgba(37, 99, 235, 0.5); | |
| background: rgba(37, 99, 235, 0.08); | |
| color: #1d4ed8; | |
| font-weight: 700; | |
| font-size: 0.85rem; | |
| cursor: pointer; | |
| box-shadow: none; | |
| } | |
| .enroll-qr-toggle:hover { background: rgba(37, 99, 235, 0.15); } | |
| .enroll-qr-panel { | |
| margin-bottom: 18px; | |
| padding: 18px; | |
| border-radius: 18px; | |
| border: 1px solid var(--border); | |
| background: rgba(255, 255, 255, 0.72); | |
| text-align: center; | |
| } | |
| .enroll-qr-image { | |
| width: 220px; | |
| height: 220px; | |
| image-rendering: pixelated; | |
| border-radius: 12px; | |
| background: #fff; | |
| padding: 10px; | |
| box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); | |
| } | |
| .enroll-qr-link { | |
| margin: 12px 0 4px; | |
| font-family: monospace; | |
| font-size: 0.85rem; | |
| word-break: break-all; | |
| } | |
| .roster-classroom-label { | |
| font-size: 0.8rem; | |
| font-weight: 700; | |
| color: var(--accent-strong); | |
| background: rgba(11, 94, 215, 0.1); | |
| padding: 3px 10px; | |
| border-radius: 999px; | |
| vertical-align: middle; | |
| margin-left: 6px; | |
| } | |
| .file-drop-compact { | |
| min-height: 74px; | |
| } | |
| .attendance-result, | |
| .result-list, | |
| .roster-list { | |
| display: grid; | |
| gap: 10px; | |
| } | |
| .how-it-works-list { | |
| display: grid; | |
| gap: 12px; | |
| margin: 0; | |
| padding-left: 22px; | |
| color: var(--text); | |
| line-height: 1.6; | |
| } | |
| .how-it-works-list li::marker { | |
| color: var(--accent-strong); | |
| font-weight: 700; | |
| } | |
| .how-it-works-list code { | |
| background: rgba(31, 35, 43, 0.08); | |
| border-radius: 6px; | |
| padding: 1px 6px; | |
| font-size: 0.9em; | |
| } | |
| .how-it-works-note { | |
| margin: 18px 0 0; | |
| padding: 14px 16px; | |
| border-radius: 16px; | |
| background: rgba(31, 35, 43, 0.05); | |
| color: var(--muted); | |
| line-height: 1.6; | |
| } | |
| .result-summary { | |
| font-weight: 800; | |
| } | |
| .attendance-buckets { | |
| display: grid; | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| gap: 14px; | |
| } | |
| .attendance-bucket { | |
| display: grid; | |
| gap: 8px; | |
| align-content: start; | |
| } | |
| .result-item.present-item { | |
| border-color: rgba(34, 197, 94, 0.3); | |
| background: rgba(34, 197, 94, 0.08); | |
| } | |
| .result-item.suspicious-item { | |
| border-color: rgba(245, 158, 11, 0.35); | |
| background: rgba(245, 158, 11, 0.1); | |
| } | |
| .result-item.absent-item { | |
| border-color: rgba(120, 120, 120, 0.25); | |
| background: rgba(120, 120, 120, 0.06); | |
| } | |
| .present-item-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| flex-wrap: wrap; | |
| } | |
| .show-face-btn { | |
| margin-left: auto; | |
| padding: 4px 10px; | |
| border-radius: 10px; | |
| font-size: 0.74rem; | |
| font-weight: 700; | |
| cursor: pointer; | |
| border: 1.5px solid rgba(34, 197, 94, 0.4); | |
| background: rgba(34, 197, 94, 0.1); | |
| color: #15803d; | |
| box-shadow: none; | |
| } | |
| .show-face-btn:hover { background: rgba(34, 197, 94, 0.18); } | |
| .face-reveal { margin-top: 8px; } | |
| .face-reveal img { | |
| width: 96px; | |
| height: 96px; | |
| object-fit: cover; | |
| border-radius: 12px; | |
| display: block; | |
| } | |
| .suspicious-actions { | |
| display: flex; | |
| gap: 6px; | |
| margin-top: 6px; | |
| } | |
| .suspicious-btn { | |
| flex: 1; | |
| padding: 6px 10px; | |
| border-radius: 10px; | |
| font-size: 0.78rem; | |
| font-weight: 700; | |
| cursor: pointer; | |
| box-shadow: none; | |
| } | |
| .suspicious-btn:disabled { opacity: 0.5; cursor: not-allowed; } | |
| .suspicious-confirm-btn { | |
| border: 1.5px solid rgba(34, 197, 94, 0.5); | |
| background: rgba(34, 197, 94, 0.12); | |
| color: #15803d; | |
| } | |
| .suspicious-confirm-btn:hover { background: rgba(34, 197, 94, 0.2); } | |
| .suspicious-reject-btn { | |
| border: 1.5px solid rgba(220, 53, 69, 0.4); | |
| background: rgba(220, 53, 69, 0.1); | |
| color: #b42318; | |
| } | |
| .suspicious-reject-btn:hover { background: rgba(220, 53, 69, 0.18); } | |
| .result-detail, | |
| .result-item, | |
| .roster-item { | |
| padding: 12px 14px; | |
| border-radius: 16px; | |
| border: 1px solid rgba(31, 35, 43, 0.08); | |
| background: rgba(255, 255, 255, 0.84); | |
| } | |
| .result-item, | |
| .roster-item { | |
| display: grid; | |
| gap: 4px; | |
| } | |
| .roster-item { | |
| grid-template-columns: minmax(0, 1fr) auto; | |
| align-items: center; | |
| gap: 12px; | |
| } | |
| .roster-item-main { | |
| display: grid; | |
| gap: 4px; | |
| } | |
| .delete-student-button { | |
| padding: 10px 14px; | |
| border-radius: 14px; | |
| background: rgba(220, 53, 69, 0.12); | |
| color: #b42318; | |
| box-shadow: none; | |
| } | |
| .delete-student-button:hover { | |
| background: rgba(220, 53, 69, 0.18); | |
| } | |
| .result-item span, | |
| .roster-item span, | |
| .muted { | |
| color: var(--muted); | |
| } | |
| .demo-btn-row { | |
| display: flex; | |
| gap: 8px; | |
| margin-top: 8px; | |
| } | |
| .demo-btn { | |
| flex: 1; | |
| background: transparent; | |
| border: 1.5px dashed #6366f1; | |
| color: #6366f1; | |
| border-radius: 8px; | |
| padding: 8px 16px; | |
| cursor: pointer; | |
| font-size: 0.9rem; | |
| } | |
| .demo-btn:hover { background: rgba(99,102,241,0.07); } | |
| .demo-btn:disabled { opacity: 0.5; cursor: not-allowed; } | |
| .camera-recorder { | |
| display: grid; | |
| gap: 10px; | |
| padding: 14px; | |
| border-radius: 16px; | |
| border: 1px solid var(--border); | |
| background: rgba(255, 255, 255, 0.6); | |
| } | |
| .camera-video-wrap { | |
| position: relative; | |
| border-radius: 12px; | |
| overflow: hidden; | |
| background: #111; | |
| } | |
| .camera-preview { | |
| width: 100%; | |
| max-height: 320px; | |
| display: block; | |
| background: #111; | |
| object-fit: contain; | |
| } | |
| .camera-face-guide { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| width: 44%; | |
| height: 70%; | |
| border: 3px dashed rgba(255, 255, 255, 0.75); | |
| border-radius: 50% / 42%; | |
| pointer-events: none; | |
| box-shadow: 0 0 0 2000px rgba(0, 0, 0, 0.28); | |
| } | |
| .camera-instruction { | |
| position: absolute; | |
| left: 50%; | |
| bottom: 14px; | |
| transform: translateX(-50%); | |
| max-width: 90%; | |
| padding: 8px 16px; | |
| border-radius: 999px; | |
| background: rgba(17, 17, 17, 0.78); | |
| color: #fff; | |
| font-size: 0.88rem; | |
| font-weight: 600; | |
| text-align: center; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .camera-hint { | |
| margin: 0; | |
| font-size: 0.8rem; | |
| color: var(--muted); | |
| } | |
| .camera-controls { | |
| display: flex; | |
| gap: 8px; | |
| flex-wrap: wrap; | |
| } | |
| .camera-btn { | |
| flex: 1; | |
| min-width: 120px; | |
| background: transparent; | |
| border: 1.5px solid #6366f1; | |
| color: #6366f1; | |
| border-radius: 8px; | |
| padding: 8px 14px; | |
| cursor: pointer; | |
| font-size: 0.88rem; | |
| font-weight: 600; | |
| } | |
| .camera-btn:hover { background: rgba(99,102,241,0.07); } | |
| .camera-btn:disabled { opacity: 0.4; cursor: not-allowed; } | |
| .camera-status { | |
| font-size: 0.82rem; | |
| color: var(--muted); | |
| } | |
| .unknown-faces-toggle { | |
| width: 100%; | |
| background: rgba(220, 53, 69, 0.08); | |
| border: 1.5px dashed #dc3545; | |
| color: #b42318; | |
| border-radius: 14px; | |
| padding: 10px 16px; | |
| cursor: pointer; | |
| font-size: 0.88rem; | |
| font-weight: 700; | |
| } | |
| .unknown-faces-toggle:hover { background: rgba(220, 53, 69, 0.14); } | |
| .unknown-faces-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); | |
| gap: 12px; | |
| } | |
| .unknown-face-card { | |
| margin: 0; | |
| display: grid; | |
| gap: 6px; | |
| background: rgba(255, 255, 255, 0.84); | |
| border: 1px solid rgba(220, 53, 69, 0.25); | |
| border-radius: 14px; | |
| padding: 8px; | |
| } | |
| .unknown-face-card img { | |
| width: 100%; | |
| aspect-ratio: 1 / 1; | |
| object-fit: cover; | |
| border-radius: 10px; | |
| display: block; | |
| } | |
| .assign-face-select { | |
| width: 100%; | |
| padding: 5px 6px; | |
| border-radius: 8px; | |
| border: 1px solid var(--border); | |
| font-size: 0.72rem; | |
| background: rgba(255, 255, 255, 0.9); | |
| } | |
| .assign-face-select:disabled { opacity: 0.5; } | |
| .unknown-face-card figcaption { | |
| font-size: 0.72rem; | |
| color: var(--muted); | |
| text-align: center; | |
| } | |
| .marked-photo-gallery { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); | |
| gap: 12px; | |
| margin-bottom: 14px; | |
| } | |
| .marked-photo-gallery:has(.marked-photo-preview:only-child) { | |
| grid-template-columns: 1fr; | |
| } | |
| .marked-photo-preview { | |
| width: 100%; | |
| max-height: 420px; | |
| object-fit: contain; | |
| border-radius: 18px; | |
| border: 1px solid rgba(31, 35, 43, 0.1); | |
| background: #000; | |
| cursor: zoom-in; | |
| } | |
| .lightbox { | |
| position: fixed; | |
| inset: 0; | |
| z-index: 9999; | |
| background: rgba(0, 0, 0, 0.92); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .lightbox.hidden { display: none; } | |
| .lightbox-img { | |
| max-width: 95vw; | |
| max-height: 95vh; | |
| object-fit: contain; | |
| border-radius: 6px; | |
| box-shadow: 0 8px 40px rgba(0,0,0,0.6); | |
| } | |
| .lightbox-close { | |
| position: fixed; | |
| top: 18px; | |
| right: 24px; | |
| background: none; | |
| border: none; | |
| color: #fff; | |
| font-size: 2.2rem; | |
| line-height: 1; | |
| cursor: pointer; | |
| opacity: 0.8; | |
| z-index: 10000; | |
| } | |
| .lightbox-close:hover { opacity: 1; } | |
| .upload-form { | |
| display: grid; | |
| grid-template-columns: minmax(0, 1fr) auto; | |
| gap: 14px; | |
| align-items: center; | |
| } | |
| .file-drop { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| min-height: 84px; | |
| padding: 18px 20px; | |
| border: 1.5px dashed rgba(31, 35, 43, 0.2); | |
| border-radius: 20px; | |
| background: rgba(255, 255, 255, 0.72); | |
| color: var(--muted); | |
| font-weight: 600; | |
| cursor: pointer; | |
| } | |
| .file-drop input { | |
| display: none; | |
| } | |
| button { | |
| border: 0; | |
| border-radius: 16px; | |
| padding: 16px 22px; | |
| font: inherit; | |
| font-weight: 700; | |
| color: white; | |
| background: linear-gradient(135deg, var(--accent), var(--accent-strong)); | |
| cursor: pointer; | |
| box-shadow: 0 10px 24px rgba(13, 110, 253, 0.24); | |
| } | |
| button:disabled { | |
| opacity: 0.7; | |
| cursor: wait; | |
| } | |
| .status { | |
| margin-top: 16px; | |
| color: var(--muted); | |
| font-weight: 600; | |
| } | |
| .results { | |
| margin-top: 22px; | |
| display: grid; | |
| gap: 18px; | |
| } | |
| .metrics { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); | |
| gap: 12px; | |
| } | |
| .metric { | |
| padding: 16px; | |
| border-radius: 18px; | |
| background: rgba(255, 255, 255, 0.78); | |
| border: 1px solid var(--border); | |
| } | |
| .metric .label { | |
| display: block; | |
| font-size: 0.82rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--muted); | |
| margin-bottom: 8px; | |
| } | |
| .metric .value { | |
| font-size: 1.2rem; | |
| font-weight: 800; | |
| } | |
| .downloads { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 12px; | |
| } | |
| .downloads a { | |
| color: var(--accent-strong); | |
| text-decoration: none; | |
| font-weight: 700; | |
| padding: 10px 14px; | |
| border-radius: 999px; | |
| background: rgba(13, 110, 253, 0.08); | |
| } | |
| .table-wrap { | |
| overflow-x: auto; | |
| border: 1px solid var(--border); | |
| border-radius: 20px; | |
| background: rgba(255, 255, 255, 0.72); | |
| } | |
| .student-groups { | |
| display: grid; | |
| gap: 16px; | |
| } | |
| .clip-gallery { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); | |
| gap: 14px; | |
| padding: 16px 16px 0; | |
| } | |
| .clip-card { | |
| overflow: hidden; | |
| border-radius: 18px; | |
| border: 1px solid rgba(31, 35, 43, 0.1); | |
| background: rgba(255, 255, 255, 0.88); | |
| } | |
| .clip-player { | |
| display: block; | |
| width: 100%; | |
| aspect-ratio: 16 / 9; | |
| background: #000; | |
| } | |
| .clip-card-body { | |
| padding: 12px 14px 14px; | |
| } | |
| .clip-badges { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| margin-bottom: 10px; | |
| } | |
| .clip-badge { | |
| display: inline-flex; | |
| align-items: center; | |
| padding: 5px 10px; | |
| border-radius: 999px; | |
| background: rgba(13, 110, 253, 0.08); | |
| color: var(--accent-strong); | |
| font-size: 0.76rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| } | |
| .clip-badge-phone { | |
| background: rgba(220, 53, 69, 0.1); | |
| color: #b42318; | |
| } | |
| .clip-badge-cnn { | |
| background: rgba(16, 124, 65, 0.1); | |
| color: var(--success); | |
| } | |
| .clip-summary, | |
| .clip-detail { | |
| margin: 0; | |
| line-height: 1.45; | |
| } | |
| .clip-summary { | |
| font-weight: 800; | |
| } | |
| .clip-detail { | |
| margin-top: 4px; | |
| color: var(--muted); | |
| font-size: 0.92rem; | |
| } | |
| .clip-link { | |
| display: inline-flex; | |
| margin-top: 12px; | |
| font-weight: 700; | |
| color: var(--accent-strong); | |
| text-decoration: none; | |
| } | |
| .student-card { | |
| border: 1px solid var(--border); | |
| border-radius: 22px; | |
| background: rgba(255, 255, 255, 0.72); | |
| overflow: hidden; | |
| } | |
| .student-card-header { | |
| padding: 16px 18px 10px; | |
| border-bottom: 1px solid rgba(31, 35, 43, 0.08); | |
| } | |
| .student-title { | |
| margin: 0; | |
| font-size: 1.1rem; | |
| font-weight: 800; | |
| } | |
| .student-meta { | |
| margin: 6px 0 0; | |
| color: var(--muted); | |
| font-size: 0.92rem; | |
| } | |
| .empty-state { | |
| padding: 18px 20px; | |
| border-radius: 18px; | |
| border: 1px dashed var(--border); | |
| color: var(--muted); | |
| background: rgba(255, 255, 255, 0.7); | |
| } | |
| table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| } | |
| th, | |
| td { | |
| padding: 14px 16px; | |
| text-align: left; | |
| vertical-align: top; | |
| border-bottom: 1px solid rgba(31, 35, 43, 0.08); | |
| } | |
| th { | |
| font-size: 0.84rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| color: var(--muted); | |
| } | |
| tbody tr:hover { | |
| background: rgba(13, 110, 253, 0.04); | |
| } | |
| .hidden { | |
| display: none; | |
| } | |
| .error { | |
| color: #b42318; | |
| } | |
| @media (max-width: 720px) { | |
| .shell { | |
| width: min(100% - 20px, 1100px); | |
| padding-top: 18px; | |
| } | |
| .panel { | |
| padding: 18px; | |
| border-radius: 22px; | |
| } | |
| .upload-form { | |
| grid-template-columns: 1fr; | |
| } | |
| .attendance-buckets { | |
| grid-template-columns: 1fr; | |
| } | |
| button { | |
| width: 100%; | |
| } | |
| .tabs-bar { | |
| width: 100%; | |
| flex-direction: column; | |
| border-radius: 24px; | |
| } | |
| .tab-button { | |
| width: 100%; | |
| } | |
| .attendance-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| .cognitive-charts-row { | |
| grid-template-columns: 1fr; | |
| } | |
| } | |
| /* ── Cognitive tab ─────────────────────────────────────────────────────────── */ | |
| .cognitive-charts-row { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 24px; | |
| margin: 24px 0; | |
| } | |
| .cognitive-chart-wrap { | |
| background: var(--panel); | |
| border: 1px solid var(--border); | |
| border-radius: 16px; | |
| padding: 20px; | |
| } | |
| .chart-title { | |
| font-size: 0.9rem; | |
| font-weight: 600; | |
| color: var(--muted); | |
| margin: 0 0 14px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.04em; | |
| } | |
| .cognitive-table-wrap { | |
| overflow-x: auto; | |
| margin-top: 24px; | |
| } | |
| .cognitive-table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| font-size: 0.88rem; | |
| } | |
| .cognitive-table th { | |
| background: var(--bg-accent); | |
| padding: 10px 14px; | |
| text-align: left; | |
| font-weight: 600; | |
| color: var(--muted); | |
| text-transform: uppercase; | |
| font-size: 0.78rem; | |
| letter-spacing: 0.04em; | |
| border-bottom: 2px solid var(--border); | |
| white-space: nowrap; | |
| } | |
| .cognitive-table td { | |
| padding: 10px 14px; | |
| border-bottom: 1px solid var(--border); | |
| vertical-align: middle; | |
| } | |
| .cognitive-table tr:last-child td { | |
| border-bottom: none; | |
| } | |
| .cognitive-table tr:hover td { | |
| background: var(--bg-accent); | |
| } | |
| .attn-badge { | |
| display: inline-block; | |
| padding: 2px 9px; | |
| border-radius: 20px; | |
| font-size: 0.78rem; | |
| font-weight: 600; | |
| } | |
| .attn-high { background: #d4edda; color: #1a5e2a; } | |
| .attn-medium { background: #fff3cd; color: #7a5000; } | |
| .attn-low { background: #f8d7da; color: #721c24; } | |
| .attend-present { color: #1a5e2a; font-weight: 600; } | |
| .attend-absent { color: #721c24; font-weight: 600; } | |
| .cog-clip-thumb { | |
| width: 160px; | |
| height: 90px; | |
| object-fit: cover; | |
| border-radius: 8px; | |
| cursor: pointer; | |
| } | |
| .conc-bar-bg { | |
| background: var(--border); | |
| border-radius: 4px; | |
| height: 8px; | |
| width: 100px; | |
| display: inline-block; | |
| vertical-align: middle; | |
| overflow: hidden; | |
| } | |
| .conc-bar-fill { | |
| height: 100%; | |
| border-radius: 4px; | |
| background: linear-gradient(90deg, #4caf50, #2196f3); | |
| } | |
| /* ── Classroom tab ─────────────────────────────────────────────────────────── */ | |
| .cls-attention-bar { | |
| margin: 1.5rem 0 1rem; | |
| } | |
| .cls-bar-label { | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| color: var(--muted); | |
| margin-bottom: 0.4rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.05em; | |
| } | |
| .cls-bar { | |
| display: flex; | |
| height: 36px; | |
| border-radius: 6px; | |
| overflow: hidden; | |
| gap: 2px; | |
| } | |
| .cls-bar-seg { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| min-width: 40px; | |
| transition: flex 0.3s; | |
| overflow: hidden; | |
| } | |
| .cls-bar-seg span { | |
| font-size: 0.7rem; | |
| font-weight: 600; | |
| color: #fff; | |
| white-space: nowrap; | |
| text-shadow: 0 1px 2px rgba(0,0,0,0.4); | |
| padding: 0 6px; | |
| } | |
| .cls-students { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 1.25rem; | |
| margin-top: 1.5rem; | |
| } | |
| .cls-student-card { | |
| border: 1px solid var(--border); | |
| border-radius: 10px; | |
| overflow: hidden; | |
| background: var(--surface); | |
| } | |
| .cls-student-summary { | |
| display: flex; | |
| align-items: center; | |
| gap: 1rem; | |
| padding: 0.75rem 1.1rem; | |
| cursor: pointer; | |
| user-select: none; | |
| list-style: none; | |
| flex-wrap: wrap; | |
| background: var(--bg); | |
| } | |
| .cls-student-summary::-webkit-details-marker { display: none; } | |
| .cls-student-id { | |
| font-size: 0.9rem; | |
| font-weight: 700; | |
| color: var(--text); | |
| min-width: 90px; | |
| } | |
| .cls-student-name { | |
| font-size: 0.9rem; | |
| font-weight: 700; | |
| color: var(--accent-strong); | |
| } | |
| .cls-student-id-secondary { | |
| font-size: 0.76rem; | |
| font-weight: 500; | |
| color: var(--muted); | |
| min-width: 0; | |
| } | |
| .cls-student-dominant { | |
| font-size: 0.82rem; | |
| font-weight: 600; | |
| color: var(--muted); | |
| background: var(--border); | |
| padding: 2px 8px; | |
| border-radius: 20px; | |
| } | |
| .cls-student-attn { | |
| font-size: 0.85rem; | |
| font-weight: 700; | |
| } | |
| .cls-student-windows { | |
| font-size: 0.78rem; | |
| color: var(--muted); | |
| margin-left: auto; | |
| } | |
| .cls-mini-bar { | |
| display: flex; | |
| height: 10px; | |
| border-radius: 3px; | |
| overflow: hidden; | |
| width: 140px; | |
| flex-shrink: 0; | |
| gap: 1px; | |
| } | |
| .cls-mini-seg { | |
| min-width: 3px; | |
| } | |
| .cls-timeline { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.75rem; | |
| padding: 1rem 1.1rem; | |
| border-top: 1px solid var(--border); | |
| } | |
| .cls-win { | |
| border: 2px solid #ccc; | |
| border-radius: 8px; | |
| overflow: hidden; | |
| width: 180px; | |
| flex-shrink: 0; | |
| background: var(--bg); | |
| } | |
| .cls-win-header { | |
| padding: 5px 8px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 1px; | |
| } | |
| .cls-win-time { | |
| font-size: 0.7rem; | |
| font-weight: 600; | |
| color: var(--muted); | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .cls-win-action { | |
| font-size: 0.8rem; | |
| font-weight: 700; | |
| } | |
| .cls-win-meta { | |
| font-size: 0.68rem; | |
| color: var(--muted); | |
| } | |
| .cls-win-clip { | |
| width: 100%; | |
| display: block; | |
| background: #000; | |
| } | |
| .cls-win-no-clip { | |
| height: 36px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 0.7rem; | |
| color: var(--muted); | |
| background: var(--border); | |
| } | |
| .tab-btn { | |
| padding: 4px 14px; | |
| border: 1px solid var(--border); | |
| border-radius: 4px; | |
| background: transparent; | |
| cursor: pointer; | |
| font-size: 0.85rem; | |
| color: var(--muted); | |
| } | |
| .tab-btn.tab-active { | |
| background: var(--accent, #3b82f6); | |
| color: #fff; | |
| border-color: var(--accent, #3b82f6); | |
| } | |