데스크톱 T3 잔여 완성 + 스타일 폴리시: 도메인 라우팅(WorkspaceRoutingRules 자동 워크스페이스 전환), 탭 아카이브(TabArchive 영속·팔레트 복구), 페이지 액션(흑백/세피아 필터), 노트 패널(NotesStore+플라이아웃), 컴팩트 모드(크롬 숨김+엣지 호버). 스타일: 한국어 폰트 폴백, 암시 폰트 통일, 다크 툴팁, 텍스트 대비 상향. UpdateNavState dispose 가드. 164/164 GREEN + 실창 스크린샷 검증

This commit is contained in:
Yun Chan 2026-08-16 08:46:54 +09:00
parent 04ff0ff93d
commit f380518919
12 changed files with 594 additions and 24 deletions

View file

@ -48,8 +48,11 @@ public sealed class CommandPalette
public void Execute(PaletteCommand command) => command.Execute();
}
/// <summary>사이트별 부스트 설정(T2-7, Zen/Arc Boosts 패턴).</summary>
public sealed record BoostSettings(bool ForceDark, string CustomCss);
/// <summary>페이지 액션 필터(T3-6, Vivaldi Page Actions — Boost 통합).</summary>
public enum PageFilter { None, Grayscale, Sepia }
/// <summary>사이트별 부스트 설정(T2-7, Zen/Arc Boosts 패턴) + 페이지 액션 필터(T3-6).</summary>
public sealed record BoostSettings(bool ForceDark, string CustomCss, PageFilter Filter = PageFilter.None);
/// <summary>도메인별 부스트 영속 저장.</summary>
public sealed class BoostStore
@ -77,11 +80,11 @@ public sealed class BoostStore
return host != null && _map.TryGetValue(host, out var v) ? v : new BoostSettings(false, "");
}
public void Set(string? url, bool forceDark, string css)
public void Set(string? url, bool forceDark, string css, PageFilter filter = PageFilter.None)
{
var host = Normalize(url);
if (host == null) return;
_map[host] = new BoostSettings(forceDark, css);
_map[host] = new BoostSettings(forceDark, css, filter);
try
{
Directory.CreateDirectory(Path.GetDirectoryName(_path)!);
@ -110,7 +113,7 @@ public static class BoostCssBuilder
{
public static string BuildScript(string? url, BoostSettings settings)
{
if (!settings.ForceDark && string.IsNullOrWhiteSpace(settings.CustomCss)) return "";
if (!settings.ForceDark && settings.Filter == PageFilter.None && string.IsNullOrWhiteSpace(settings.CustomCss)) return "";
var css = "";
if (settings.ForceDark)
{
@ -119,6 +122,14 @@ html { filter: invert(1) hue-rotate(180deg); background: #fff; }
img, video, picture, canvas, svg, iframe, embed, object { filter: invert(1) hue-rotate(180deg); }
""";
}
else if (settings.Filter == PageFilter.Grayscale) // T3-6 페이지 액션
{
css += "html { filter: grayscale(1); }";
}
else if (settings.Filter == PageFilter.Sepia)
{
css += "html { filter: sepia(0.7); }";
}
if (!string.IsNullOrWhiteSpace(settings.CustomCss)) css += settings.CustomCss + "\n";
var js = $$"""
(function(){ try { var s = document.createElement('style'); s.id = 'vd-boost'; s.textContent = {{JsonSerializer.Serialize(css)}}; (document.head || document.documentElement).appendChild(s); } catch(e){} })();