init commit

This commit is contained in:
2026-01-25 17:13:15 -06:00
commit 1bbfc332d8
27 changed files with 2462 additions and 0 deletions

View File

@@ -0,0 +1,97 @@
package header
import (
"fmt"
"path/filepath"
"time"
"github.com/charmbracelet/lipgloss"
"playback/internal/ui"
)
// Model represents the header component
type Model struct {
AudioPath string
TranscriptPath string
IsTemp bool
Width int
}
// New creates a new header model
func New() Model {
return Model{}
}
// SetPaths sets the file paths
func (m *Model) SetPaths(audioPath, transcriptPath string, isTemp bool) {
m.AudioPath = audioPath
m.TranscriptPath = transcriptPath
m.IsTemp = isTemp
}
// SetWidth sets the header width
func (m *Model) SetWidth(width int) {
m.Width = width
}
// formatDuration formats a duration as MM:SS
func formatDuration(d time.Duration) string {
d = d.Round(time.Second)
m := d / time.Minute
s := (d % time.Minute) / time.Second
return fmt.Sprintf("%02d:%02d", m, s)
}
// View renders the header
func (m Model) View(position, duration time.Duration, playing bool) string {
// Title
title := ui.HeaderStyle.Render("♪ Playback")
// File info
audioName := filepath.Base(m.AudioPath)
transcriptName := filepath.Base(m.TranscriptPath)
if m.IsTemp {
transcriptName += " (temp)"
}
fileInfo := ui.FilePathStyle.Render(
fmt.Sprintf("Audio: %s | Transcript: %s", audioName, transcriptName),
)
// Playback status
status := "⏸ Paused"
if playing {
status = "▶ Playing"
}
timeInfo := fmt.Sprintf("%s / %s", formatDuration(position), formatDuration(duration))
statusStyle := lipgloss.NewStyle().Foreground(ui.ColorSecondary)
if !playing {
statusStyle = lipgloss.NewStyle().Foreground(ui.ColorMuted)
}
rightSide := lipgloss.JoinHorizontal(
lipgloss.Center,
statusStyle.Render(status),
" ",
ui.BaseStyle.Render(timeInfo),
)
// Layout
leftWidth := lipgloss.Width(title) + lipgloss.Width(fileInfo) + 2
rightWidth := lipgloss.Width(rightSide)
spacerWidth := m.Width - leftWidth - rightWidth - 4
if spacerWidth < 1 {
spacerWidth = 1
}
return lipgloss.JoinHorizontal(
lipgloss.Center,
title,
" ",
fileInfo,
lipgloss.NewStyle().Width(spacerWidth).Render(""),
rightSide,
)
}