/** * Audio Annotation Styles * * Styles for the audio annotation interface including: * - Waveform container * - Toolbar and controls * - Segment list * - Questions panel */ /* ==================== Container ==================== */ .audio-annotation-container { border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.5rem); background: var(--card, #ffffff); padding: 1rem; margin-bottom: 1rem; } /* ==================== Toolbar ==================== */ .audio-annotation-toolbar { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; padding: 0.75rem; background: var(--muted, #f9fafb); border-radius: var(--radius, 0.5rem); margin-bottom: 1rem; } .audio-annotation-toolbar > div { display: flex; align-items: center; gap: 0.5rem; } .tool-group-label { font-size: 0.75rem; font-weight: 500; color: var(--muted-foreground, #6b7280); margin-right: 0.25rem; } /* Playback controls */ .playback-group { display: flex; align-items: center; gap: 0.5rem; } .playback-btn { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; padding: 0; border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.375rem); background: var(--background, #ffffff); color: var(--foreground, #1f2937); font-size: 0.875rem; cursor: pointer; transition: all 0.15s ease; } .playback-btn:hover { background: var(--accent, #f3f4f6); border-color: var(--primary, #3b82f6); } .playback-btn:disabled { opacity: 0.5; cursor: not-allowed; } .time-display { font-size: 0.75rem; font-family: monospace; color: var(--muted-foreground, #6b7280); padding: 0 0.5rem; } /* Playback rate control */ .playback-rate-group { display: flex; align-items: center; gap: 0.5rem; } .playback-rate-select { font-size: 0.75rem; padding: 0.25rem 0.5rem; border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.375rem); background: var(--background, #ffffff); cursor: pointer; } /* Label selector */ .label-group { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .label-btn { display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; font-size: 0.75rem; font-weight: 500; border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.375rem); background: var(--background, #ffffff); color: var(--foreground, #1f2937); cursor: pointer; transition: all 0.15s ease; } .label-btn:hover { background: var(--accent, #f3f4f6); } .label-btn.active { border-color: var(--label-color, var(--primary, #3b82f6)); background: color-mix(in srgb, var(--label-color, var(--primary, #3b82f6)) 15%, white); box-shadow: 0 0 0 2px color-mix(in srgb, var(--label-color, var(--primary, #3b82f6)) 25%, transparent); } .label-color-dot { width: 0.625rem; height: 0.625rem; border-radius: 50%; flex-shrink: 0; } /* Zoom controls */ .zoom-group { display: flex; align-items: center; gap: 0.25rem; } .zoom-btn { display: inline-flex; align-items: center; justify-content: center; min-width: 2rem; height: 2rem; padding: 0 0.5rem; font-size: 0.75rem; font-weight: 500; border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.375rem); background: var(--background, #ffffff); color: var(--foreground, #1f2937); cursor: pointer; transition: all 0.15s ease; } .zoom-btn:hover { background: var(--accent, #f3f4f6); border-color: var(--primary, #3b82f6); } /* Segment controls */ .segment-group { display: flex; align-items: center; gap: 0.5rem; } .segment-btn { display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; font-size: 0.75rem; font-weight: 500; border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.375rem); background: var(--background, #ffffff); color: var(--foreground, #1f2937); cursor: pointer; transition: all 0.15s ease; } .segment-btn:hover:not(:disabled) { background: var(--accent, #f3f4f6); border-color: var(--primary, #3b82f6); } .segment-btn:disabled { opacity: 0.5; cursor: not-allowed; } .segment-btn.delete-btn:hover:not(:disabled) { background: #fef2f2; border-color: #ef4444; color: #ef4444; } /* Segment count */ .count-group { margin-left: auto; } .segment-count { font-size: 0.75rem; color: var(--muted-foreground, #6b7280); } .count-value { font-weight: 600; color: var(--foreground, #1f2937); } /* ==================== Waveform ==================== */ .waveform-wrapper { margin-bottom: 1rem; } .waveform-container { height: 200px; background: var(--muted, #f9fafb); border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.5rem); overflow: hidden; margin-bottom: 0.5rem; } .overview-container { height: 50px; background: var(--muted, #f9fafb); border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.5rem); overflow: hidden; } /* ==================== Segment List ==================== */ .segment-list-container { margin-top: 1rem; } .segment-list-container h4 { font-size: 0.875rem; font-weight: 600; color: var(--foreground, #1f2937); margin-bottom: 0.75rem; } .segment-list { display: flex; flex-direction: column; gap: 0.5rem; max-height: 300px; overflow-y: auto; } .segment-item { display: flex; align-items: center; gap: 0.75rem; padding: 0.75rem; background: var(--background, #ffffff); border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.5rem); cursor: pointer; transition: all 0.15s ease; } .segment-item:hover { background: var(--accent, #f3f4f6); } .segment-item.active { border-color: var(--primary, #3b82f6); background: color-mix(in srgb, var(--primary, #3b82f6) 5%, white); box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 15%, transparent); } .segment-color { width: 1rem; height: 1rem; border-radius: 0.25rem; flex-shrink: 0; } .segment-info { flex: 1; min-width: 0; } .segment-label { display: block; font-size: 0.875rem; font-weight: 500; color: var(--foreground, #1f2937); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .segment-time { display: block; font-size: 0.75rem; font-family: monospace; color: var(--muted-foreground, #6b7280); } .segment-actions { display: flex; gap: 0.25rem; } .segment-play-btn, .segment-delete-btn { display: inline-flex; align-items: center; justify-content: center; width: 1.75rem; height: 1.75rem; padding: 0; border: 1px solid transparent; border-radius: var(--radius, 0.375rem); background: transparent; color: var(--muted-foreground, #6b7280); font-size: 0.875rem; cursor: pointer; transition: all 0.15s ease; } .segment-play-btn:hover { background: var(--accent, #f3f4f6); color: var(--primary, #3b82f6); border-color: var(--primary, #3b82f6); } .segment-delete-btn:hover { background: #fef2f2; color: #ef4444; border-color: #ef4444; } /* ==================== Questions Panel ==================== */ .segment-questions-panel { margin-top: 1rem; padding: 1rem; background: var(--muted, #f9fafb); border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.5rem); } .segment-questions-panel h4 { font-size: 0.875rem; font-weight: 600; color: var(--foreground, #1f2937); margin-bottom: 0.75rem; } .segment-questions-content { /* Content container */ } .segment-questions-header { font-size: 0.875rem; color: var(--muted-foreground, #6b7280); margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border, #e5e7eb); } .segment-questions-placeholder { font-size: 0.875rem; color: var(--muted-foreground, #6b7280); font-style: italic; } /* ==================== Empty State ==================== */ .segment-list:empty::before { content: 'No segments yet. Double-click on the waveform or use [ and ] keys to create segments.'; display: block; text-align: center; padding: 2rem; font-size: 0.875rem; color: var(--muted-foreground, #6b7280); } /* ==================== Responsive ==================== */ @media (max-width: 768px) { .audio-annotation-toolbar { flex-direction: column; align-items: flex-start; } .audio-annotation-toolbar > div { width: 100%; } .label-group { width: 100%; justify-content: flex-start; } .count-group { margin-left: 0; } .waveform-container { height: 150px; } .overview-container { height: 40px; } } /* ==================== Spectrogram ==================== */ .spectrogram-section { margin-top: 0.75rem; } .spectrogram-container { position: relative; height: 150px; background: var(--muted, #1a1a1a); border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.5rem); overflow: hidden; } .spectrogram-canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .spectrogram-playhead-canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; } .spectrogram-label { font-size: 0.85em; color: var(--muted-foreground, #666); margin-bottom: 4px; } /* Spectrogram color map selector (optional toolbar addition) */ .spectrogram-controls { display: flex; align-items: center; gap: 0.5rem; margin-top: 0.5rem; } .spectrogram-colormap-select { font-size: 0.75rem; padding: 0.25rem 0.5rem; border: 1px solid var(--border, #e5e7eb); border-radius: var(--radius, 0.375rem); background: var(--background, #ffffff); cursor: pointer; } /* Frequency axis labels inside spectrogram */ .spectrogram-container .freq-label { position: absolute; left: 4px; font-size: 10px; color: rgba(255, 255, 255, 0.8); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); pointer-events: none; } /* ==================== Peaks.js Overrides ==================== */ /* Segment styling */ .peaks-segment { opacity: 0.6; } .peaks-segment:hover { opacity: 0.8; } .peaks-segment.selected { opacity: 0.9; } /* Time axis */ .peaks-axis { font-family: inherit; } /* Handle markers */ .peaks-handle { cursor: ew-resize; } /* Overview highlight */ .peaks-overview-highlight { stroke: var(--primary, #3b82f6); stroke-width: 2; fill: none; } /* ==================== Responsive Spectrogram ==================== */ @media (max-width: 768px) { .spectrogram-container { height: 100px; } }