fix: social gate round 2, part 1 - border-only move cursor, literal-\n

empty state, retail amber row selection

- Move cursor (user-directed, ALL windows): HoverWindowMove now
  advertises only where the window frame element itself wins the
  hit-test - its border pixels; interior points resolve to content
  children. Matches retail's Dragbar-chrome-only move cursor.
  Whole-surface dragging still works, it just does not advertise.
- Empty-state text (round 2): the DAT stores the LITERAL two-character
  escape backslash-n (probe-verified - the dump printed the escape, not
  line breaks), so the round-1 newline split never matched. Escapes are
  normalized before splitting in DatWidgetFactory authored text.
- Selected fellow amber (user: "check retail"): probe-verified - the
  row name band 0x10000282 AUTHORS the retail selected-row art
  (DirectState 0x06001450 + Highlight 0x06001451, the amber). Selection
  flips the band's ActiveState to Highlight; no invented tint.

App suite 4,976/3 skips. Confirmation-text + refused-drop-notification
research (the round's items 4-5) lands as part 2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-13 20:36:24 +02:00
parent 72ceddce2e
commit fc62cb6397
4 changed files with 56 additions and 5 deletions

View file

@ -707,11 +707,17 @@ public static class DatWidgetFactory
// newlines (the fellowship empty-state is three sentences over
// '\n's). A single Line renders them as one clipped run — split
// into one Line per authored line, exactly as retail's multiline
// UIElement_Text draws them. The provider re-reads DefaultColor
// UIElement_Text draws them. Gate round 2: the DAT stores the
// LITERAL two-character escape "\n" (0x5C 0x6E — probe-verified:
// the dump printed backslash-n, not a line break), so normalize
// the escape before splitting. The provider re-reads DefaultColor
// per call (NOT captured eagerly) so state-driven font-color
// changes keep tracking, the same live-color contract the
// single-line provider always had.
string[] parts = [.. authored.Split('\n').Select(static p => p.TrimEnd('\r'))];
string[] parts = [.. authored
.Replace("\\n", "\n")
.Split('\n')
.Select(static p => p.TrimEnd('\r'))];
t.LinesProvider = () =>
[.. parts.Select(p => new UiText.Line(p, t.DefaultColor))];
}