1
0
Fork 0

feat(ui): 형식 색상 + 손실/상태 시맨틱 토큰 (Catppuccin/Material/Radix 영감)

디자인 리서치(VS Code Material Icon Theme·Seti UI·Linguist·Radix dark·Catppuccin·Linear·Geist) 기반으로 형식 색상과 시맨틱 토큰을 확장.

- 신규 형식색 FsFmtCsv/Xlsx/Json/Svg/Video/Audio (회색→카테고리별 hue) + AllFormats/FormatPalette 매핑
- 손실 등급 토큰 FsLoss*(Lossless=초록/Container=회색/Recode=앰버/Rasterize=빨강, Radix dark)
- 상태 토큰 FsStatus*(Success/Warn/Danger/Info × dot/text/bg)
- Geist식 8% 투명 보더 FsBorderHairline
This commit is contained in:
Yun Chan 2026-06-01 14:32:59 +09:00
parent df07eb9bdd
commit faffb8f205
5 changed files with 1171 additions and 16 deletions

View file

@ -40,6 +40,53 @@
<SolidColorBrush x:Key="FsFmtHwp" Color="#9B2C2C"/>
<SolidColorBrush x:Key="FsFmtOther" Color="#4A5568"/>
<!-- Format pills (신규: 데이터/벡터/영상/오디오 카테고리) -->
<!-- 출처: VS Code Material Icon Theme + Seti UI(Solarized) + GitHub Linguist 의 hue 컨벤션을
차용하되, 채도/명도는 기존 Chakra/Tailwind 500 솔리드 톤(흰 텍스트 위 대비)에 맞춰 재조정.
Linear OKLCH 균일 명도 원칙(다크 #090A0C~#1C1E22 배경에서 한 칩만 튀지 않게)을 적용. -->
<!-- 데이터/표 = 그린 (Material table=#8BC34A, Seti green, Excel 브랜드 그린) -->
<SolidColorBrush x:Key="FsFmtCsv" Color="#68A063"/>
<SolidColorBrush x:Key="FsFmtXlsx" Color="#38A169"/>
<!-- 데이터/구조 = 골드 (Material json=#F9A825, Seti yellow); 기존 HEIC(#D69E2E)보다 노랑쪽 -->
<SolidColorBrush x:Key="FsFmtJson" Color="#E3B341"/>
<!-- 벡터 = 핑크-마젠타 (Seti svg=purple/css=pink); 노랑 JSON과 즉시 구분 -->
<SolidColorBrush x:Key="FsFmtSvg" Color="#E05A9C"/>
<!-- 영상 = 코랄/오렌지레드 (Material video=#FF9800, 통념 영상=난색); 기존 PDF(#E53E3E)와 구분 -->
<SolidColorBrush x:Key="FsFmtVideo" Color="#FF7043"/>
<!-- 오디오 = 라이트 퍼플 (Seti audio=purple, 통념 오디오=보라); 기존 PNG/GIF보다 라이트 -->
<SolidColorBrush x:Key="FsFmtAudio" Color="#B794F4"/>
<!-- 손실 등급 토큰 (Radix dark; Container는 중립 회색 — 사용자 결정) -->
<SolidColorBrush x:Key="FsLossLosslessDot" Color="#30A46C"/>
<SolidColorBrush x:Key="FsLossLosslessText" Color="#3DD68C"/>
<SolidColorBrush x:Key="FsLossLosslessBg" Color="#132D21"/>
<SolidColorBrush x:Key="FsLossContainerDot" Color="#717784"/>
<SolidColorBrush x:Key="FsLossContainerText" Color="#A6ADC8"/>
<SolidColorBrush x:Key="FsLossContainerBg" Color="#23252A"/>
<SolidColorBrush x:Key="FsLossRecodeDot" Color="#FFC53D"/>
<SolidColorBrush x:Key="FsLossRecodeText" Color="#FFCA16"/>
<SolidColorBrush x:Key="FsLossRecodeBg" Color="#302008"/>
<SolidColorBrush x:Key="FsLossRasterizeDot" Color="#E5484D"/>
<SolidColorBrush x:Key="FsLossRasterizeText" Color="#FF9592"/>
<SolidColorBrush x:Key="FsLossRasterizeBg" Color="#3B1219"/>
<!-- 상태 시맨틱 토큰 (Radix dark scales) -->
<SolidColorBrush x:Key="FsStatusSuccess" Color="#30A46C"/>
<SolidColorBrush x:Key="FsStatusSuccessText" Color="#3DD68C"/>
<SolidColorBrush x:Key="FsStatusSuccessBg" Color="#132D21"/>
<SolidColorBrush x:Key="FsStatusWarn" Color="#FFC53D"/>
<SolidColorBrush x:Key="FsStatusWarnText" Color="#FFCA16"/>
<SolidColorBrush x:Key="FsStatusWarnBg" Color="#302008"/>
<SolidColorBrush x:Key="FsStatusDanger" Color="#E5484D"/>
<SolidColorBrush x:Key="FsStatusDangerText" Color="#FF9592"/>
<SolidColorBrush x:Key="FsStatusDangerBg" Color="#3B1219"/>
<SolidColorBrush x:Key="FsStatusInfo" Color="#0090FF"/>
<SolidColorBrush x:Key="FsStatusInfoText" Color="#70B8FF"/>
<SolidColorBrush x:Key="FsStatusInfoBg" Color="#0D2847"/>
<!-- Geist식 8% 투명 보더 -->
<SolidColorBrush x:Key="FsBorderHairline" Color="#14FFFFFF"/>
<!-- Font families -->
<FontFamily x:Key="FsFontSans">Inter, Segoe UI Variable Text, Segoe UI</FontFamily>
<FontFamily x:Key="FsFontMono">JetBrains Mono, Cascadia Mono, Consolas</FontFamily>

View file

@ -824,22 +824,22 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
new(".html", "HTML", "HTML", "FsFmtHtml"),
new(".md", "Markdown", "MD", "FsFmtOther"),
new(".txt", "텍스트", "TXT", "FsFmtOther"),
new(".csv", "CSV", "CSV", "FsFmtOther"),
new(".json", "JSON", "JSON", "FsFmtOther"),
new(".xlsx", "Excel", "XLSX", "FsFmtOther"),
new(".svg", "SVG", "SVG", "FsFmtOther"),
new(".mp4", "MP4", "MP4", "FsFmtOther"),
new(".webm", "WebM", "WEBM", "FsFmtOther"),
new(".mkv", "MKV", "MKV", "FsFmtOther"),
new(".mov", "MOV", "MOV", "FsFmtOther"),
new(".avi", "AVI", "AVI", "FsFmtOther"),
new(".mp3", "MP3", "MP3", "FsFmtOther"),
new(".aac", "AAC", "AAC", "FsFmtOther"),
new(".m4a", "M4A", "M4A", "FsFmtOther"),
new(".opus", "Opus", "OPUS", "FsFmtOther"),
new(".ogg", "OGG", "OGG", "FsFmtOther"),
new(".flac", "FLAC", "FLAC", "FsFmtOther"),
new(".wav", "WAV", "WAV", "FsFmtOther"),
new(".csv", "CSV", "CSV", "FsFmtCsv"),
new(".json", "JSON", "JSON", "FsFmtJson"),
new(".xlsx", "Excel", "XLSX", "FsFmtXlsx"),
new(".svg", "SVG", "SVG", "FsFmtSvg"),
new(".mp4", "MP4", "MP4", "FsFmtVideo"),
new(".webm", "WebM", "WEBM", "FsFmtVideo"),
new(".mkv", "MKV", "MKV", "FsFmtVideo"),
new(".mov", "MOV", "MOV", "FsFmtVideo"),
new(".avi", "AVI", "AVI", "FsFmtVideo"),
new(".mp3", "MP3", "MP3", "FsFmtAudio"),
new(".aac", "AAC", "AAC", "FsFmtAudio"),
new(".m4a", "M4A", "M4A", "FsFmtAudio"),
new(".opus", "Opus", "OPUS", "FsFmtAudio"),
new(".ogg", "OGG", "OGG", "FsFmtAudio"),
new(".flac", "FLAC", "FLAC", "FsFmtAudio"),
new(".wav", "WAV", "WAV", "FsFmtAudio"),
};
private bool _suppressFormatChanged;
@ -1160,6 +1160,15 @@ internal static class FormatPalette
"bmp" => ("BMP", "FsFmtBmp"),
"raw" or "dng" or "nef" or "cr2" or "cr3" or "arw" or "raf" or "orf" or "rw2" or "srw" or "pef"
=> ("RAW", "FsFmtRaw"),
// 신규 카테고리 (output AllFormats 매핑과 동일 hue 유지)
"csv" => ("CSV", "FsFmtCsv"),
"json" => ("JSON", "FsFmtJson"),
"xlsx" or "xls" => ("XLSX", "FsFmtXlsx"),
"svg" => ("SVG", "FsFmtSvg"),
"mp4" or "webm" or "mkv" or "mov" or "avi" or "m4v"
=> (ext.ToUpperInvariant(), "FsFmtVideo"),
"mp3" or "aac" or "m4a" or "opus" or "ogg" or "oga" or "flac" or "wav"
=> (ext.ToUpperInvariant(), "FsFmtAudio"),
_ => (ext.ToUpperInvariant(), "FsFmtOther"),
};
}