색상 행에 인라인 팔레트 — 스와치를 누르면 그 자리에서 고르고, '자세히…' 로 피커

색을 바꾸려면 매번 대화상자를 열어야 했다. 실측해 보니 그럴 이유가 없다 —
--db-colors 진단을 신설해 운영 디자인 1,271건의 BackColor·ForeColor 60,319건을 집계한 결과
상위 두 값이 전체의 84%다: White 29,010건(48%), "224, 224, 224" 21,497건(36%).
뒤는 꼬리가 길고 얇다(Transparent 792 · Silver 557 · Window 440 · Gainsboro 415 …).
ForeColor 는 Black 4,920건(85%) · ControlText 345건이 사실상 전부.

스와치를 토글로 바꾸고 팝업에 실사용 상위 값을 배경 12종 / 글자·강조 12종으로 깔았다.
표준 색상표를 늘어놓지 않은 것은 의도다 — 목적은 자주 쓰는 값을 한 번에 고르게 하는 것이지
색을 발명하게 하는 것이 아니다. 임의 색은 팝업 아래 '자세히…' 로 기존 피커
(채도·명도 사각형 + 색상 슬라이더 + HEX·RGB + 프리셋·최근색)를 연다.

핵심은 견본이 레거시 원문 값을 그대로 넣는다는 점이다. 명명색을 RGB 로 풀면
원문과 달라져 왕복 diff 가 생기고, 시스템색이 갖는 의미(Window/Control/ControlText)도 잃는다.
'Window' 를 고르면 "Window" 가 저장된다. 툴팁에는 실사용 건수를 함께 띄운다.

'비우기'는 기본값을 저장하는 것이 아니라 키를 지운다 — 레거시 PropertyGrid 의 재설정과
같고, 원래 BackColor 가 없던 페이지(12.7%)를 원상태로 되돌릴 수 있어야 한다.

함께 고친 것: 페이지 속성 모드에서 '컨트롤을 선택하면 속성이 표시됩니다' 안내가 행과 같이
뜨던 것(HasSelection 이 컨트롤 선택만 보고 있었다). 탭 스트립은 페이지 모드에서 숨긴다.

편집 스모크 4건 추가(원문 값 적용 / 명명색 보존 / 적용 후 닫힘 / 비우기는 키 제거).
회귀: 테스트 124/124, 편집 스모크 실패 0, DB 왕복 1,271건 diff 0/예외 0,
종이 렌더 P062 바이트 동일.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Msystech
2026-08-13 10:56:47 +09:00
co-authored by Claude Opus 5
parent ac36f93a03
commit e84337705f
7 changed files with 337 additions and 21 deletions
@@ -0,0 +1,52 @@
namespace SheetMe.Core.Catalog;
/// <summary>
/// 색상 행 인라인 팔레트 — 운영 서식에서 <b>실제로 쓰이는</b> 값만 담는다.
///
/// 표준 색상표(빨/주/노/초…)를 늘어놓지 않는 이유가 있다. 실측(운영 디자인 1,271건의
/// BackColor·ForeColor 60,319건)에서 상위 두 값이 전체의 84%를 차지한다 —
/// White 29,010건(48%)과 "224, 224, 224" 21,497건(36%)이다. 뒤쪽은 꼬리가 길고 얇다.
/// 자주 쓰는 값을 한 번에 고르게 하는 것이 목적이지 색을 발명하게 하는 것이 아니다.
///
/// 값은 <b>레거시 원문 형식</b>을 그대로 쓴다(명명색 또는 "R, G, B").
/// 명명색을 RGB 로 풀면 원문과 달라져 왕복 diff 가 생기고, 시스템색의 의미도 사라진다.
/// </summary>
public static class LegacyColorCatalog
{
/// <summary>팔레트 항목 — 저장값과 실사용 건수(툴팁 표시용)</summary>
public sealed record Entry(string Value, string Usage);
/// <summary>배경색 계열 — 실측 상위순</summary>
public static IReadOnlyList<Entry> Backgrounds { get; } = new[]
{
new Entry("White", "29,010건"),
new Entry("224, 224, 224", "21,497건"),
new Entry("Transparent", "792건"),
new Entry("Silver", "557건"),
new Entry("Window", "440건"),
new Entry("Gainsboro", "415건"),
new Entry("226, 226, 226", "308건"),
new Entry("LightGray", "245건"),
new Entry("WhiteSmoke", "239건"),
new Entry("DarkGray", "215건"),
new Entry("Control", "99건"),
new Entry("ControlLight", "64건"),
};
/// <summary>글자색·강조 계열 — 실측 상위순</summary>
public static IReadOnlyList<Entry> Foregrounds { get; } = new[]
{
new Entry("Black", "4,920건"),
new Entry("ControlText", "345건"),
new Entry("Blue", "69건"),
new Entry("Red", "64건"),
new Entry("Gray", "30건"),
new Entry("RoyalBlue", "14건"),
new Entry("LightYellow", "91건"),
new Entry("255, 255, 192", "86건"),
new Entry("Lavender", "78건"),
new Entry("PaleTurquoise", "109건"),
new Entry("Bisque", "51건"),
new Entry("Info", "55건"),
};
}