From 62425537c1fa671bec89f809ec762a3bc3ce9b8e Mon Sep 17 00:00:00 2001 From: Stu Leak Date: Mon, 29 Dec 2025 01:34:06 -0500 Subject: [PATCH] Add semantic color system for containers and codecs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements professional color taxonomy based on NLE/broadcast conventions: - Container colors (MKV teal, MP4 blue, MOV indigo, etc.) - Video codec colors (AV1 emerald, HEVC lime, H.264 sky blue, etc.) - Audio codec colors (Opus violet, AAC purple, FLAC magenta, etc.) - Pixel format colors (yuv420p slate, HDR cyan, etc.) Helper functions to retrieve colors by format/codec name. Foundation for color-coded UI badges in Convert module. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- internal/ui/colors.go | 133 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 internal/ui/colors.go diff --git a/internal/ui/colors.go b/internal/ui/colors.go new file mode 100644 index 0000000..a2fc7f5 --- /dev/null +++ b/internal/ui/colors.go @@ -0,0 +1,133 @@ +package ui + +import ( + "image/color" + + "git.leaktechnologies.dev/stu/VideoTools/internal/utils" +) + +// Semantic Color System for VideoTools +// Based on professional NLE and broadcast tooling conventions + +// Container / Format Colors (File Wrapper) +var ( + ColorMKV = utils.MustHex("#00B3B3") // Teal / Cyan - Neutral, modern, flexible container + ColorMP4 = utils.MustHex("#3B82F6") // Blue - Widely recognised, consumer-friendly + ColorMOV = utils.MustHex("#6366F1") // Indigo - Pro / Apple / QuickTime lineage + ColorAVI = utils.MustHex("#64748B") // Grey-Blue - Legacy container + ColorWEBM = utils.MustHex("#22C55E") // Green-Teal - Web-native + ColorTS = utils.MustHex("#F59E0B") // Amber - Broadcast / transport streams + ColorM2TS = utils.MustHex("#F59E0B") // Amber - Broadcast / transport streams +) + +// Video Codec Colors (Compression Method) +// Modern / Efficient Codecs +var ( + ColorAV1 = utils.MustHex("#10B981") // Emerald - Modern, efficient + ColorHEVC = utils.MustHex("#84CC16") // Lime-Green - Modern, efficient + ColorH265 = utils.MustHex("#84CC16") // Lime-Green - Same as HEVC + ColorVP9 = utils.MustHex("#22D3EE") // Green-Cyan - Modern, efficient +) + +// Established / Legacy Video Codecs +var ( + ColorH264 = utils.MustHex("#38BDF8") // Sky Blue - Compatibility + ColorAVC = utils.MustHex("#38BDF8") // Sky Blue - Same as H.264 + ColorMPEG2 = utils.MustHex("#EAB308") // Yellow-Amber - Legacy / broadcast + ColorDivX = utils.MustHex("#FB923C") // Muted Orange - Legacy + ColorXviD = utils.MustHex("#FB923C") // Muted Orange - Legacy + ColorMPEG4 = utils.MustHex("#FB923C") // Muted Orange - Legacy +) + +// Audio Codec Colors (Secondary but Distinct) +var ( + ColorOpus = utils.MustHex("#8B5CF6") // Violet - Modern audio + ColorAAC = utils.MustHex("#7C3AED") // Purple-Blue - Common audio + ColorFLAC = utils.MustHex("#EC4899") // Magenta - Lossless audio + ColorMP3 = utils.MustHex("#F43F5E") // Rose - Legacy audio + ColorAC3 = utils.MustHex("#F97316") // Orange-Red - Surround audio + ColorVorbis = utils.MustHex("#A855F7") // Purple - Open codec +) + +// Pixel Format / Colour Data (Technical Metadata) +var ( + ColorYUV420P = utils.MustHex("#94A3B8") // Slate - Standard + ColorYUV422P = utils.MustHex("#64748B") // Slate-Blue - Intermediate + ColorYUV444P = utils.MustHex("#475569") // Steel - High quality + ColorHDR = utils.MustHex("#06B6D4") // Cyan-Glow - HDR content + ColorSDR = utils.MustHex("#9CA3AF") // Neutral Grey - SDR content +) + +// GetContainerColor returns the semantic color for a container format +func GetContainerColor(format string) color.Color { + switch format { + case "mkv", "matroska": + return ColorMKV + case "mp4", "m4v": + return ColorMP4 + case "mov", "quicktime": + return ColorMOV + case "avi": + return ColorAVI + case "webm": + return ColorWEBM + case "ts", "m2ts", "mts": + return ColorTS + default: + return color.RGBA{100, 100, 100, 255} // Default grey + } +} + +// GetVideoCodecColor returns the semantic color for a video codec +func GetVideoCodecColor(codec string) color.Color { + switch codec { + case "av1": + return ColorAV1 + case "hevc", "h265", "h.265": + return ColorHEVC + case "vp9": + return ColorVP9 + case "h264", "avc", "h.264": + return ColorH264 + case "mpeg2": + return ColorMPEG2 + case "divx", "xvid", "mpeg4": + return ColorDivX + default: + return color.RGBA{100, 100, 100, 255} // Default grey + } +} + +// GetAudioCodecColor returns the semantic color for an audio codec +func GetAudioCodecColor(codec string) color.Color { + switch codec { + case "opus": + return ColorOpus + case "aac": + return ColorAAC + case "flac": + return ColorFLAC + case "mp3": + return ColorMP3 + case "ac3": + return ColorAC3 + case "vorbis": + return ColorVorbis + default: + return color.RGBA{100, 100, 100, 255} // Default grey + } +} + +// GetPixelFormatColor returns the semantic color for a pixel format +func GetPixelFormatColor(pixfmt string) color.Color { + switch pixfmt { + case "yuv420p", "yuv420p10le": + return ColorYUV420P + case "yuv422p", "yuv422p10le": + return ColorYUV422P + case "yuv444p", "yuv444p10le": + return ColorYUV444P + default: + return ColorSDR + } +}