···
background: var(--background);
border: 2px solid var(--secondary);
+
transition: border-color 0.2s;
+
.recording-card:hover {
+
border-color: var(--primary);
+
justify-content: space-between;
+
align-items: flex-start;
+
flex-direction: column;
+
text-transform: uppercase;
+
color: var(--paynes-gray);
+
letter-spacing: 0.05em;
···
···
···
background: var(--accent);
+
padding: 0.75rem 1.5rem;
transition: opacity 0.2s;
.approve-btn:hover:not(:disabled) {
···
border: 2px solid #dc2626;
+
padding: 0.75rem 1.5rem;
···
+
<div class="recordings-grid">
+
<div class="recording-card">
+
<div class="card-header">
+
<div class="file-info">
+
<div class="filename">${recording.original_filename}</div>
+
<div class="meta-item">
+
<div class="meta-label">Class</div>
+
<div class="meta-value">
+
<div class="class-info">
+
<span class="course-code">${recording.course_code}</span>
+
<span class="class-name">${recording.class_name}</span>
+
<div class="meta-item">
+
<div class="meta-label">Meeting Time</div>
+
<div class="meta-value">
+
recording.meeting_label
+
? html`<span class="meeting-label">${recording.meeting_label}</span>`
+
: html`<span style="color: var(--paynes-gray); font-style: italic;">Not specified</span>`
+
<div class="meta-item">
+
<div class="meta-label">Uploaded By</div>
+
<div class="meta-value">
+
<div class="user-info">
+
src="https://hostedboringavatars.vercel.app/api/marble?size=24&name=${recording.user_id}&colors=2d3142ff,4f5d75ff,bfc0c0ff,ef8354ff"
+
<span>${recording.user_name || recording.user_email}</span>
+
<div class="meta-item">
+
<div class="meta-label">Uploaded At</div>
+
<div class="meta-value timestamp">
+
${this.formatTimestamp(recording.created_at)}
+
<div class="audio-player">
+
<audio controls preload="metadata" src="/api/transcriptions/${recording.id}/audio"></audio>
+
<button class="approve-btn" @click=${() => this.handleApprove(recording.id)}>
+
<button class="delete-btn" @click=${() => this.handleDelete(recording.id)}>