From e789683ffa969856257dccb80cdcf3dd06f857c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 14:31:37 -0400 Subject: [PATCH] Git: components 301-320 --- ansi_text.go | 67 ++++ ansi_text_test.go | 59 +++ blame_view.go | 107 +++++ blame_view_test.go | 96 +++++ branch_list.go | 120 ++++++ branch_list_test.go | 85 ++++ branch_selector.go | 211 ++++++++++ branch_selector_test.go | 85 ++++ changes_list.go | 163 ++++++++ changes_list_test.go | 95 +++++ command_block.go | 158 ++++++++ command_block_test.go | 105 +++++ commit_graph.go | 204 ++++++++++ commit_graph_test.go | 98 +++++ commit_input.go | 106 +++++ commit_input_test.go | 101 +++++ commit_list.go | 105 +++++ commit_list_test.go | 91 +++++ conflict_resolver.go | 220 +++++++++++ conflict_resolver_test.go | 86 ++++ diff_stat.go | 72 ++++ diff_stat_test.go | 60 +++ diff_viewer.go | 225 +++++++++++ diff_viewer_test.go | 105 +++++ docs/components/301-diff-viewer.md | 52 +++ docs/components/302-inline-diff.md | 44 +++ docs/components/303-three-way-merge.md | 53 +++ docs/components/304-conflict-resolver.md | 51 +++ docs/components/305-changes-list.md | 66 ++++ docs/components/306-commit-input.md | 62 +++ docs/components/307-commit-graph.md | 67 ++++ docs/components/308-commit-list.md | 53 +++ docs/components/309-branch-selector.md | 64 +++ docs/components/310-branch-list.md | 62 +++ docs/components/311-tag-list.md | 59 +++ docs/components/312-stash-list.md | 58 +++ docs/components/313-blame-view.md | 62 +++ docs/components/314-file-history.md | 53 +++ docs/components/315-pull-request-card.md | 62 +++ docs/components/316-review-comment.md | 66 ++++ docs/components/317-diff-stat.md | 45 +++ docs/components/318-git-status-badge.md | 44 +++ docs/components/319-command-block.md | 62 +++ docs/components/320-ansi-text.md | 45 +++ example_git_test.go | 263 +++++++++++++ examples/gallery/pages_git.go | 297 +++++++++++++- examples/gallery/pages_git_cards.go | 134 +++++++ examples/gallery/pages_git_demos.go | 367 ++++++++++++++++++ file_history.go | 48 +++ file_history_test.go | 65 ++++ git_status_badge.go | 72 ++++ git_status_badge_test.go | 65 ++++ icons/svg/archive.svg | 16 + icons/svg/arrow-left-right.svg | 17 + icons/svg/chevrons-up-down.svg | 15 + icons/svg/git-branch.svg | 16 + icons/svg/git-commit-horizontal.svg | 16 + icons/svg/git-merge.svg | 16 + icons/svg/git-pull-request.svg | 17 + icons/svg/history.svg | 16 + icons/svg/message-square.svg | 14 + icons/svg/reply.svg | 15 + icons/svg/rotate-ccw.svg | 15 + icons/svg/tag.svg | 15 + inline_diff.go | 66 ++++ inline_diff_test.go | 49 +++ internal/diff.go | 60 ++- internal/diff_word_test.go | 38 ++ internal/git.go | 76 ++++ internal/git_test.go | 41 ++ messages_git.go | 114 ++++++ pull_request_card.go | 179 +++++++++ pull_request_card_test.go | 82 ++++ review_comment.go | 127 ++++++ review_comment_test.go | 97 +++++ stash_list.go | 58 +++ stash_list_test.go | 72 ++++ tag_list.go | 50 +++ tag_list_test.go | 64 +++ testdata/snapshots/darwin/ansi_text-dark.png | Bin 0 -> 20216 bytes testdata/snapshots/darwin/ansi_text-light.png | Bin 0 -> 19973 bytes testdata/snapshots/darwin/blame_view-dark.png | Bin 0 -> 23174 bytes .../snapshots/darwin/blame_view-light.png | Bin 0 -> 22795 bytes .../snapshots/darwin/branch_list-dark.png | Bin 0 -> 17777 bytes .../snapshots/darwin/branch_list-light.png | Bin 0 -> 17219 bytes .../snapshots/darwin/branch_selector-dark.png | Bin 0 -> 14174 bytes .../darwin/branch_selector-light.png | Bin 0 -> 15585 bytes .../snapshots/darwin/changes_list-dark.png | Bin 0 -> 16290 bytes .../snapshots/darwin/changes_list-light.png | Bin 0 -> 15959 bytes .../snapshots/darwin/command_block-dark.png | Bin 0 -> 22032 bytes .../snapshots/darwin/command_block-light.png | Bin 0 -> 21418 bytes .../snapshots/darwin/commit_graph-dark.png | Bin 0 -> 26659 bytes .../snapshots/darwin/commit_graph-light.png | Bin 0 -> 25685 bytes .../snapshots/darwin/commit_input-dark.png | Bin 0 -> 14947 bytes .../snapshots/darwin/commit_input-light.png | Bin 0 -> 14411 bytes .../snapshots/darwin/commit_list-dark.png | Bin 0 -> 26509 bytes .../snapshots/darwin/commit_list-light.png | Bin 0 -> 25597 bytes .../darwin/conflict_resolver-dark.png | Bin 0 -> 36981 bytes .../darwin/conflict_resolver-light.png | Bin 0 -> 35612 bytes testdata/snapshots/darwin/diff_stat-dark.png | Bin 0 -> 3007 bytes testdata/snapshots/darwin/diff_stat-light.png | Bin 0 -> 2949 bytes .../snapshots/darwin/diff_viewer-dark.png | Bin 0 -> 30001 bytes .../snapshots/darwin/diff_viewer-light.png | Bin 0 -> 29137 bytes .../snapshots/darwin/file_history-dark.png | Bin 0 -> 24432 bytes .../snapshots/darwin/file_history-light.png | Bin 0 -> 23448 bytes .../darwin/git_status_badge-dark.png | Bin 0 -> 5894 bytes .../darwin/git_status_badge-light.png | Bin 0 -> 5798 bytes .../snapshots/darwin/inline_diff-dark.png | Bin 0 -> 14515 bytes .../snapshots/darwin/inline_diff-light.png | Bin 0 -> 13783 bytes .../darwin/pull_request_card-dark.png | Bin 0 -> 28452 bytes .../darwin/pull_request_card-light.png | Bin 0 -> 28065 bytes .../snapshots/darwin/review_comment-dark.png | Bin 0 -> 27660 bytes .../snapshots/darwin/review_comment-light.png | Bin 0 -> 26334 bytes testdata/snapshots/darwin/stash_list-dark.png | Bin 0 -> 13961 bytes .../snapshots/darwin/stash_list-light.png | Bin 0 -> 13563 bytes testdata/snapshots/darwin/tag_list-dark.png | Bin 0 -> 8883 bytes testdata/snapshots/darwin/tag_list-light.png | Bin 0 -> 8733 bytes .../snapshots/darwin/three_way_merge-dark.png | Bin 0 -> 22445 bytes .../darwin/three_way_merge-light.png | Bin 0 -> 21696 bytes three_way_merge.go | 327 ++++++++++++++++ three_way_merge_test.go | 80 ++++ 121 files changed, 7031 insertions(+), 2 deletions(-) create mode 100644 ansi_text.go create mode 100644 ansi_text_test.go create mode 100644 blame_view.go create mode 100644 blame_view_test.go create mode 100644 branch_list.go create mode 100644 branch_list_test.go create mode 100644 branch_selector.go create mode 100644 branch_selector_test.go create mode 100644 changes_list.go create mode 100644 changes_list_test.go create mode 100644 command_block.go create mode 100644 command_block_test.go create mode 100644 commit_graph.go create mode 100644 commit_graph_test.go create mode 100644 commit_input.go create mode 100644 commit_input_test.go create mode 100644 commit_list.go create mode 100644 commit_list_test.go create mode 100644 conflict_resolver.go create mode 100644 conflict_resolver_test.go create mode 100644 diff_stat.go create mode 100644 diff_stat_test.go create mode 100644 diff_viewer.go create mode 100644 diff_viewer_test.go create mode 100644 docs/components/301-diff-viewer.md create mode 100644 docs/components/302-inline-diff.md create mode 100644 docs/components/303-three-way-merge.md create mode 100644 docs/components/304-conflict-resolver.md create mode 100644 docs/components/305-changes-list.md create mode 100644 docs/components/306-commit-input.md create mode 100644 docs/components/307-commit-graph.md create mode 100644 docs/components/308-commit-list.md create mode 100644 docs/components/309-branch-selector.md create mode 100644 docs/components/310-branch-list.md create mode 100644 docs/components/311-tag-list.md create mode 100644 docs/components/312-stash-list.md create mode 100644 docs/components/313-blame-view.md create mode 100644 docs/components/314-file-history.md create mode 100644 docs/components/315-pull-request-card.md create mode 100644 docs/components/316-review-comment.md create mode 100644 docs/components/317-diff-stat.md create mode 100644 docs/components/318-git-status-badge.md create mode 100644 docs/components/319-command-block.md create mode 100644 docs/components/320-ansi-text.md create mode 100644 example_git_test.go create mode 100644 examples/gallery/pages_git_cards.go create mode 100644 examples/gallery/pages_git_demos.go create mode 100644 file_history.go create mode 100644 file_history_test.go create mode 100644 git_status_badge.go create mode 100644 git_status_badge_test.go create mode 100644 icons/svg/archive.svg create mode 100644 icons/svg/arrow-left-right.svg create mode 100644 icons/svg/chevrons-up-down.svg create mode 100644 icons/svg/git-branch.svg create mode 100644 icons/svg/git-commit-horizontal.svg create mode 100644 icons/svg/git-merge.svg create mode 100644 icons/svg/git-pull-request.svg create mode 100644 icons/svg/history.svg create mode 100644 icons/svg/message-square.svg create mode 100644 icons/svg/reply.svg create mode 100644 icons/svg/rotate-ccw.svg create mode 100644 icons/svg/tag.svg create mode 100644 inline_diff.go create mode 100644 inline_diff_test.go create mode 100644 internal/diff_word_test.go create mode 100644 internal/git.go create mode 100644 internal/git_test.go create mode 100644 messages_git.go create mode 100644 pull_request_card.go create mode 100644 pull_request_card_test.go create mode 100644 review_comment.go create mode 100644 review_comment_test.go create mode 100644 stash_list.go create mode 100644 stash_list_test.go create mode 100644 tag_list.go create mode 100644 tag_list_test.go create mode 100644 testdata/snapshots/darwin/ansi_text-dark.png create mode 100644 testdata/snapshots/darwin/ansi_text-light.png create mode 100644 testdata/snapshots/darwin/blame_view-dark.png create mode 100644 testdata/snapshots/darwin/blame_view-light.png create mode 100644 testdata/snapshots/darwin/branch_list-dark.png create mode 100644 testdata/snapshots/darwin/branch_list-light.png create mode 100644 testdata/snapshots/darwin/branch_selector-dark.png create mode 100644 testdata/snapshots/darwin/branch_selector-light.png create mode 100644 testdata/snapshots/darwin/changes_list-dark.png create mode 100644 testdata/snapshots/darwin/changes_list-light.png create mode 100644 testdata/snapshots/darwin/command_block-dark.png create mode 100644 testdata/snapshots/darwin/command_block-light.png create mode 100644 testdata/snapshots/darwin/commit_graph-dark.png create mode 100644 testdata/snapshots/darwin/commit_graph-light.png create mode 100644 testdata/snapshots/darwin/commit_input-dark.png create mode 100644 testdata/snapshots/darwin/commit_input-light.png create mode 100644 testdata/snapshots/darwin/commit_list-dark.png create mode 100644 testdata/snapshots/darwin/commit_list-light.png create mode 100644 testdata/snapshots/darwin/conflict_resolver-dark.png create mode 100644 testdata/snapshots/darwin/conflict_resolver-light.png create mode 100644 testdata/snapshots/darwin/diff_stat-dark.png create mode 100644 testdata/snapshots/darwin/diff_stat-light.png create mode 100644 testdata/snapshots/darwin/diff_viewer-dark.png create mode 100644 testdata/snapshots/darwin/diff_viewer-light.png create mode 100644 testdata/snapshots/darwin/file_history-dark.png create mode 100644 testdata/snapshots/darwin/file_history-light.png create mode 100644 testdata/snapshots/darwin/git_status_badge-dark.png create mode 100644 testdata/snapshots/darwin/git_status_badge-light.png create mode 100644 testdata/snapshots/darwin/inline_diff-dark.png create mode 100644 testdata/snapshots/darwin/inline_diff-light.png create mode 100644 testdata/snapshots/darwin/pull_request_card-dark.png create mode 100644 testdata/snapshots/darwin/pull_request_card-light.png create mode 100644 testdata/snapshots/darwin/review_comment-dark.png create mode 100644 testdata/snapshots/darwin/review_comment-light.png create mode 100644 testdata/snapshots/darwin/stash_list-dark.png create mode 100644 testdata/snapshots/darwin/stash_list-light.png create mode 100644 testdata/snapshots/darwin/tag_list-dark.png create mode 100644 testdata/snapshots/darwin/tag_list-light.png create mode 100644 testdata/snapshots/darwin/three_way_merge-dark.png create mode 100644 testdata/snapshots/darwin/three_way_merge-light.png create mode 100644 three_way_merge.go create mode 100644 three_way_merge_test.go diff --git a/ansi_text.go b/ansi_text.go new file mode 100644 index 0000000..0795f99 --- /dev/null +++ b/ansi_text.go @@ -0,0 +1,67 @@ +package mujica + +import ( + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// AnsiTextOptions configure an AnsiText. +type AnsiTextOptions struct { + // Wrap breaks long lines at the width. + Wrap bool +} + +// AnsiText renders terminal output with its SGR styles. +func AnsiText(c *ui.Context, text string, opts AnsiTextOptions) *ui.Element { + k := Tokens(c) + col := ui.Column(c).Font(theme.MonoFont).TextColor(k.Text).Shrink(0) + col.Children(func() { + var st internal.AnsiStyle + for _, line := range strings.Split(text, "\n") { + var spans []internal.AnsiSpan + spans, st = internal.ParseAnsi(line, st) + out := make([]ui.Span, 0, len(spans)) + for _, s := range spans { + out = append(out, ansiTextSpan(k, s)) + } + if len(out) == 0 { + out = append(out, ui.Span{Text: " "}) + } + t := ui.RichText(c, out...) + if !opts.Wrap { + t.NoWrap() + } + } + }) + return col +} + +// ansiTextSpan maps one parsed span onto theme-readable colors. +func ansiTextSpan(k theme.Tokens, s internal.AnsiSpan) ui.Span { + fg, hasFG := internal.AnsiResolve(k.Dark, s.Style.FG) + if !hasFG { + fg = k.Text + } + bg, hasBG := internal.AnsiResolve(k.Dark, s.Style.BG) + if s.Style.Inverse { + if !hasBG { + bg = k.Surface + } + fg, bg, hasBG = bg, fg, true + } + if s.Style.Dim { + fg = fg.Mix(k.Surface, 0.4) + } + out := ui.Span{Text: s.Text, Color: fg, Italic: s.Style.Italic, Underline: s.Style.Underline, Strikethrough: s.Style.Strike} + if s.Style.Bold { + out.Weight = 700 + } + if hasBG { + out.Background = bg + } + return out +} diff --git a/ansi_text_test.go b/ansi_text_test.go new file mode 100644 index 0000000..1107284 --- /dev/null +++ b/ansi_text_test.go @@ -0,0 +1,59 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +func TestAnsiTextStripsSGRKeepsUnknown(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + AnsiText(c, "\x1b[1;31merror\x1b[0m: bad\n\x1b[2Kcleared", AnsiTextOptions{}) + }, 400, 100) + if !tt.HasText("error: bad") { + t.Fatalf("styled line: %q", tt.Texts()) + } + if !tt.HasText("\x1b[2Kcleared") { + t.Fatalf("unknown escape not kept: %q", tt.Texts()) + } +} + +func TestAnsiTextSpanStyles(t *testing.T) { + k := theme.Light() + parse := func(s string) ui.Span { + spans, _ := internal.ParseAnsi(s, internal.AnsiStyle{}) + return ansiTextSpan(k, spans[0]) + } + red, _ := internal.AnsiResolve(false, internal.AnsiColor{Kind: internal.AnsiIndexed, Index: 1}) + if s := parse("\x1b[1;3;4;31mx"); s.Color != red || s.Weight != 700 || !s.Italic || !s.Underline { + t.Errorf("bold italic underline red: %+v", s) + } + if s := parse("\x1b[38;5;196mx"); s.Color != ui.RGB(255, 0, 0) { + t.Errorf("256 color: %+v", s.Color) + } + if s := parse("\x1b[38;2;10;20;30;48;2;1;2;3mx"); s.Color != ui.RGB(10, 20, 30) || s.Background != ui.RGB(1, 2, 3) { + t.Errorf("true color: %+v", s) + } + if s := parse("\x1b[7mx"); s.Color != k.Surface || s.Background != k.Text { + t.Errorf("inverse: %+v", s) + } + if s := parse("\x1b[9mx"); !s.Strikethrough || s.Color != k.Text { + t.Errorf("strike: %+v", s) + } +} + +func TestAnsiTextSnapshot(t *testing.T) { + snapshot(t, "ansi_text", 520, 200, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { + AnsiText(c, "\x1b[1mBuilding\x1b[0m mujica \x1b[2m(v1.1)\x1b[0m\n"+ + "\x1b[32m✓\x1b[0m 300 passed \x1b[31m✗\x1b[0m 2 failed \x1b[33m!\x1b[0m 1 skipped\n"+ + "\x1b[30m0\x1b[31m1\x1b[32m2\x1b[33m3\x1b[34m4\x1b[35m5\x1b[36m6\x1b[37m7\x1b[90m8\x1b[91m9\x1b[92mA\x1b[93mB\x1b[94mC\x1b[95mD\x1b[96mE\x1b[97mF\x1b[0m\n"+ + "\x1b[38;5;208m256-color\x1b[0m \x1b[38;2;125;32;52mtrue color\x1b[0m \x1b[4munderline\x1b[0m \x1b[3mitalic\x1b[0m \x1b[7m inverse \x1b[0m\n"+ + "\x1b[41;97m FAIL \x1b[0m kept: \x1b[2K", AnsiTextOptions{}) + }) + }) +} diff --git a/blame_view.go b/blame_view.go new file mode 100644 index 0000000..0bac5bc --- /dev/null +++ b/blame_view.go @@ -0,0 +1,107 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strconv" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// BlameLine is a source line and its last commit. +type BlameLine struct { + Hash string + Author string + When time.Time + Summary string + Text string +} + +// BlameViewState keeps scroll place and highlight state. +type BlameViewState struct { + list ui.ListState + blocks []bool + src *BlameLine + n int + lang string +} + +// BlameViewOptions configure a BlameView. +type BlameViewOptions struct { + // Language picks syntax colors, as "go"; empty is plain. + Language string + // TimeFormat lays out commit dates; empty means "2006-01-02". + TimeFormat string +} + +// BlameView shows code with its commits; give it a height. +func BlameView(c *ui.Context, s *BlameViewState, lines []BlameLine, opts BlameViewOptions) *ui.Element { + var first *BlameLine + if len(lines) > 0 { + first = &lines[0] + } + if first != s.src || len(lines) != s.n || opts.Language != s.lang { + s.blocks = blameViewBlocks(lines, opts.Language) + s.src, s.n, s.lang = first, len(lines), opts.Language + slog.Debug("mujica: blame view index", "lines", len(lines)) + } + layout := opts.TimeFormat + if layout == "" { + layout = "2006-01-02" + } + k := Tokens(c) + d := Density(c) + u := d.Unit() + digits := float32(len(strconv.Itoa(len(lines)))) + s.list.Label = func(i int) string { return lines[i].Text } + e := ui.List(c, &s.list, len(lines), func(i int) { + ln := lines[i] + if ln.Hash == "" { + panic("mujica: BlameLine needs a Hash") + } + head := i == 0 || lines[i-1].Hash != ln.Hash + row := ui.Row(c).AlignItems(ui.Stretch).MinHeight(theme.MinHitSize) + if head && i > 0 { + row.Draw(func(p *ui.Painter, r ui.Rect) { p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W, H: 1}, k.Border, 0) }) + } + row.Children(func() { + gut := ui.Row(c).Width(240).Shrink(0).AlignItems(ui.Center).Gap(u*2).Padding(0, u*3).Background(k.Surface). + Label(fmt.Sprintf(msg(c, "blame_view.line"), i+1, ln.Author, gitShortHash(ln.Hash))) + gut.Tooltip(fmt.Sprintf("%s\n%s · %s\n%s", ln.Hash, ln.Author, ln.When.Format(layout), ln.Summary)) + if gut.Hovered() { + gut.Background(k.SurfaceHover) + } + gut.Transition(colorFade) + gut.Children(func() { + if !head { + return + } + small := FontSize(c, theme.CaptionSize) + ui.Text(c, gitShortHash(ln.Hash)).Font(theme.MonoFont).FontSize(small).TextColor(k.AccentText).Shrink(0) + ui.Text(c, ln.Author).FontSize(small).SingleLine().Grow(1).MinWidth(0) + ui.Text(c, ln.When.Format(layout)).FontSize(small).FontFeatures("tnum").TextColor(k.TextMuted).Shrink(0) + }) + ui.Text(c, strconv.Itoa(i+1)).Font(theme.MonoFont).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum"). + TextColor(k.TextMuted).Width(digits*8+u*4).TextAlign(ui.End).Padding(u, u*2, 0, 0).Shrink(0) + spans, _ := internal.CodeSpans(k, opts.Language, ln.Text, s.blocks[i]) + ui.RichText(c, spans...).Font(theme.MonoFont).NoWrap().Padding(u, u*2).AlignSelf(ui.Center) + }) + }) + e.Background(k.Background).Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius) + return e +} + +// blameViewBlocks records where block comments are open. +func blameViewBlocks(lines []BlameLine, language string) []bool { + blocks := make([]bool, len(lines)) + open := false + for i, ln := range lines { + blocks[i] = open + _, open = internal.Highlight(language, ln.Text, open) + } + return blocks +} diff --git a/blame_view_test.go b/blame_view_test.go new file mode 100644 index 0000000..3120bf7 --- /dev/null +++ b/blame_view_test.go @@ -0,0 +1,96 @@ +package mujica + +import ( + "fmt" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func blameSample() []BlameLine { + a := BlameLine{Hash: gitTestHash(1), Author: "Sakiko", When: gitTestTime, Summary: "Add the graph"} + b := BlameLine{Hash: gitTestHash(2), Author: "Uika", When: gitTestTime, Summary: "Comment the lanes"} + lines := []string{"package mujica", "", "/* lanes", " per row */", "func lanes() int {", "\treturn 2", "}"} + out := make([]BlameLine, len(lines)) + for i, s := range lines { + ln := a + if i >= 2 && i <= 3 { + ln = b + } + ln.Text = s + out[i] = ln + } + return out +} + +func TestBlameViewGroupsCommits(t *testing.T) { + var s BlameViewState + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + BlameView(c, &s, blameSample(), BlameViewOptions{Language: "go"}).Height(300) + }, 700, 340) + count := 0 + for _, txt := range tt.Texts() { + if txt == "Sakiko" || txt == "Uika" { + count++ + } + } + // Three runs: lines 1-2, 3-4 and 5-7. + if count != 3 { + t.Fatalf("author shown %d times, want 3: %q", count, tt.Texts()) + } + if _, ok := tt.Find(fmt.Sprintf("Line 4, Uika, %s", gitShortHash(gitTestHash(2)))); !ok { + t.Fatal("line 4 gutter not named") + } + if !s.blocks[3] || s.blocks[4] { + t.Fatalf("block comment state %v", s.blocks) + } +} + +func TestBlameViewHoverDetails(t *testing.T) { + var s BlameViewState + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + BlameView(c, &s, blameSample(), BlameViewOptions{}).Height(300) + }, 700, 340) + r, _ := tt.Find("Uika") + tt.Move(r.X+2, r.Y+2) + time.Sleep(650 * time.Millisecond) + tt.Move(r.X+3, r.Y+2) + tt.Frame() + if tt.HasText(gitTestHash(2) + "\nUika · 2026-10-05\nComment the lanes") { + return + } + t.Fatalf("no hover details: %q", tt.Texts()) +} + +func TestBlameViewVirtualized(t *testing.T) { + lines := make([]BlameLine, 100000) + for i := range lines { + lines[i] = BlameLine{Hash: gitTestHash(i / 3), Author: "Sakiko", When: gitTestTime, Text: fmt.Sprintf("line %d", i)} + } + var s BlameViewState + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + BlameView(c, &s, lines, BlameViewOptions{}).Height(400) + }, 700, 440) + if n := len(tt.Texts()); n > 400 { + t.Fatalf("%d texts for 100,000 lines", n) + } + blocks := &s.blocks[0] + tt.Frame() + if &s.blocks[0] != blocks { + t.Fatal("highlight state recomputed without a data change") + } +} + +func TestBlameViewSnapshot(t *testing.T) { + lines := blameSample() + snapshot(t, "blame_view", 640, 300, func(c *ui.Context) { + s := ui.Local(c.Root(), "blame", func() *BlameViewState { return &BlameViewState{} }) + ui.Column(c).Padding(16).Children(func() { + BlameView(c, *s, lines, BlameViewOptions{Language: "go"}).Height(260) + }) + }) +} diff --git a/branch_list.go b/branch_list.go new file mode 100644 index 0000000..7e7cfe7 --- /dev/null +++ b/branch_list.go @@ -0,0 +1,120 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// Branch is a local or remote branch. +type Branch struct { + // Name is unique; remote names carry the remote, as origin/main. + Name string + Remote bool + // Current marks the checked-out branch. + Current bool + // Upstream is the tracked remote branch, if any. + Upstream string + Ahead, Behind int +} + +// GitAction is a row action of a version-control list. +type GitAction struct { + ID string + Label string + // Icon names an icon from icons/. + Icon string +} + +// BranchListOptions configure a BranchList. +type BranchListOptions struct { + // Actions show on every row; Action returns their IDs. + Actions []GitAction + Status DataStatus + Error string +} + +// BranchList shows branches with upstream and ahead/behind counts. +func BranchList(c *ui.Context, s *ListState[string], branches []Branch, opts BranchListOptions) GitListResult { + gitActionsCheck(opts.Actions) + var r GitListResult + v := List(c, s, len(branches), ListOptions[string]{ + Key: func(i int) string { return branchKey(branches[i]) }, + Label: func(i int) string { return branches[i].Name }, + Status: opts.Status, Error: opts.Error, Empty: msg(c, "branch_list.empty"), + }, func(i int) { + b := branches[i] + branchListRow(c, b) + gitRowActions(c, opts.Actions, b.Name, &r) + }) + r.Element, r.changed, r.submitted = v.Element, v.Changed(), v.Submitted() + return r +} + +func branchKey(b Branch) string { + if b.Name == "" { + panic("mujica: Branch needs a Name") + } + if b.Ahead < 0 || b.Behind < 0 { + panic("mujica: Branch Ahead and Behind must not be negative") + } + return b.Name +} + +func branchListRow(c *ui.Context, b Branch) { + k := Tokens(c) + u := Density(c).Unit() + small := FontSize(c, theme.CaptionSize) + mark := ui.Box(c).Size(16, 16).Shrink(0).Center().Role(ui.RoleNone) + if b.Current { + mark.TextColor(k.AccentText).Children(func() { ui.Icon(c, icons.Must("check")).Size(14, 14) }) + } + ui.Icon(c, icons.Must("git-branch")).Size(14, 14).Shrink(0).TextColor(k.TextMuted) + name := ui.Text(c, b.Name).SingleLine().MinWidth(0).Shrink(1) + if b.Current { + name.FontWeight(600) + ui.Text(c, msg(c, "branch_list.current")).FontSize(small).TextColor(k.AccentText).Shrink(0) + } + ui.Spacer(c) + if b.Upstream != "" { + ui.Row(c).Gap(u).AlignItems(ui.Center).Shrink(0).TextColor(k.TextMuted).Children(func() { + ui.Text(c, b.Upstream).FontSize(small).SingleLine().MaxWidth(160) + if b.Ahead > 0 { + ui.Text(c, fmt.Sprintf("↑%d", b.Ahead)).FontSize(small).FontFeatures("tnum").Label(fmt.Sprintf(msg(c, "branch_list.ahead"), b.Ahead)) + } + if b.Behind > 0 { + ui.Text(c, fmt.Sprintf("↓%d", b.Behind)).FontSize(small).FontFeatures("tnum").Label(fmt.Sprintf(msg(c, "branch_list.behind"), b.Behind)) + } + }) + } +} + +// gitActionsCheck panics on incomplete or duplicate actions. +func gitActionsCheck(actions []GitAction) { + seen := map[string]bool{} + for _, a := range actions { + if a.ID == "" || a.Label == "" || a.Icon == "" { + panic("mujica: GitAction needs an ID, Label and Icon") + } + if seen[a.ID] { + panic("mujica: duplicate GitAction " + a.ID) + } + seen[a.ID] = true + icons.Must(a.Icon) + } +} + +// gitRowActions shows row actions and records the one used. +func gitRowActions(c *ui.Context, actions []GitAction, item string, r *GitListResult) { + for _, a := range actions { + b := iconAction(c, icons.Must(a.Icon), a.Label).Tooltip(a.Label).Shrink(0) + if b.Clicked() && !b.IsDisabled() { + r.action, r.item = a.ID, item + slog.Debug("mujica: git list action", "action", a.ID, "item", item) + } + } +} diff --git a/branch_list_test.go b/branch_list_test.go new file mode 100644 index 0000000..51afde4 --- /dev/null +++ b/branch_list_test.go @@ -0,0 +1,85 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func branchSample() []Branch { + return []Branch{ + {Name: "main", Current: true, Upstream: "origin/main", Ahead: 2, Behind: 1}, + {Name: "feature/graph", Upstream: "origin/feature/graph"}, + {Name: "fix/blame"}, + {Name: "origin/main", Remote: true}, + {Name: "origin/release", Remote: true}, + } +} + +func TestBranchListRowsAndActions(t *testing.T) { + var s ListState[string] + var acted [][2]string + actions := []GitAction{{ID: "checkout", Label: "Check out", Icon: "git-branch"}, {ID: "delete", Label: "Delete", Icon: "trash-2"}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := BranchList(c, &s, branchSample(), BranchListOptions{Actions: actions}) + r.Element.Height(300) + if a, item, ok := r.Action(); ok { + acted = append(acted, [2]string{a, item}) + } + }, 700, 340) + if !tt.HasText("current") || !tt.HasText("origin/feature/graph") { + t.Fatalf("current, ahead, behind: %q", tt.Texts()) + } + for _, name := range []string{"2 ahead of upstream", "1 behind upstream"} { + if _, ok := tt.Find(name); !ok { + t.Fatalf("%q not shown", name) + } + } + r, _ := tt.Find("fix/blame") + if err := tt.Click("fix/blame"); err != nil { + t.Fatal(err) + } + if key, _ := s.Selected(); key != "fix/blame" { + t.Fatalf("selected %q", key) + } + // The third row's Delete button sits at the row's right end. + tt.ClickAt(700-60, r.Y+r.H/2) + if len(acted) != 1 || acted[0] != [2]string{"delete", "fix/blame"} { + t.Fatalf("actions %q", acted) + } +} + +func TestBranchListInvalid(t *testing.T) { + for name, tc := range map[string]struct { + b []Branch + a []GitAction + }{ + "name": {[]Branch{{}}, nil}, + "ahead": {[]Branch{{Name: "x", Ahead: -1}}, nil}, + "action": {nil, []GitAction{{ID: "x"}}}, + "dup": {nil, []GitAction{{ID: "x", Label: "X", Icon: "x"}, {ID: "x", Label: "Y", Icon: "x"}}}, + } { + t.Run(name, func(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + var s ListState[string] + BranchList(c, &s, tc.b, BranchListOptions{Actions: tc.a}).Element.Height(100) + }, 300, 120, 1) + }) + } +} + +func TestBranchListSnapshot(t *testing.T) { + snapshot(t, "branch_list", 600, 260, func(c *ui.Context) { + s := ui.Local(c.Root(), "list", func() *ListState[string] { return &ListState[string]{} }) + ui.Column(c).Padding(16).Children(func() { + BranchList(c, *s, branchSample(), BranchListOptions{Actions: []GitAction{{ID: "checkout", Label: "Check out", Icon: "git-branch"}}}).Element.Height(220) + }) + }) +} diff --git a/branch_selector.go b/branch_selector.go new file mode 100644 index 0000000..642b4ab --- /dev/null +++ b/branch_selector.go @@ -0,0 +1,211 @@ +package mujica + +import ( + "log/slog" + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// BranchSelectorOptions configure a BranchSelector. +type BranchSelectorOptions struct { + // AllowCreate offers to create a branch named by the search. + AllowCreate bool + Disabled bool +} + +// BranchSelectorResult is a built BranchSelector and its events. +type BranchSelectorResult struct { + Element *ui.Element + changed bool + create string +} + +// Changed reports a new branch in *selected this frame. +func (r BranchSelectorResult) Changed() bool { return r.changed } + +// Created returns a branch name to create this frame. +func (r BranchSelectorResult) Created() (string, bool) { return r.create, r.create != "" } + +type branchSelectorState struct { + open, wasOpen bool + query string + hl int + reveal bool + // found caches the filter of src for query fq. + found []Branch + fq string + src *Branch + n int +} + +// BranchSelector chooses a branch from a searchable popup. +func BranchSelector(c *ui.Context, selected *string, branches []Branch, opts BranchSelectorOptions) BranchSelectorResult { + for _, b := range branches { + branchKey(b) + } + k := Tokens(c) + d := Density(c) + u := d.Unit() + tr := ui.ButtonBase(c).MinHeight(d.ControlHeight()).Padding(0, u*3).Gap(u*2).Radius(theme.ControlRadius). + Background(k.Surface).Border(theme.BorderWidth, k.ControlBorder).Disabled(opts.Disabled). + Label(msg(c, "branch_selector.label") + ": " + *selected) + internal.Ring(tr, k.Focus, theme.ControlRadius) + if tr.Hovered() { + tr.Background(k.SurfaceHover) + } + tr.Transition(colorFade) + st := ui.Local(tr, "state", func() *branchSelectorState { return &branchSelectorState{} }) + s := *st + res := BranchSelectorResult{Element: tr} + if tr.Clicked() && !tr.IsDisabled() { + s.open = !s.open + } + if tr.IsDisabled() { + s.open = false + } + if s.open && !s.wasOpen { + s.query, s.hl = "", 0 + slog.Debug("mujica: branch selector open") + } + s.wasOpen = s.open + tr.Children(func() { + ui.Icon(c, icons.Must("git-branch")).Size(16, 16).TextColor(k.TextMuted) + ui.Text(c, *selected).SingleLine().MaxWidth(220) + ui.Icon(c, icons.Must("chevrons-up-down")).Size(14, 14).TextColor(k.TextMuted) + }) + b := tr.Bounds() + ui.PopoverBase(c, tr, &s.open, func(panel *ui.Element) { + overlayStyle(c, panel, overlayAnchored(c, panel, b)) + panel.Margin(6, 0, 0, 0).Padding(u * 2).Gap(u * 2).Width(300).MaxHeight(popoverRoom(c, b)).AlignItems(ui.Stretch) + var first *Branch + if len(branches) > 0 { + first = &branches[0] + } + if s.found == nil || s.fq != s.query || s.src != first || s.n != len(branches) { + s.found, s.fq, s.src, s.n = branchSelectorFilter(branches, s.query), s.query, first, len(branches) + } + found := s.found + create := opts.AllowCreate && strings.TrimSpace(s.query) != "" && !branchSelectorHas(branches, strings.TrimSpace(s.query)) + n := len(found) + if create { + n++ + } + in := TextInput(c, &s.query, TextInputOptions{Placeholder: msg(c, "branch_selector.search"), Label: msg(c, "branch_selector.search"), + Leading: func() { ui.Icon(c, icons.Must("search")).Size(14, 14).TextColor(k.TextMuted) }}) + in.Input.AutoFocus() + if in.Changed() { + s.hl, s.reveal = 0, true + } + switch { + case n == 0: + case in.Input.Shortcut(0, ui.KeyDown): + s.hl, s.reveal = (s.hl+1)%n, true + case in.Input.Shortcut(0, ui.KeyUp): + s.hl, s.reveal = (s.hl-1+n)%n, true + } + s.hl = max(0, min(s.hl, n-1)) + pick := -1 + if in.Submitted() && n > 0 { + pick = s.hl + } + ui.Scroll(c).Shrink(1).Gap(2).Role(ui.RoleList).Children(func() { + if n == 0 { + ui.Text(c, msg(c, "branch_selector.empty")).TextColor(k.TextMuted).Padding(u * 3) + } + group := -1 + for i, br := range found { + if g := branchSelectorGroup(br); g != group { + group = g + ui.Text(c, msg(c, []string{"branch_selector.local", "branch_selector.remote"}[g])).Font(theme.SerifFont). + FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.Ornament.Mix(k.Text, 0.35)).Padding(u*2, u*2, u, u*2) + } + if branchSelectorRow(c, s, i, br.Name, br.Name == *selected, "git-branch") { + pick = i + } + } + if create && branchSelectorRow(c, s, len(found), msg(c, "branch_selector.create")+" “"+strings.TrimSpace(s.query)+"”", false, "plus") { + pick = len(found) + } + }) + switch { + case pick < 0: + case pick == len(found): + res.create = strings.TrimSpace(s.query) + s.open = false + slog.Debug("mujica: branch selector create", "name", res.create) + default: + s.open = false + if found[pick].Name != *selected { + *selected, res.changed = found[pick].Name, true + slog.Debug("mujica: branch selector choose", "branch", *selected) + } + } + }) + return res +} + +// branchSelectorRow builds row i and reports a click on it. +func branchSelectorRow(c *ui.Context, s *branchSelectorState, i int, label string, current bool, icon string) bool { + k := Tokens(c) + d := Density(c) + u := d.Unit() + row := ui.Row(c).AlignItems(ui.Center).Gap(u*2).MinHeight(d.ControlHeight()).Padding(0, u*2).Radius(theme.ControlRadius). + Role(ui.RoleListItem).Label(label).Cursor(ui.CursorPointer) + if i == s.hl { + row.Background(k.Selection) + if s.reveal { + row.ScrollIntoView() + s.reveal = false + } + } else if row.Hovered() { + row.Background(k.SurfaceHover) + } + row.Transition(colorFade) + row.Children(func() { + ui.Icon(c, icons.Must(icon)).Size(14, 14).TextColor(k.TextMuted) + t := ui.Text(c, label).SingleLine().Grow(1).MinWidth(0) + if current { + t.FontWeight(600) + ui.Icon(c, icons.Must("check")).Size(14, 14).TextColor(k.AccentText) + } + }) + return row.Clicked() +} + +func branchSelectorGroup(b Branch) int { + if b.Remote { + return 1 + } + return 0 +} + +// branchSelectorFilter keeps branches whose name holds the query, locals first. +func branchSelectorFilter(branches []Branch, query string) []Branch { + q := strings.ToLower(strings.TrimSpace(query)) + var local, remote []Branch + for _, b := range branches { + if !strings.Contains(strings.ToLower(b.Name), q) { + continue + } + if b.Remote { + remote = append(remote, b) + } else { + local = append(local, b) + } + } + return append(append(make([]Branch, 0, len(local)+len(remote)), local...), remote...) +} + +func branchSelectorHas(branches []Branch, name string) bool { + for _, b := range branches { + if b.Name == name { + return true + } + } + return false +} diff --git a/branch_selector_test.go b/branch_selector_test.go new file mode 100644 index 0000000..33ec927 --- /dev/null +++ b/branch_selector_test.go @@ -0,0 +1,85 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestBranchSelectorSearchAndChoose(t *testing.T) { + sel, changes := "main", 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if BranchSelector(c, &sel, branchSample(), BranchSelectorOptions{}).Changed() { + changes++ + } + }, 600, 500) + if err := tt.Click("Branch: main"); err != nil { + t.Fatal(err) + } + if !tt.HasText("Local") || !tt.HasText("Remote") || !tt.HasText("origin/release") { + t.Fatalf("groups: %q", tt.Texts()) + } + tt.Type("rel") + if tt.HasText("fix/blame") || !tt.HasText("origin/release") { + t.Fatalf("filter: %q", tt.Texts()) + } + tt.Key(0, ui.KeyEnter) + if sel != "origin/release" || changes != 1 || tt.HasText("Remote") { + t.Fatalf("Enter chose %q changes %d", sel, changes) + } + _ = tt.Click("Branch: origin/release") + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + if sel != "fix/blame" { + t.Fatalf("arrows chose %q", sel) + } + _ = tt.Click("Branch: fix/blame") + tt.Key(0, ui.KeyEscape) + if tt.HasText("Local") { + t.Fatal("Escape did not close") + } +} + +func TestBranchSelectorCreateAndDisabled(t *testing.T) { + sel, created, disabled := "main", "", false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := BranchSelector(c, &sel, branchSample(), BranchSelectorOptions{AllowCreate: true, Disabled: disabled}) + if name, ok := r.Created(); ok { + created = name + } + }, 600, 500) + _ = tt.Click("Branch: main") + tt.Type("feature/new") + if !tt.HasText("Create branch “feature/new”") { + t.Fatalf("create row: %q", tt.Texts()) + } + tt.Key(0, ui.KeyEnter) + if created != "feature/new" || sel != "main" { + t.Fatalf("created %q sel %q", created, sel) + } + _ = tt.Click("Branch: main") + disabled = true + tt.Frame() + if tt.HasText("Local") { + t.Fatal("popup stayed open on a disabled selector") + } + _ = tt.Click("Branch: main") + if tt.HasText("Local") { + t.Fatal("disabled selector opened") + } +} + +func TestBranchSelectorSnapshot(t *testing.T) { + snapshotAfter(t, "branch_selector", 420, 420, func(c *ui.Context) { + sel := ui.Local(c.Root(), "sel", func() string { return "main" }) + ui.Column(c).Padding(16).AlignItems(ui.Start).Children(func() { + BranchSelector(c, sel, branchSample(), BranchSelectorOptions{AllowCreate: true}) + }) + }, func(tt *ui.Tester) { + _ = tt.Click("Branch: main") + tt.Type("ma") + }) +} diff --git a/changes_list.go b/changes_list.go new file mode 100644 index 0000000..c313e18 --- /dev/null +++ b/changes_list.go @@ -0,0 +1,163 @@ +package mujica + +import ( + "fmt" + "log/slog" + "path" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// ChangedFile is a changed file in the tree or index. +type ChangedFile struct { + Path string + Status GitStatus + // Staged puts the file in the index group. + Staged bool +} + +// ChangesListState is a ChangesList's selection and grouping. +type ChangesListState struct { + list ui.ListState + cursor int + // rows maps rows to files; negatives are group headers. + rows []int + staged int + src *ChangedFile + n int + started bool +} + +// Selected returns the chosen file's index, or -1. +func (s *ChangesListState) Selected() int { + if s.cursor < 0 || s.cursor >= len(s.rows) { + return -1 + } + return s.rows[s.cursor] +} + +// ChangesListOptions configure a ChangesList. +type ChangesListOptions struct { + Disabled bool +} + +// ChangesList groups staged and unstaged files; give it a height. +func ChangesList(c *ui.Context, s *ChangesListState, files []ChangedFile, opts ChangesListOptions) GitListResult { + if !s.started { + s.started, s.cursor = true, -1 + } + var first *ChangedFile + if len(files) > 0 { + first = &files[0] + } + if first != s.src || len(files) != s.n { + s.rows, s.staged = changesListRows(files) + s.src, s.n, s.cursor = first, len(files), -1 + slog.Debug("mujica: changes list regroup", "files", len(files), "staged", s.staged) + } + k := Tokens(c) + var r GitListResult + s.list.Selected = &s.cursor + s.list.Header = func(i int) bool { return s.rows[i] < 0 } + s.list.Key = func(i int) any { + if f := s.rows[i]; f >= 0 { + return fmt.Sprint(files[f].Staged, files[f].Path) + } + return s.rows[i] + } + s.list.Label = func(i int) string { + if f := s.rows[i]; f >= 0 { + return files[f].Path + } + return "" + } + prev := s.cursor + outer := ui.Column(c).AlignItems(ui.Stretch).Disabled(opts.Disabled) + var e *ui.Element + outer.Children(func() { + restore := dataSelectTheme(c, 0) + defer restore() + e = ui.List(c, &s.list, len(s.rows), func(i int) { changesListRow(c, s, files, i, &r) }) + e.Grow(1).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius) + }) + r.Element, r.changed, r.submitted = outer, e.Changed(), e.Submitted() + if outer.IsDisabled() { + s.cursor, r.changed, r.submitted, r.action, r.item = prev, false, false, "", "" + } + if r.action != "" { + slog.Debug("mujica: changes list action", "action", r.action, "path", r.item) + } + return r +} + +// changesListRow builds row i: a header or a file. +func changesListRow(c *ui.Context, s *ChangesListState, files []ChangedFile, i int, r *GitListResult) { + k := Tokens(c) + d := Density(c) + u := d.Unit() + f := s.rows[i] + row := ui.Row(c).AlignItems(ui.Center).Gap(u*2).MinHeight(d.ControlHeight()).Padding(0, u*2, 0, u*3) + if f < 0 { + key, all, icon, count := "changes_list.staged", "unstage_all", "minus", s.staged + if f == -2 { + key, all, icon, count = "changes_list.unstaged", "stage_all", "plus", len(files)-s.staged + } + row.Background(k.Background).Children(func() { + ui.Text(c, fmt.Sprintf(msg(c, key), count)).Font(theme.SerifFont).FontWeight(600). + FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.Ornament.Mix(k.Text, 0.35)).Grow(1) + b := iconAction(c, icons.Must(icon), msg(c, "changes_list."+all)).Disabled(count == 0) + if b.Tooltip(msg(c, "changes_list."+all)).Clicked() && !b.IsDisabled() { + r.action = all + } + }) + return + } + cf := files[f] + if s.cursor == i { + row.Draw(func(p *ui.Painter, rc ui.Rect) { + p.Fill(ui.Rect{X: rc.X, Y: rc.Y + 4, W: 3, H: rc.H - 8}, k.AccentText, 1.5) + }) + } + row.Children(func() { + GitStatusBadge(c, cf.Status, GitStatusBadgeOptions{}) + dir := path.Dir(cf.Path) + ui.Text(c, path.Base(cf.Path)).SingleLine().Shrink(0).MaxWidth(240) + if dir != "." { + ui.Text(c, dir).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).SingleLine().MinWidth(0) + } + ui.Spacer(c) + id, icon := "stage", "plus" + if cf.Staged { + id, icon = "unstage", "minus" + } + b := iconAction(c, icons.Must(icon), msg(c, "changes_list."+id)+" "+cf.Path).Tooltip(msg(c, "changes_list."+id)) + if b.Clicked() && !b.IsDisabled() { + r.action, r.item = id, cf.Path + } + }) +} + +// changesListRows orders staged files, then unstaged, each under a header. +func changesListRows(files []ChangedFile) ([]int, int) { + rows := []int{-1} + for i, f := range files { + if f.Path == "" { + panic("mujica: ChangedFile needs a Path") + } + gitStatusIndex(f.Status) + if f.Staged { + rows = append(rows, i) + } + } + staged := len(rows) - 1 + rows = append(rows, -2) + for i, f := range files { + if !f.Staged { + rows = append(rows, i) + } + } + return rows, staged +} diff --git a/changes_list_test.go b/changes_list_test.go new file mode 100644 index 0000000..0cf540d --- /dev/null +++ b/changes_list_test.go @@ -0,0 +1,95 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func changesSample() []ChangedFile { + return []ChangedFile{ + {Path: "commit_graph.go", Status: GitAdded, Staged: true}, + {Path: "internal/git.go", Status: GitModified}, + {Path: "docs/old.md", Status: GitDeleted}, + {Path: "notes.txt", Status: GitUntracked}, + } +} + +func TestChangesListGroupsAndStage(t *testing.T) { + var s ChangesListState + files := changesSample() + var acted [][2]string + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ChangesList(c, &s, files, ChangesListOptions{}) + r.Element.Height(320) + if a, item, ok := r.Action(); ok { + acted = append(acted, [2]string{a, item}) + } + }, 600, 360) + if !tt.HasText("Staged changes (1)") || !tt.HasText("Changes (3)") { + t.Fatalf("groups: %q", tt.Texts()) + } + for _, name := range []string{"Stage internal/git.go", "Unstage commit_graph.go", "Stage all", "Unstage all"} { + if err := tt.Click(name); err != nil { + t.Fatal(err) + } + } + want := [][2]string{{"stage", "internal/git.go"}, {"unstage", "commit_graph.go"}, {"stage_all", ""}, {"unstage_all", ""}} + for i := range want { + if i >= len(acted) || acted[i] != want[i] { + t.Fatalf("actions %q, want %q", acted, want) + } + } + if err := tt.Click("old.md"); err != nil { + t.Fatal(err) + } + if got := s.Selected(); got != 2 { + t.Fatalf("selected %d, want 2", got) + } + tt.Key(0, ui.KeyDown) + if got := s.Selected(); got != 3 { + t.Fatalf("Down selected %d", got) + } +} + +func TestChangesListDisabledAndEmptyGroups(t *testing.T) { + var s ChangesListState + files := []ChangedFile{{Path: "a.go", Status: GitModified}} + acted := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ChangesList(c, &s, files, ChangesListOptions{Disabled: true}) + r.Element.Height(200) + _, _, ok := r.Action() + acted = acted || ok || r.Changed() + }, 500, 240) + if !tt.HasText("Staged changes (0)") { + t.Fatalf("empty group: %q", tt.Texts()) + } + _ = tt.Click("Stage a.go") + _ = tt.Click("a.go") + if acted || s.Selected() != -1 { + t.Fatal("disabled list acted") + } + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + var s ChangesListState + ChangesList(c, &s, []ChangedFile{{Status: GitAdded}}, ChangesListOptions{}) + }, 300, 100, 1) +} + +func TestChangesListSnapshot(t *testing.T) { + files := changesSample() + snapshot(t, "changes_list", 520, 300, func(c *ui.Context) { + s := ui.Local(c.Root(), "changes", func() *ChangesListState { return &ChangesListState{} }) + ui.Column(c).Padding(16).Children(func() { + ChangesList(c, *s, files, ChangesListOptions{}).Element.Height(260) + }) + }) +} diff --git a/command_block.go b/command_block.go new file mode 100644 index 0000000..194e807 --- /dev/null +++ b/command_block.go @@ -0,0 +1,158 @@ +package mujica + +import ( + "fmt" + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// CommandRun is a command and its output from the caller. +type CommandRun struct { + Command string + // Output may hold ANSI escapes. + Output string + ExitCode int + Duration time.Duration + // Running hides ExitCode and Duration behind a live mark. + Running bool +} + +// CommandBlockOptions configure a CommandBlock. +type CommandBlockOptions struct { + // Prompt precedes the command; empty means "$". + Prompt string + // MaxOutputHeight scrolls longer output; zero means 320 DIPs. + MaxOutputHeight float32 +} + +// CommandBlockResult is a built CommandBlock and its events. +type CommandBlockResult struct { + Element *ui.Element + toggled bool + copied string +} + +// Toggled reports the output was shown or hidden this frame. +func (r CommandBlockResult) Toggled() bool { return r.toggled } + +// Copied returns "command" or "output" when copied. +func (r CommandBlockResult) Copied() (string, bool) { return r.copied, r.copied != "" } + +// CommandBlock shows a command run; *open shows its output. +func CommandBlock(c *ui.Context, run CommandRun, open *bool, opts CommandBlockOptions) CommandBlockResult { + if run.Command == "" { + panic("mujica: CommandBlock needs a Command") + } + if run.Duration < 0 || opts.MaxOutputHeight < 0 { + panic("mujica: CommandBlock Duration and MaxOutputHeight must not be negative") + } + prompt := opts.Prompt + if prompt == "" { + prompt = "$" + } + maxH := opts.MaxOutputHeight + if maxH == 0 { + maxH = 320 + } + k := Tokens(c) + d := Density(c) + u := d.Unit() + box := ui.Column(c).AlignItems(ui.Stretch).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.CardRadius).Clip() + res := CommandBlockResult{Element: box} + box.Children(func() { + ui.Row(c).AlignItems(ui.Center).Gap(u).Padding(0, u*2, 0, 0).MinHeight(d.ControlHeight()).Children(func() { + was := *open + tr := ui.CollapsibleBase(c, open).Trigger + if box.IsDisabled() { + *open = was + } + if *open != was { + res.toggled = true + slog.Debug("mujica: command block toggle", "open", *open) + } + tr.Grow(1).MinWidth(0).MinHeight(d.ControlHeight()).AlignItems(ui.Center).Gap(u*2).Padding(0, u*3). + Radius(theme.ControlRadius).Label(prompt + " " + run.Command).Cursor(ui.CursorPointer) + internal.Ring(tr, k.Focus, theme.ControlRadius) + if tr.Hovered() { + tr.Background(k.SurfaceHover) + } + tr.Transition(colorFade) + turn := tr.Animate("mujica.turn", commandBlockTurn(*open), Motion(c, theme.StateDuration)) + tr.Children(func() { + ui.Icon(c, icons.Must("chevron-right")).Size(14, 14).Shrink(0).Rotate(turn).TextColor(k.TextMuted) + ui.Text(c, prompt).Font(theme.MonoFont).TextColor(k.Ornament.Mix(k.Text, 0.35)).Shrink(0) + spans, _ := internal.CodeSpans(k, "shell", run.Command, false) + ui.RichText(c, spans...).Font(theme.MonoFont).SingleLine().MinWidth(0) + }) + commandBlockStatus(c, run) + if iconAction(c, icons.Must("copy"), msg(c, "command_block.copy_command")).Clicked() && !box.IsDisabled() { + c.WriteClipboard(run.Command) + res.copied = "command" + } + if iconAction(c, icons.Must("file-text"), msg(c, "command_block.copy_output")).Disabled(run.Output == "").Clicked() && !box.IsDisabled() { + c.WriteClipboard(internal.StripAnsi(run.Output)) + res.copied = "output" + } + }) + if *open { + ui.Box(c).Height(1).Background(k.Border).Role(ui.RoleNone) + out := ui.ScrollBoth(c).MaxHeight(maxH).Padding(u*3, u*4).Background(k.Background).Label(msg(c, "command_block.output")) + out.Children(func() { + if run.Output == "" { + ui.Text(c, msg(c, "command_block.no_output")).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)) + return + } + AnsiText(c, run.Output, AnsiTextOptions{}) + }) + } + }) + if res.copied != "" { + slog.Debug("mujica: command block copy", "what", res.copied) + } + return res +} + +// commandBlockStatus shows running, success or failure with icon and words. +func commandBlockStatus(c *ui.Context, run CommandRun) { + k := Tokens(c) + u := Density(c).Unit() + ui.Row(c).AlignItems(ui.Center).Gap(u * 1.5).Shrink(0).FontSize(FontSize(c, theme.CaptionSize)).Children(func() { + if run.Running { + Spinner(c, SpinnerOptions{Label: msg(c, "command_block.running"), ShowLabel: true, Size: 12}) + return + } + icon, col := "circle-check", k.Success + if run.ExitCode != 0 { + icon, col = "circle-x", k.Danger + } + ui.Row(c).Gap(u).AlignItems(ui.Center).TextColor(col).Children(func() { + ui.Icon(c, icons.Must(icon)).Size(14, 14) + ui.Text(c, fmt.Sprintf(msg(c, "command_block.exit"), run.ExitCode)).FontFeatures("tnum").SingleLine() + }) + ui.Text(c, commandBlockDuration(run.Duration)).TextColor(k.TextMuted).FontFeatures("tnum").SingleLine() + }) +} + +func commandBlockTurn(open bool) float32 { + if open { + return 90 + } + return 0 +} + +// commandBlockDuration prints milliseconds, seconds or minutes. +func commandBlockDuration(d time.Duration) string { + if d < time.Second { + return fmt.Sprintf("%d ms", d.Milliseconds()) + } + if d < time.Minute { + return fmt.Sprintf("%.1f s", d.Seconds()) + } + return fmt.Sprintf("%dm %02ds", int(d.Minutes()), int(d.Seconds())%60) +} diff --git a/command_block_test.go b/command_block_test.go new file mode 100644 index 0000000..589b857 --- /dev/null +++ b/command_block_test.go @@ -0,0 +1,105 @@ +package mujica + +import ( + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func commandBlockSample() CommandRun { + return CommandRun{Command: "go test ./...", Output: "\x1b[32mok\x1b[0m mujicaui 3.2s", ExitCode: 0, Duration: 3200 * time.Millisecond} +} + +func TestCommandBlockToggleAndCopy(t *testing.T) { + open, toggles := false, 0 + var copied []string + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := CommandBlock(c, commandBlockSample(), &open, CommandBlockOptions{}) + if r.Toggled() { + toggles++ + } + if w, ok := r.Copied(); ok { + copied = append(copied, w) + } + }, 600, 300) + if tt.HasText("mujicaui 3.2s") { + t.Fatal("closed block shows output") + } + if !tt.HasText("exit 0") || !tt.HasText("3.2 s") { + t.Fatalf("status: %q", tt.Texts()) + } + if err := tt.Click("$ go test ./..."); err != nil { + t.Fatal(err) + } + if !open || toggles != 1 || !tt.HasText("ok mujicaui 3.2s") { + t.Fatalf("open %v toggles %d texts %q", open, toggles, tt.Texts()) + } + tt.Key(0, ui.KeyEnter) + if open || toggles != 2 { + t.Fatalf("Enter on the focused header: open %v toggles %d", open, toggles) + } + _ = tt.Click("Copy command") + if tt.Clipboard() != "go test ./..." { + t.Fatalf("clipboard %q", tt.Clipboard()) + } + _ = tt.Click("Copy output") + if tt.Clipboard() != "ok mujicaui 3.2s" || len(copied) != 2 || copied[1] != "output" { + t.Fatalf("output copy %q %q", tt.Clipboard(), copied) + } +} + +func TestCommandBlockFailureRunningDisabled(t *testing.T) { + open := true + run := CommandRun{Command: "make", Output: "boom", ExitCode: 2, Duration: 90 * time.Second} + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + CommandBlock(c, run, &open, CommandBlockOptions{Prompt: "❯"}) + }) + }, 600, 300) + if !tt.HasText("exit 2") || !tt.HasText("1m 30s") { + t.Fatalf("failure: %q", tt.Texts()) + } + run.Running = true + tt.Frame() + if !tt.HasText("Running") || tt.HasText("exit 2") { + t.Fatalf("running: %q", tt.Texts()) + } + disabled = true + tt.Frame() + _ = tt.Click("❯ make") + _ = tt.Click("Copy command") + if !open || tt.Clipboard() != "" { + t.Fatalf("disabled block acted: open %v clipboard %q", open, tt.Clipboard()) + } +} + +func TestCommandBlockInvalid(t *testing.T) { + for _, run := range []CommandRun{{}, {Command: "x", Duration: -1}} { + func() { + defer func() { + if recover() == nil { + t.Errorf("%+v did not panic", run) + } + }() + open := false + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + CommandBlock(c, run, &open, CommandBlockOptions{}) + }, 100, 50, 1) + }() + } +} + +func TestCommandBlockSnapshot(t *testing.T) { + snapshot(t, "command_block", 620, 300, func(c *ui.Context) { + a, b := true, false + ui.Column(c).Padding(16).Gap(12).Children(func() { + CommandBlock(c, CommandRun{Command: "go test -run Git ./...", Output: "\x1b[32mok\x1b[0m \tmujicaui\t3.214s\n\x1b[33mwarn\x1b[0m slow test: TestCommitGraphVirtualized", Duration: 3214 * time.Millisecond}, &a, CommandBlockOptions{}) + CommandBlock(c, CommandRun{Command: "git push origin main", ExitCode: 1, Duration: 640 * time.Millisecond, Output: "rejected"}, &b, CommandBlockOptions{}) + }) + }) +} diff --git a/commit_graph.go b/commit_graph.go new file mode 100644 index 0000000..1bb1bde --- /dev/null +++ b/commit_graph.go @@ -0,0 +1,204 @@ +package mujica + +import ( + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// CommitGraphState is a CommitGraph's selection and its lane layout. +type CommitGraphState struct { + List ListState[string] + rows []commitGraphRow + // lanes is the widest the graph gets. + lanes int + src *Commit + n int +} + +// CommitGraphOptions configure a CommitGraph. +type CommitGraphOptions struct { + // TimeFormat lays out commit times; empty means "2006-01-02 15:04". + TimeFormat string + // MaxLanes caps the graph width in lanes; zero means 8. + MaxLanes int + Status DataStatus + Error string +} + +// commitGraphLink joins lane from to lane to within a row. +type commitGraphLink struct{ from, to, color int } + +type commitGraphRow struct { + node, color int + merge bool + // top links enter from above; bottom links leave the node. + top, bottom []commitGraphLink +} + +type commitGraphLane struct { + hash string + color int +} + +// CommitGraph shows commits with branch lanes; give it a height. +func CommitGraph(c *ui.Context, s *CommitGraphState, commits []Commit, opts CommitGraphOptions) GitListResult { + maxLanes := opts.MaxLanes + if maxLanes == 0 { + maxLanes = 8 + } + if maxLanes < 0 { + panic("mujica: CommitGraph MaxLanes is negative") + } + var first *Commit + if len(commits) > 0 { + first = &commits[0] + } + if first != s.src || len(commits) != s.n { + s.rows, s.lanes = commitGraphLayout(commits) + s.src, s.n = first, len(commits) + slog.Debug("mujica: commit graph layout", "commits", len(commits), "lanes", s.lanes) + } + layout := gitTimeLayout(opts.TimeFormat) + lane := Density(c).Unit() * 4 + width := float32(min(max(s.lanes, 1), maxLanes)) * lane + h := Density(c).ControlHeight() + v := List(c, &s.List, len(commits), ListOptions[string]{ + Key: func(i int) string { return gitCommitHash(commits[i]) }, + Label: func(i int) string { return commits[i].Subject }, + Status: opts.Status, Error: opts.Error, Empty: msg(c, "commit_list.empty"), + }, func(i int) { + row := s.rows[i] + ui.Box(c).Size(width, h).Shrink(0).Clip().Role(ui.RoleNone).Draw(func(p *ui.Painter, r ui.Rect) { + commitGraphDraw(p, Tokens(c), r, row, lane) + }) + commitListRow(c, commits[i], layout) + }) + res := GitListResult{Element: v.Element, changed: v.Changed(), submitted: v.Submitted()} + if res.changed || res.submitted { + key, _ := s.List.Selected() + slog.Debug("mujica: commit graph choose", "hash", key, "open", res.submitted) + } + return res +} + +// commitGraphLayout gives each commit a lane and parent links. +func commitGraphLayout(commits []Commit) ([]commitGraphRow, int) { + rows := make([]commitGraphRow, len(commits)) + var lanes []commitGraphLane + colors, widest := 0, 0 + free := func() int { + for j, l := range lanes { + if l.hash == "" { + return j + } + } + lanes = append(lanes, commitGraphLane{}) + return len(lanes) - 1 + } + for i, cm := range commits { + h := gitCommitHash(cm) + var row commitGraphRow + row.node = -1 + for j, l := range lanes { + if l.hash == h && row.node < 0 { + row.node = j + } + } + for j, l := range lanes { + switch { + case l.hash == "": + case l.hash == h: + row.top = append(row.top, commitGraphLink{j, row.node, l.color}) + default: + row.top = append(row.top, commitGraphLink{j, j, l.color}) + } + } + if row.node < 0 { + row.node = free() + lanes[row.node] = commitGraphLane{h, colors % 6} + colors++ + } + row.color = lanes[row.node].color + for j := range lanes { + if lanes[j].hash == h { + lanes[j].hash = "" + } + } + row.merge = len(cm.Parents) > 1 + for pi, p := range cm.Parents { + if pi == 0 { + lanes[row.node] = commitGraphLane{p, row.color} + row.bottom = append(row.bottom, commitGraphLink{row.node, row.node, row.color}) + continue + } + to := -1 + for j, l := range lanes { + if l.hash == p { + to = j + break + } + } + if to < 0 { + to = free() + lanes[to] = commitGraphLane{p, colors % 6} + colors++ + } + row.bottom = append(row.bottom, commitGraphLink{row.node, to, lanes[to].color}) + } + for len(lanes) > 0 && lanes[len(lanes)-1].hash == "" { + lanes = lanes[:len(lanes)-1] + } + widest = max(widest, len(lanes), row.node+1) + rows[i] = row + } + return rows, widest +} + +// commitGraphColors are the lane colors; place also tells lanes apart. +func commitGraphColors(k theme.Tokens) [6]ui.Color { + return [6]ui.Color{k.AccentText, k.Info, k.Success, k.Warning, k.Danger, k.TextMuted} +} + +func commitGraphDraw(p *ui.Painter, k theme.Tokens, r ui.Rect, row commitGraphRow, lane float32) { + cols := commitGraphColors(k) + x := func(j int) float32 { return internal.Snap(p, r.X+lane/2+float32(j)*lane) } + top, mid, bot := internal.Snap(p, r.Y), internal.Snap(p, r.Y+r.H/2), internal.Snap(p, r.Y+r.H) + seg := func(l commitGraphLink, y0, y1 float32) { + var path ui.Path + xa, xb := x(l.from), x(l.to) + path.MoveTo(xa, y0) + if xa == xb { + path.LineTo(xb, y1) + } else { + m := (y0 + y1) / 2 + path.CubeTo(xa, m, xb, m, xb, y1) + } + p.StrokePath(&path, 2, cols[l.color]) + } + for _, l := range row.top { + if l.from == l.to && l.to != row.node { + seg(l, top, bot) + continue + } + seg(l, top, mid) + } + for _, l := range row.bottom { + seg(l, mid, bot) + } + cx, col := x(row.node), cols[row.color] + if row.merge { + p.FillPath(internal.Diamond(cx, mid, 11), k.Surface) + p.StrokePath(internal.Diamond(cx, mid, 9), 2, col) + return + } + var dot ui.Path + dot.Circle(cx, mid, 5.5) + p.FillPath(&dot, k.Surface) + var ring ui.Path + ring.Circle(cx, mid, 4) + p.FillPath(&ring, col) +} diff --git a/commit_graph_test.go b/commit_graph_test.go new file mode 100644 index 0000000..2945268 --- /dev/null +++ b/commit_graph_test.go @@ -0,0 +1,98 @@ +package mujica + +import ( + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +// commitGraphSample is main with a feature branch merged back. +func commitGraphSample() []Commit { + cs := []Commit{ + {Hash: "m3", Parents: []string{"m2", "f2"}, Subject: "Merge feature", Refs: []string{"main"}}, + {Hash: "f2", Parents: []string{"f1"}, Subject: "Feature work"}, + {Hash: "m2", Parents: []string{"m1"}, Subject: "Fix on main"}, + {Hash: "f1", Parents: []string{"m1"}, Subject: "Start feature"}, + {Hash: "m1", Subject: "Initial commit"}, + } + for i := range cs { + cs[i].Author = []string{"Sakiko", "Mutsumi", "Uika"}[i%3] + cs[i].When = gitTestTime.Add(-time.Duration(i) * 3 * time.Hour) + } + return cs +} + +func TestCommitGraphLayoutLanes(t *testing.T) { + rows, lanes := commitGraphLayout(commitGraphSample()) + if lanes != 2 { + t.Fatalf("lanes %d, want 2", lanes) + } + want := []struct { + node int + merge bool + }{{0, true}, {1, false}, {0, false}, {1, false}, {0, false}} + for i, w := range want { + if rows[i].node != w.node || rows[i].merge != w.merge { + t.Errorf("row %d: node %d merge %v, want %+v", i, rows[i].node, rows[i].merge, w) + } + } + // The merge sends a line to the feature lane; f1 joins main again at m1. + if l := rows[0].bottom; len(l) != 2 || l[1].from != 0 || l[1].to != 1 { + t.Errorf("merge links %+v", l) + } + if l := rows[4].top; len(l) != 2 || l[1].from != 1 || l[1].to != 0 { + t.Errorf("fork point links %+v", l) + } +} + +func TestCommitGraphVirtualized(t *testing.T) { + commits := gitHistory(100000) + var s CommitGraphState + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CommitGraph(c, &s, commits, CommitGraphOptions{}).Element.Height(400) + }, 700, 440) + if n := len(tt.Texts()); n > 400 { + t.Fatalf("%d texts built for 100,000 commits", n) + } + rows := &s.rows[0] + tt.Scroll(300, 200, 0, 50000) + tt.Frame() + if &s.rows[0] != rows { + t.Fatal("layout recomputed without a data change") + } + if tt.HasText("Commit number 100000") { + t.Fatal("scroll did not move the window of rows") + } +} + +func TestCommitGraphChooseAndKeys(t *testing.T) { + var s CommitGraphState + changes := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := CommitGraph(c, &s, commitGraphSample(), CommitGraphOptions{}) + r.Element.Height(300) + if r.Changed() { + changes++ + } + }, 700, 400) + if err := tt.Click("Fix on main"); err != nil { + t.Fatal(err) + } + tt.Key(0, ui.KeyDown) + if key, _ := s.List.Selected(); key != "f1" || changes != 2 { + t.Fatalf("selected %q changes %d", key, changes) + } +} + +func TestCommitGraphSnapshot(t *testing.T) { + commits := commitGraphSample() + snapshot(t, "commit_graph", 640, 240, func(c *ui.Context) { + s := ui.Local(c.Root(), "graph", func() *CommitGraphState { return &CommitGraphState{} }) + ui.Column(c).Padding(16).Children(func() { + CommitGraph(c, *s, commits, CommitGraphOptions{}).Element.Height(200) + }) + }) +} diff --git a/commit_input.go b/commit_input.go new file mode 100644 index 0000000..4ec91fe --- /dev/null +++ b/commit_input.go @@ -0,0 +1,106 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strings" + "unicode/utf8" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// CommitMessage is a commit's title and body. +type CommitMessage struct { + Title string + Body string +} + +// CommitInputOptions configure a CommitInput. +type CommitInputOptions struct { + // TitleLimit warns past this many title characters; zero means 50. + TitleLimit int + // Busy shows a commit in progress and blocks another. + Busy bool + Disabled bool +} + +// CommitInputResult is a built CommitInput and its events. +type CommitInputResult struct { + Element *ui.Element + committed, amend bool +} + +// Committed reports Commit, or Cmd+Enter, this frame. +func (r CommitInputResult) Committed() bool { return r.committed } + +// Amended reports Amend this frame. +func (r CommitInputResult) Amended() bool { return r.amend } + +type commitInputState struct { + // pending blocks commits until Busy comes and goes. + pending, sawBusy bool +} + +// CommitInput edits a commit message and commits or amends once. +func CommitInput(c *ui.Context, m *CommitMessage, opts CommitInputOptions) CommitInputResult { + limit := opts.TitleLimit + if limit == 0 { + limit = 50 + } + if limit < 0 { + panic("mujica: CommitInput TitleLimit is negative") + } + k := Tokens(c) + u := Density(c).Unit() + col := ui.Column(c).AlignItems(ui.Stretch).Gap(u * 2).Disabled(opts.Disabled) + res := CommitInputResult{Element: col} + st := ui.Local(col, "state", func() *commitInputState { return &commitInputState{} }) + s := *st + if opts.Busy { + s.sawBusy = true + } else if s.sawBusy { + s.pending, s.sawBusy = false, false + } + blocked := opts.Busy || s.pending + n := utf8.RuneCountInString(m.Title) + col.Children(func() { + title := TextInput(c, &m.Title, TextInputOptions{Placeholder: msg(c, "commit_input.title"), Label: msg(c, "commit_input.title"), + Disabled: opts.Disabled, ReadOnly: blocked, + Trailing: func() { + col := k.TextMuted + if n > limit { + col = k.Warning + } + name := fmt.Sprintf(msg(c, "commit_input.count"), n, limit) + if n > limit { + name = fmt.Sprintf(msg(c, "commit_input.long"), n-limit) + } + ui.Text(c, fmt.Sprintf("%d/%d", n, limit)).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum").TextColor(col).Shrink(0). + Label(name).Tooltip(name) + }}) + body := TextArea(c, &m.Body, TextAreaOptions{Placeholder: msg(c, "commit_input.body"), Label: msg(c, "commit_input.body"), + MinHeight: 72, MaxHeight: 200, Disabled: opts.Disabled, ReadOnly: blocked}) + empty := strings.TrimSpace(m.Title) == "" + send := (title.Submitted() || body.Submitted()) && !empty + ui.Row(c).Gap(u * 2).Justify(ui.End).Children(func() { + if Button(c, msg(c, "commit_input.amend"), ButtonOptions{Variant: Secondary, Icon: icons.Must("rotate-ccw"), Disabled: blocked || empty}).Clicked() { + res.amend = true + } + if Button(c, msg(c, "commit_input.commit"), ButtonOptions{Icon: icons.Must("check"), Loading: opts.Busy, Disabled: s.pending || empty}).Clicked() { + send = true + } + }) + res.committed = send && !res.amend + }) + if blocked || col.IsDisabled() { + res.committed, res.amend = false, false + } + if res.committed || res.amend { + s.pending = true + slog.Debug("mujica: commit input submit", "amend", res.amend) + } + return res +} diff --git a/commit_input_test.go b/commit_input_test.go new file mode 100644 index 0000000..ae70439 --- /dev/null +++ b/commit_input_test.go @@ -0,0 +1,101 @@ +package mujica + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestCommitInputCommitOnceWhileBusy(t *testing.T) { + m := CommitMessage{} + busy := false + commits, amends := 0, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := CommitInput(c, &m, CommitInputOptions{Busy: busy}) + if r.Committed() { + commits++ + } + if r.Amended() { + amends++ + } + }, 600, 400) + _ = tt.Click("Commit") + if commits != 0 { + t.Fatal("empty title committed") + } + if err := tt.Click("Summary"); err != nil { + t.Fatal(err) + } + tt.Type("Add git components") + tt.Key(0, ui.KeyEnter) + _ = tt.Click("Commit") + if commits != 1 { + t.Fatalf("commits %d, want 1 before Busy clears", commits) + } + busy = true + tt.Frame() + _ = tt.Click("Commit") + _ = tt.Click("Amend") + busy = false + tt.Frame() + if commits != 1 || amends != 0 { + t.Fatalf("busy: commits %d amends %d", commits, amends) + } + _ = tt.Click("Amend") + if amends != 1 { + t.Fatalf("amends %d", amends) + } +} + +func TestCommitInputTitleHint(t *testing.T) { + m := CommitMessage{Title: strings.Repeat("x", 55)} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CommitInput(c, &m, CommitInputOptions{}) + }, 600, 400) + if _, ok := tt.Find("Summary is 5 characters over the suggested length"); !ok { + t.Fatal("over-length hint not named") + } + m.Title = "short" + tt.Frame() + if _, ok := tt.Find("5 of 50 characters"); !ok { + t.Fatal("count not named") + } +} + +func TestCommitInputDisabledAndInvalid(t *testing.T) { + m := CommitMessage{Title: "x"} + acted := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := CommitInput(c, &m, CommitInputOptions{Disabled: true}) + acted = acted || r.Committed() || r.Amended() + }, 600, 400) + _ = tt.Click("Commit") + _ = tt.Click("Amend") + if acted { + t.Fatal("disabled input committed") + } + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + CommitInput(c, &m, CommitInputOptions{TitleLimit: -1}) + }, 300, 100, 1) +} + +func TestCommitInputSnapshot(t *testing.T) { + snapshot(t, "commit_input", 520, 280, func(c *ui.Context) { + m := ui.Local(c.Root(), "msg", func() CommitMessage { + return CommitMessage{Title: "Add CommitGraph lanes with merge lines", Body: "Lanes are laid out once per history."} + }) + ui.Column(c).Padding(16).Children(func() { + CommitInput(c, m, CommitInputOptions{}) + }) + }) +} diff --git a/commit_list.go b/commit_list.go new file mode 100644 index 0000000..161e7e6 --- /dev/null +++ b/commit_list.go @@ -0,0 +1,105 @@ +package mujica + +import ( + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// Commit is one commit of a history, newest first. +type Commit struct { + Hash string + Parents []string + Author string + When time.Time + Subject string + // Refs are branch and tag names pointing at the commit. + Refs []string +} + +// GitListResult is a built version-control list and its events. +type GitListResult struct { + Element *ui.Element + changed, submitted bool + action, item string +} + +// Changed reports a new selection. +func (r GitListResult) Changed() bool { return r.changed } + +// Submitted reports Enter or a double click on a row. +func (r GitListResult) Submitted() bool { return r.submitted } + +// Action returns this frame's action ID and its item. +func (r GitListResult) Action() (action, item string, ok bool) { + return r.action, r.item, r.action != "" +} + +// CommitListOptions configure a CommitList. +type CommitListOptions struct { + // TimeFormat lays out commit times; empty means "2006-01-02 15:04". + TimeFormat string + Status DataStatus + Error string +} + +// CommitList shows commits to choose from; give it a height. +func CommitList(c *ui.Context, s *ListState[string], commits []Commit, opts CommitListOptions) GitListResult { + layout := gitTimeLayout(opts.TimeFormat) + v := List(c, s, len(commits), ListOptions[string]{ + Key: func(i int) string { return gitCommitHash(commits[i]) }, + Label: func(i int) string { return commits[i].Subject }, + Status: opts.Status, Error: opts.Error, Empty: msg(c, "commit_list.empty"), + }, func(i int) { commitListRow(c, commits[i], layout) }) + r := GitListResult{Element: v.Element, changed: v.Changed(), submitted: v.Submitted()} + if r.changed || r.submitted { + key, _ := s.Selected() + slog.Debug("mujica: commit list choose", "hash", key, "open", r.submitted) + } + return r +} + +func commitListRow(c *ui.Context, cm Commit, layout string) { + k := Tokens(c) + gitRefs(c, cm.Refs) + ui.Text(c, cm.Subject).SingleLine().Grow(1).MinWidth(0) + small := FontSize(c, theme.CaptionSize) + ui.Text(c, cm.Author).FontSize(small).TextColor(k.TextMuted).SingleLine().MaxWidth(140).Shrink(0) + ui.Text(c, gitShortHash(cm.Hash)).Font(theme.MonoFont).FontSize(small).TextColor(k.AccentText).Shrink(0) + ui.Text(c, cm.When.Format(layout)).FontSize(small).FontFeatures("tnum").TextColor(k.TextMuted).Shrink(0) +} + +// gitRefs shows branch and tag names as small outlined pills. +func gitRefs(c *ui.Context, refs []string) { + k := Tokens(c) + u := Density(c).Unit() + for _, ref := range refs { + ui.Text(c, ref).FontSize(FontSize(c, theme.CaptionSize)).FontWeight(600).TextColor(k.AccentText).SingleLine(). + Padding(0, u*1.5).Radius(theme.ControlRadius).Border(theme.BorderWidth, k.AccentText).Shrink(0).MaxWidth(160) + } +} + +func gitCommitHash(cm Commit) string { + if cm.Hash == "" { + panic("mujica: Commit needs a Hash") + } + return cm.Hash +} + +// gitShortHash is the first seven characters of a hash. +func gitShortHash(h string) string { + if len(h) > 7 { + return h[:7] + } + return h +} + +func gitTimeLayout(f string) string { + if f == "" { + return "2006-01-02 15:04" + } + return f +} diff --git a/commit_list_test.go b/commit_list_test.go new file mode 100644 index 0000000..1dd521f --- /dev/null +++ b/commit_list_test.go @@ -0,0 +1,91 @@ +package mujica + +import ( + "fmt" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +var gitTestTime = time.Date(2026, 10, 5, 9, 30, 0, 0, time.UTC) + +// gitTestHash is a stable, hash-like hex string for commit i. +func gitTestHash(i int) string { return fmt.Sprintf("%016x%024x", uint64(i)*0x9E3779B97F4A7C15, i) } + +// gitHistory is a linear history of n commits, newest first. +func gitHistory(n int) []Commit { + out := make([]Commit, n) + for i := range out { + out[i] = Commit{Hash: gitTestHash(n - i), Author: "Sakiko", When: gitTestTime.Add(-time.Duration(i) * time.Hour), + Subject: fmt.Sprintf("Commit number %d", n-i)} + if i+1 < n { + out[i].Parents = []string{gitTestHash(n - i - 1)} + } + } + return out +} + +func TestCommitListChooseAndOpen(t *testing.T) { + commits := gitHistory(5) + commits[0].Refs = []string{"main"} + var s ListState[string] + changes, opens := 0, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := CommitList(c, &s, commits, CommitListOptions{}) + r.Element.Height(300) + if r.Changed() { + changes++ + } + if r.Submitted() { + opens++ + } + }, 700, 340) + if !tt.HasText("main") || !tt.HasText("1715609") || !tt.HasText("2026-10-05 09:30") { + t.Fatalf("row parts: %q", tt.Texts()) + } + if err := tt.Click("Commit number 3"); err != nil { + t.Fatal(err) + } + if key, _ := s.Selected(); key != commits[2].Hash || changes != 1 { + t.Fatalf("selected %q changes %d", key, changes) + } + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + if key, _ := s.Selected(); key != commits[3].Hash || opens != 1 { + t.Fatalf("keyboard: %q opens %d", key, opens) + } +} + +func TestCommitListEmptyAndInvalid(t *testing.T) { + var s ListState[string] + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CommitList(c, &s, nil, CommitListOptions{}) + }, 400, 200) + if !tt.HasText("No commits") { + t.Fatalf("empty: %q", tt.Texts()) + } + defer func() { + if recover() == nil { + t.Fatal("hashless commit did not panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + var s ListState[string] + CommitList(c, &s, []Commit{{Subject: "x"}}, CommitListOptions{}) + }, 300, 100, 1) +} + +func TestCommitListSnapshot(t *testing.T) { + commits := gitHistory(4) + commits[0].Refs = []string{"main", "v1.1"} + snapshot(t, "commit_list", 640, 220, func(c *ui.Context) { + s := ui.Local(c.Root(), "list", func() *ListState[string] { return &ListState[string]{} }) + ui.Column(c).Padding(16).Children(func() { + CommitList(c, *s, commits, CommitListOptions{}).Element.Height(180) + }) + }) +} diff --git a/conflict_resolver.go b/conflict_resolver.go new file mode 100644 index 0000000..9806b4e --- /dev/null +++ b/conflict_resolver.go @@ -0,0 +1,220 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// ConflictResolverState holds conflict blocks and their choices. +type ConflictResolverState struct { + text string + parts []conflictPart + choices []MergeChoice + bad int + built bool +} + +// conflictPart is plain text or a conflict block. +type conflictPart struct { + lines []string + ours, theirs []string + oursRef, theirsRef string + line int + conflict bool +} + +// Resolved returns chosen blocks and all blocks. +func (s *ConflictResolverState) Resolved() (done, total int) { + for i, p := range s.parts { + if p.conflict { + total++ + if s.choices[i] != MergeUnresolved { + done++ + } + } + } + return done, total +} + +// Result applies the choices; unresolved blocks keep markers. +func (s *ConflictResolverState) Result() string { + var out []string + for i, p := range s.parts { + if !p.conflict { + out = append(out, p.lines...) + continue + } + switch s.choices[i] { + case MergeOurs: + out = append(out, p.ours...) + case MergeTheirs: + out = append(out, p.theirs...) + case MergeBoth: + out = append(append(out, p.ours...), p.theirs...) + default: + out = append(out, p.lines...) + } + } + return strings.Join(out, "\n") +} + +// ConflictResolverOptions configure a ConflictResolver. +type ConflictResolverOptions struct { + Disabled bool +} + +// ConflictResolver resolves the git conflict blocks of text. +func ConflictResolver(c *ui.Context, s *ConflictResolverState, text string, opts ConflictResolverOptions) ChoiceResult { + if !s.built || s.text != text { + s.parts, s.bad = conflictParse(internal.SplitLines(text)) + s.choices = make([]MergeChoice, len(s.parts)) + s.text, s.built = text, true + _, total := s.Resolved() + slog.Debug("mujica: conflict resolver parse", "conflicts", total, "badLine", s.bad) + } + k := Tokens(c) + u := Density(c).Unit() + col := ui.Column(c).AlignItems(ui.Stretch).Gap(u * 3).Disabled(opts.Disabled) + res := ChoiceResult{Element: col} + col.Children(func() { + done, total := s.Resolved() + ui.Row(c).AlignItems(ui.Center).Gap(u * 3).Children(func() { + ui.Text(c, fmt.Sprintf(msg(c, "conflict_resolver.resolved"), done, total)).FontWeight(600).Role(ui.RoleStatus) + if total > 0 { + ui.Box(c).Height(4).Grow(1).Radius(2).Background(k.Border).Role(ui.RoleNone).Draw(func(p *ui.Painter, r ui.Rect) { + p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W * float32(done) / float32(total), H: r.H}, k.Success, 2) + }) + } + }) + if s.bad > 0 { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).TextColor(k.Danger).Children(func() { + ui.Icon(c, icons.Must("circle-alert")).Size(16, 16) + ui.Text(c, fmt.Sprintf(msg(c, "conflict_resolver.broken"), s.bad)).Role(ui.RoleStatus) + }) + } + if total == 0 && s.bad == 0 { + ui.Text(c, msg(c, "conflict_resolver.none")).TextColor(k.TextMuted) + } + n := 0 + for i, p := range s.parts { + if !p.conflict { + continue + } + n++ + if conflictBlock(c, s, i, n) && !col.IsDisabled() { + res.changed = true + } + } + }) + return res +} + +// conflictBlock shows one conflict and its choice buttons. +func conflictBlock(c *ui.Context, s *ConflictResolverState, i, n int) bool { + k := Tokens(c) + u := Density(c).Unit() + p := s.parts[i] + choice := s.choices[i] + changed := false + card := ui.Column(c).AlignItems(ui.Stretch).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.CardRadius).Clip() + card.Children(func() { + ui.Row(c).AlignItems(ui.Center).Gap(u*2).Padding(u*2, u*3).Background(k.Background).Children(func() { + icon, colr, key := "triangle-alert", k.Warning, "conflict_resolver.open" + if choice != MergeUnresolved { + icon, colr, key = "circle-check", k.Success, "conflict_resolver.done" + } + ui.Icon(c, icons.Must(icon)).Size(14, 14).TextColor(colr) + ui.Text(c, fmt.Sprintf(msg(c, "conflict_resolver.title"), n, p.line)).Font(theme.SerifFont).FontWeight(600) + ui.Text(c, msg(c, key)).FontSize(FontSize(c, theme.CaptionSize)).TextColor(colr) + }) + ui.Grid(c).ColumnTracks(ui.Fr(1), ui.Fr(1)).Children(func() { + side := func(title, ref string, lines []string, col ui.Color, on bool) { + cell := ui.Column(c).Gap(u).Padding(u*2, u*3).MinWidth(0).Clip() + if on { + cell.Background(col.Mix(k.Surface, 0.88)) + } + cell.Children(func() { + ui.Row(c).Gap(u).AlignItems(ui.Center).Children(func() { + if on { + ui.Icon(c, icons.Must("check")).Size(14, 14).TextColor(k.AccentText) + } + ui.Text(c, title).FontSize(FontSize(c, theme.CaptionSize)).FontWeight(600).TextColor(col) + ui.Text(c, ref).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).SingleLine() + }) + mergeLines(c, lines, false) + }) + } + side(msg(c, "conflict_resolver.current"), p.oursRef, p.ours, k.Info, choice == MergeOurs || choice == MergeBoth) + side(msg(c, "conflict_resolver.incoming"), p.theirsRef, p.theirs, k.Warning, choice == MergeTheirs || choice == MergeBoth) + }) + ui.Row(c).Gap(u*2).Padding(u*2, u*3).Wrap().Children(func() { + for _, opt := range []struct { + choice MergeChoice + key string + }{{MergeOurs, "take_current"}, {MergeTheirs, "take_incoming"}, {MergeBoth, "take_both"}, {MergeUnresolved, "reset"}} { + if opt.choice == MergeUnresolved && choice == MergeUnresolved { + continue + } + if mergeChoiceButton(c, msg(c, "conflict_resolver."+opt.key), choice == opt.choice && opt.choice != MergeUnresolved).Clicked() && choice != opt.choice { + s.choices[i], changed = opt.choice, true + slog.Debug("mujica: conflict resolver choose", "block", n, "choice", opt.key) + } + } + }) + }) + return changed +} + +// conflictParse splits at markers; bad is an unclosed block's line. +func conflictParse(lines []string) (parts []conflictPart, bad int) { + var plain []string + for i := 0; i < len(lines); i++ { + if !strings.HasPrefix(lines[i], "<<<<<<<") { + plain = append(plain, lines[i]) + continue + } + start := i + p := conflictPart{conflict: true, line: i + 1, oursRef: strings.TrimSpace(lines[i][7:])} + stage, j := 0, i+1 + for ; j < len(lines); j++ { + l := lines[j] + switch { + case stage == 0 && strings.HasPrefix(l, "|||||||"): + stage = 1 + case stage < 2 && l == "=======": + stage = 2 + case stage == 2 && strings.HasPrefix(l, ">>>>>>>"): + p.theirsRef = strings.TrimSpace(l[7:]) + stage = 3 + case stage == 0: + p.ours = append(p.ours, l) + case stage == 2: + p.theirs = append(p.theirs, l) + } + if stage == 3 { + break + } + } + if stage != 3 { + return []conflictPart{{lines: lines}}, start + 1 + } + if len(plain) > 0 { + parts = append(parts, conflictPart{lines: plain}) + plain = nil + } + p.lines = lines[start : j+1] + parts = append(parts, p) + i = j + } + if len(plain) > 0 { + parts = append(parts, conflictPart{lines: plain}) + } + return parts, 0 +} diff --git a/conflict_resolver_test.go b/conflict_resolver_test.go new file mode 100644 index 0000000..9318d60 --- /dev/null +++ b/conflict_resolver_test.go @@ -0,0 +1,86 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +const conflictText = "intro\n<<<<<<< HEAD\nours one\n=======\ntheirs one\n>>>>>>> feature\nmiddle\n<<<<<<< HEAD\nours two\n||||||| base\nold two\n=======\ntheirs two\n>>>>>>> feature\nend" + +func TestConflictParse(t *testing.T) { + parts, bad := conflictParse([]string{"a", "<<<<<<< HEAD", "x", "=======", "y", ">>>>>>> br", "b"}) + if bad != 0 || len(parts) != 3 || !parts[1].conflict || parts[1].oursRef != "HEAD" || parts[1].theirsRef != "br" || parts[1].line != 2 { + t.Fatalf("parts %+v bad %d", parts, bad) + } + parts, bad = conflictParse([]string{"a", "<<<<<<< HEAD", "x", "======="}) + if bad != 2 || len(parts) != 1 || parts[0].conflict { + t.Fatalf("unclosed: %+v bad %d", parts, bad) + } +} + +func TestConflictResolverAcceptAndCount(t *testing.T) { + var s ConflictResolverState + changes := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Scroll(c).Fill().Children(func() { + if ConflictResolver(c, &s, conflictText, ConflictResolverOptions{}).Changed() { + changes++ + } + }) + }, 800, 900) + if !tt.HasText("0 of 2 conflicts resolved") || !tt.HasText("Conflict 2 · line 8") { + t.Fatalf("start: %q", tt.Texts()) + } + if err := tt.Click("Accept incoming"); err != nil { + t.Fatal(err) + } + if !tt.HasText("1 of 2 conflicts resolved") || changes != 1 { + t.Fatalf("after one: %q", tt.Texts()) + } + if err := tt.Click("Accept both"); err != nil { + t.Fatal(err) + } + if got := s.Result(); got != "intro\nours one\ntheirs one\nmiddle\n<<<<<<< HEAD\nours two\n||||||| base\nold two\n=======\ntheirs two\n>>>>>>> feature\nend" { + t.Fatalf("result %q", got) + } + if err := tt.Click("Undo"); err != nil { + t.Fatal(err) + } + if d, n := s.Resolved(); d != 0 || n != 2 || changes != 3 { + t.Fatalf("undo: %d/%d changes %d", d, n, changes) + } +} + +func TestConflictResolverBrokenAndDisabled(t *testing.T) { + var s ConflictResolverState + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ConflictResolver(c, &s, "a\n<<<<<<< HEAD\nx", ConflictResolverOptions{}) + }, 600, 300) + if !tt.HasText("Conflict markers are not closed after line 2") { + t.Fatalf("broken: %q", tt.Texts()) + } + if s.Result() != "a\n<<<<<<< HEAD\nx" { + t.Fatalf("broken result %q", s.Result()) + } + var d ConflictResolverState + tt = ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ConflictResolver(c, &d, conflictText, ConflictResolverOptions{Disabled: true}) + }, 800, 900) + _ = tt.Click("Accept current") + if done, _ := d.Resolved(); done != 0 { + t.Fatal("disabled resolver accepted") + } +} + +func TestConflictResolverSnapshot(t *testing.T) { + snapshotAfter(t, "conflict_resolver", 640, 560, func(c *ui.Context) { + s := ui.Local(c.Root(), "s", func() *ConflictResolverState { return &ConflictResolverState{} }) + ui.Column(c).Padding(16).Children(func() { + ConflictResolver(c, *s, conflictText, ConflictResolverOptions{}) + }) + }, func(tt *ui.Tester) { _ = tt.Click("Accept incoming") }) +} diff --git a/diff_stat.go b/diff_stat.go new file mode 100644 index 0000000..cba272f --- /dev/null +++ b/diff_stat.go @@ -0,0 +1,72 @@ +package mujica + +import ( + "fmt" + "math" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// DiffStatOptions configure a DiffStat. +type DiffStatOptions struct { + // Blocks is the ratio bar length; zero means 5. + Blocks int +} + +// DiffStat shows added and deleted counts with a ratio bar. +func DiffStat(c *ui.Context, added, deleted int, opts DiffStatOptions) *ui.Element { + if added < 0 || deleted < 0 { + panic("mujica: DiffStat counts must not be negative") + } + n := opts.Blocks + if n == 0 { + n = 5 + } + if n < 0 { + panic("mujica: DiffStat Blocks is negative") + } + k := Tokens(c) + u := Density(c).Unit() + plus, minus := diffStatBlocks(added, deleted, n) + row := ui.Row(c).AlignItems(ui.Center).Gap(u * 2).Shrink(0). + Label(fmt.Sprintf(msg(c, "diff_stat.label"), added, deleted)) + row.Children(func() { + mono := func(s string, col ui.Color) { + ui.Text(c, s).Font(theme.MonoFont).FontFeatures("tnum").FontSize(FontSize(c, theme.CaptionSize)).TextColor(col).SingleLine() + } + mono(fmt.Sprintf("+%d", added), k.Success) + mono(fmt.Sprintf("−%d", deleted), k.Danger) + ui.Row(c).Gap(2).Shrink(0).Role(ui.RoleNone).Children(func() { + for i := range n { + col := k.Border + switch { + case i < plus: + col = k.Success + case i < plus+minus: + col = k.Danger + } + ui.Box(c).Size(8, 8).Radius(1).Background(col) + } + }) + }) + return row +} + +// diffStatBlocks splits n blocks, one at least per nonzero side. +func diffStatBlocks(added, deleted, n int) (plus, minus int) { + total := added + deleted + if total == 0 { + return 0, 0 + } + plus = int(math.Round(float64(added) / float64(total) * float64(n))) + minus = n - plus + if added > 0 && plus == 0 { + plus, minus = 1, n-1 + } + if deleted > 0 && minus == 0 && n > 1 { + plus, minus = n-1, 1 + } + return plus, minus +} diff --git a/diff_stat_test.go b/diff_stat_test.go new file mode 100644 index 0000000..feeefc1 --- /dev/null +++ b/diff_stat_test.go @@ -0,0 +1,60 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestDiffStatBlocks(t *testing.T) { + for _, tc := range []struct{ a, d, n, plus, minus int }{ + {0, 0, 5, 0, 0}, + {10, 0, 5, 5, 0}, + {0, 3, 5, 0, 5}, + {6, 4, 5, 3, 2}, + {1000, 1, 5, 4, 1}, + {1, 1000, 5, 1, 4}, + {1, 1, 1, 1, 0}, + } { + p, m := diffStatBlocks(tc.a, tc.d, tc.n) + if p != tc.plus || m != tc.minus { + t.Errorf("blocks(%d,%d,%d) = %d,%d want %d,%d", tc.a, tc.d, tc.n, p, m, tc.plus, tc.minus) + } + } +} + +func TestDiffStatTextAndName(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + DiffStat(c, 12, 3, DiffStatOptions{}) + }, 300, 60) + if !tt.HasText("+12") || !tt.HasText("−3") { + t.Fatalf("counts: %q", tt.Texts()) + } + if _, ok := tt.Find("12 additions, 3 deletions"); !ok { + t.Fatal("not named for assistive technology") + } + for _, tc := range []struct{ a, d, n int }{{-1, 0, 0}, {0, -1, 0}, {1, 1, -2}} { + func() { + defer func() { + if recover() == nil { + t.Errorf("%v did not panic", tc) + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + DiffStat(c, tc.a, tc.d, DiffStatOptions{Blocks: tc.n}) + }, 100, 50, 1) + }() + } +} + +func TestDiffStatSnapshot(t *testing.T) { + snapshot(t, "diff_stat", 360, 120, func(c *ui.Context) { + ui.Column(c).Padding(16).Gap(10).Children(func() { + DiffStat(c, 128, 32, DiffStatOptions{}) + DiffStat(c, 4, 0, DiffStatOptions{}) + DiffStat(c, 0, 0, DiffStatOptions{Blocks: 8}) + }) + }) +} diff --git a/diff_viewer.go b/diff_viewer.go new file mode 100644 index 0000000..839c0d7 --- /dev/null +++ b/diff_viewer.go @@ -0,0 +1,225 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strconv" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// DiffViewerState keeps a DiffViewer's diff, opened folds and scroll place. +type DiffViewerState struct { + list ui.ListState + from, to string + diff []internal.DiffLine + rows []diffViewerRow + expanded map[int]bool + split bool + context int + built bool + dirty bool +} + +// DiffViewerOptions configure a DiffViewer. +type DiffViewerOptions struct { + // SideBySide shows old and new in two columns. + SideBySide bool + // Context is unchanged lines kept around changes; zero means 3. + Context int + // Language picks syntax colors, as "go"; empty is plain. + Language string +} + +// diffViewerRow is a fold or one line per side. +type diffViewerRow struct { + left, right int + fold, hidden int +} + +// DiffViewer compares two texts by line; give it a height. +func DiffViewer(c *ui.Context, s *DiffViewerState, from, to string, opts DiffViewerOptions) *ui.Element { + ctx := opts.Context + if ctx == 0 { + ctx = 3 + } + if ctx < 0 { + panic("mujica: DiffViewer Context is negative") + } + if !s.built || s.from != from || s.to != to { + s.diff = internal.LineDiff(internal.SplitLines(from), internal.SplitLines(to)) + s.from, s.to, s.built, s.dirty, s.expanded = from, to, true, true, map[int]bool{} + add, del := internal.DiffStats(s.diff) + slog.Debug("mujica: diff viewer diff", "lines", len(s.diff), "added", add, "deleted", del) + } + if s.dirty || s.split != opts.SideBySide || s.context != ctx { + s.rows = diffViewerRows(s.diff, ctx, s.expanded, opts.SideBySide) + s.split, s.context, s.dirty = opts.SideBySide, ctx, false + } + k := Tokens(c) + digits := float32(len(strconv.Itoa(max(len(s.diff), 1)))) + numW := digits*8 + Density(c).Unit()*3 + e := ui.List(c, &s.list, len(s.rows), func(i int) { + r := s.rows[i] + if r.hidden > 0 { + diffViewerFold(c, s, r) + return + } + row := ui.Row(c).AlignItems(ui.Stretch).MinHeight(theme.MinHitSize) + row.Children(func() { + if !opts.SideBySide { + diffViewerCell(c, s.diff[r.left], opts.Language, numW, true) + return + } + for _, side := range []int{r.left, r.right} { + half := ui.Row(c).Grow(1).Basis(0).MinWidth(0).AlignItems(ui.Stretch).Clip() + half.Children(func() { + if side < 0 { + half.Background(k.Background) + return + } + diffViewerCell(c, s.diff[side], opts.Language, numW, false) + }) + } + }) + }) + e.Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius).Font(theme.MonoFont) + return e +} + +// diffViewerCell shows one diff line with numbers, sign and tint. +func diffViewerCell(c *ui.Context, d internal.DiffLine, language string, numW float32, both bool) { + k := Tokens(c) + u := Density(c).Unit() + small := FontSize(c, theme.CaptionSize) + sign, col, name := " ", k.TextMuted, "" + switch d.Op { + case internal.DiffDelete: + sign, col, name = "−", k.Danger, msg(c, "diff_viewer.deleted") + case internal.DiffInsert: + sign, col, name = "+", k.Success, msg(c, "diff_viewer.added") + } + cell := ui.Row(c).Grow(1).MinWidth(0).AlignItems(ui.Center) + if d.Op != internal.DiffEqual { + cell.Background(col.Mix(k.Surface, 0.88)) + } + num := func(n int) { + t := "" + if n > 0 { + t = strconv.Itoa(n) + } + ui.Text(c, t).FontSize(small).FontFeatures("tnum").TextColor(k.TextMuted).Width(numW).TextAlign(ui.End).Shrink(0).Padding(0, u, 0, 0) + } + cell.Children(func() { + if both || d.Op != internal.DiffInsert { + num(d.Old) + } + if both || d.Op == internal.DiffInsert { + num(d.New) + } + ui.Text(c, sign).FontWeight(700).TextColor(col).Width(u * 4).TextAlign(ui.Center).Shrink(0) + spans, _ := internal.CodeSpans(k, language, d.Text, false) + if len(spans) == 0 || d.Text == "" { + spans = []ui.Span{{Text: " "}} + } + t := ui.RichText(c, spans...).NoWrap().MinWidth(0).Padding(u*0.5, u*2, u*0.5, 0) + if name != "" { + t.Label(name + ": " + d.Text) + } + }) +} + +// diffViewerFold is the button standing for hidden unchanged lines. +func diffViewerFold(c *ui.Context, s *DiffViewerState, r diffViewerRow) { + k := Tokens(c) + u := Density(c).Unit() + b := ui.ButtonBase(c).Justify(ui.Start).Gap(u*2).MinHeight(theme.MinHitSize).Padding(0, u*3).Background(k.Background). + TextColor(k.TextMuted).Cursor(ui.CursorPointer) + label := fmt.Sprintf(msg(c, "diff_viewer.fold"), r.hidden) + b.Label(label) + internal.Ring(b, k.Focus, 0) + if b.Hovered() { + b.Background(k.SurfaceHover).TextColor(k.Text) + } + b.Transition(colorFade) + b.Children(func() { + ui.Text(c, "⋯").FontWeight(700) + ui.Text(c, label).Font(theme.SerifFont).FontSize(FontSize(c, theme.CaptionSize)) + }) + if b.Clicked() && !b.IsDisabled() { + s.expanded[r.fold] = true + s.dirty = true + slog.Debug("mujica: diff viewer unfold", "at", r.fold, "lines", r.hidden) + } +} + +// diffViewerRows folds long unchanged runs and pairs split sides. +func diffViewerRows(diff []internal.DiffLine, ctx int, expanded map[int]bool, split bool) []diffViewerRow { + var rows []diffViewerRow + var dels, ins []int + flush := func() { + for j := 0; j < max(len(dels), len(ins)); j++ { + r := diffViewerRow{left: -1, right: -1} + if j < len(dels) { + r.left = dels[j] + } + if j < len(ins) { + r.right = ins[j] + } + rows = append(rows, r) + } + dels, ins = dels[:0], ins[:0] + } + line := func(i int) { + switch { + case !split: + rows = append(rows, diffViewerRow{left: i, right: -1}) + case diff[i].Op == internal.DiffDelete: + dels = append(dels, i) + case diff[i].Op == internal.DiffInsert: + ins = append(ins, i) + default: + flush() + rows = append(rows, diffViewerRow{left: i, right: i}) + } + } + for i := 0; i < len(diff); { + if diff[i].Op != internal.DiffEqual { + line(i) + i++ + continue + } + end := i + for end < len(diff) && diff[end].Op == internal.DiffEqual { + end++ + } + keepHead, keepTail := ctx, ctx + if i == 0 { + keepHead = 0 + } + if end == len(diff) { + keepTail = 0 + } + hidden := end - i - keepHead - keepTail + if hidden <= 1 || expanded[i+keepHead] { + for j := i; j < end; j++ { + line(j) + } + } else { + for j := i; j < i+keepHead; j++ { + line(j) + } + flush() + rows = append(rows, diffViewerRow{left: -1, right: -1, fold: i + keepHead, hidden: hidden}) + for j := end - keepTail; j < end; j++ { + line(j) + } + } + i = end + } + flush() + return rows +} diff --git a/diff_viewer_test.go b/diff_viewer_test.go new file mode 100644 index 0000000..702a6e7 --- /dev/null +++ b/diff_viewer_test.go @@ -0,0 +1,105 @@ +package mujica + +import ( + "fmt" + "strings" + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" +) + +const diffOld = "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"hi\")\n}\n" +const diffNew = "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tname := \"court\"\n\tfmt.Println(\"hi\", name)\n}\n" + +func TestDiffViewerRowsFoldAndPair(t *testing.T) { + var a, b []string + for i := range 30 { + a = append(a, fmt.Sprintf("line %d", i)) + } + b = append(b, a...) + b[15] = "changed" + d := internal.LineDiff(a, b) + rows := diffViewerRows(d, 3, map[int]bool{}, false) + // 12 hidden, 3 context, delete, insert, 3 context, 11 hidden. + if len(rows) != 10 || rows[0].hidden != 12 || rows[9].hidden != 11 { + t.Fatalf("unified rows %+v", rows) + } + split := diffViewerRows(d, 3, map[int]bool{}, true) + if len(split) != 9 || split[4].left < 0 || split[4].right < 0 || d[split[4].left].Op != internal.DiffDelete { + t.Fatalf("split rows %+v", split) + } + open := diffViewerRows(d, 3, map[int]bool{0: true}, false) + if len(open) != 21 || open[0].hidden != 0 { + t.Fatalf("expanded rows %d", len(open)) + } +} + +func TestDiffViewerUnfoldAndModes(t *testing.T) { + var s DiffViewerState + from := strings.Repeat("same\n", 20) + "old\n" + to := strings.Repeat("same\n", 20) + "new\n" + split := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + DiffViewer(c, &s, from, to, DiffViewerOptions{SideBySide: split}).Height(760) + }, 700, 800) + if !tt.HasText("17 unchanged lines") { + t.Fatalf("fold: %q", tt.Texts()) + } + if _, ok := tt.Find("Deleted: old"); !ok { + t.Fatal("deleted line not named") + } + if _, ok := tt.Find("Added: new"); !ok { + t.Fatal("added line not named") + } + if err := tt.Click("17 unchanged lines"); err != nil { + t.Fatal(err) + } + if tt.HasText("17 unchanged lines") || !tt.HasText("17") { + t.Fatalf("unfold: %q", tt.Texts()) + } + split = true + tt.Frame() + if !tt.HasText("−") || !tt.HasText("+") { + t.Fatalf("split: %q", tt.Texts()) + } +} + +func TestDiffViewerVirtualized(t *testing.T) { + var a, b strings.Builder + for i := range 100000 { + fmt.Fprintf(&a, "line %d\n", i) + if i%1000 == 0 { + fmt.Fprintf(&b, "edit %d\n", i) + } else { + fmt.Fprintf(&b, "line %d\n", i) + } + } + from, to := a.String(), b.String() + var s DiffViewerState + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + DiffViewer(c, &s, from, to, DiffViewerOptions{}).Height(400) + }, 700, 440) + if n := len(tt.Texts()); n > 400 { + t.Fatalf("%d texts for 100,000 lines", n) + } + rows := &s.rows[0] + tt.Frame() + if &s.rows[0] != rows { + t.Fatal("rows rebuilt without a change") + } +} + +func TestDiffViewerSnapshot(t *testing.T) { + snapshot(t, "diff_viewer", 640, 520, func(c *ui.Context) { + s := ui.Local(c.Root(), "u", func() *DiffViewerState { return &DiffViewerState{} }) + p := ui.Local(c.Root(), "p", func() *DiffViewerState { return &DiffViewerState{} }) + ui.Column(c).Padding(16).Gap(12).Children(func() { + DiffViewer(c, *s, diffOld, diffNew, DiffViewerOptions{Language: "go", Context: 1}).Height(220) + DiffViewer(c, *p, diffOld, diffNew, DiffViewerOptions{Language: "go", SideBySide: true, Context: 1}).Height(220) + }) + }) +} diff --git a/docs/components/301-diff-viewer.md b/docs/components/301-diff-viewer.md new file mode 100644 index 0000000..e002e9f --- /dev/null +++ b/docs/components/301-diff-viewer.md @@ -0,0 +1,52 @@ +# 301 DiffViewer 差异查看器 + +## 用途 + +按行比较两段文本,统一或并排显示:行号、增删高亮、折叠较长的未变更区;大文件只构建可见行。 + +## 最小示例 + +```go +var state mujica.DiffViewerState +from := "func main() {\n\tprintln(\"hi\")\n}\n" +to := "func main() {\n\tprintln(\"hello\")\n}\n" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DiffViewer(c, &state, from, to, mujica.DiffViewerOptions{Language: "go", SideBySide: true}).Height(240) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func DiffViewer(c *ui.Context, s *DiffViewerState, from, to string, opts DiffViewerOptions) *ui.Element` + +## 参数 + +`DiffViewerOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| SideBySide | bool | false | 并排两栏;否则统一一栏。 | +| Context | int | 0(即 3) | 变更前后保留的未变更行数;为负 panic。 | +| Language | string | "" | 语法高亮语言,如 go;空为纯文本。 | + +`DiffViewerState` 由调用方持有,保存差异、已展开的折叠与滚动位置。差异只在 from 或 to 改变时重新计算(Myers 行差异)。给返回元素一个高度。 + +## 状态 + +- 删除行:Danger 浅色底与 − 号;新增行:Success 浅色底与 + 号;不只靠颜色。 +- 统一视图显示新旧两列行号;并排视图每侧一列,缺行的一侧为空底。 +- 超过 2×Context 的未变更区折叠为“N 行未更改”按钮,点击展开,悬停 120 ms 过渡。 + +## 事件 + +- 无;展开折叠保存在状态中。 + +## 键盘操作 + +- 列表可获得焦点并滚动;折叠按钮用 Tab 到达,Enter 或 Space 展开。 + +## 限制 + +- 只做行级差异;词级差异见 InlineDiff。 +- 长行不换行,超出部分裁剪。 +- 文本换成新字符串后折叠全部重置。 diff --git a/docs/components/302-inline-diff.md b/docs/components/302-inline-diff.md new file mode 100644 index 0000000..f3e5410 --- /dev/null +++ b/docs/components/302-inline-diff.md @@ -0,0 +1,44 @@ +# 302 InlineDiff 行内差异 + +## 用途 + +并列显示一行的旧版与新版,标出词级的删除与新增。 + +## 最小示例 + +```go +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.InlineDiff(c, "The court meets at noon", "The court meets at dusk", mujica.InlineDiffOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func InlineDiff(c *ui.Context, from, to string, opts InlineDiffOptions) *ui.Element` + +## 参数 + +`InlineDiffOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Mono | bool | false | 使用等宽字体,适合代码。 | + +词按字母数字、空白与单个标点切分;差异只在 from 或 to 改变时重新计算。 + +## 状态 + +- 旧行以 − 开头,删除的词带浅色底与删除线;新行以 + 开头,新增的词带浅色底与下划线。 +- 两行分别以“原文”“新文”加全文朗读。 + +## 事件 + +- 无。 + +## 键盘操作 + +- 无:纯展示。 + +## 限制 + +- 只比较一行;多行请用 DiffViewer。 diff --git a/docs/components/303-three-way-merge.md b/docs/components/303-three-way-merge.md new file mode 100644 index 0000000..c03a2be --- /dev/null +++ b/docs/components/303-three-way-merge.md @@ -0,0 +1,53 @@ +# 303 ThreeWayMerge 三方合并 + +## 用途 + +以本地、基准、远端三栏和结果栏显示三方合并,逐块采纳本地、远端、两者或基准。 + +## 最小示例 + +```go +var state mujica.ThreeWayMergeState +base, local, remote := "a\nb\nc", "a\nB1\nc", "a\nB2\nc" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ThreeWayMerge(c, &state, base, local, remote, mujica.ThreeWayMergeOptions{}) + r.Element.Height(280) + if done, total := state.Resolved(); r.Changed() && done == total { + _ = state.Result() // write the merged file + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ThreeWayMerge(c *ui.Context, s *ThreeWayMergeState, base, ours, theirs string, opts ThreeWayMergeOptions) ChoiceResult` + +## 参数 + +`ThreeWayMergeOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Disabled | bool | false | 禁用采纳。 | + +`ThreeWayMergeState.Result()` 返回合并文本,未解决的冲突保留冲突标记;`Resolved()` 返回已解决与总冲突数。分块只在三段文本改变时计算。给返回的 `Element` 一个高度。 + +## 状态 + +- 只有一侧修改或两侧相同修改的块自动合并,来源一侧以浅色底标出。 +- 冲突块在结果栏显示 Danger 色“未解决”与警示图标。 +- 已采纳的按钮为 Selection 底、AccentText 边框与对勾。 +- 较长的未变更块只显示首尾各两行。 + +## 事件 + +- `Changed()`:某个冲突的选择改变。 + +## 键盘操作 + +- 列表可获得焦点并滚动;采纳按钮用 Tab 到达,Enter 或 Space 选择。 + +## 限制 + +- 按行合并,不做词级合并。 +- 相邻(中间没有未变更行)的两侧修改视为冲突。 diff --git a/docs/components/304-conflict-resolver.md b/docs/components/304-conflict-resolver.md new file mode 100644 index 0000000..8f7fed8 --- /dev/null +++ b/docs/components/304-conflict-resolver.md @@ -0,0 +1,51 @@ +# 304 ConflictResolver 冲突解决 + +## 用途 + +读取带 git 冲突标记的文本,列出冲突块,逐块采纳当前、传入或两者,并显示已解决计数。 + +## 最小示例 + +```go +var state mujica.ConflictResolverState +text := "a\n<<<<<<< HEAD\nmine\n=======\ntheirs\n>>>>>>> feature\nb" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ConflictResolver(c, &state, text, mujica.ConflictResolverOptions{}).Changed() { + _ = state.Result() // save the file once every block is resolved + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ConflictResolver(c *ui.Context, s *ConflictResolverState, text string, opts ConflictResolverOptions) ChoiceResult` + +## 参数 + +`ConflictResolverOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Disabled | bool | false | 禁用采纳。 | + +`ConflictResolverState.Result()` 返回替换后的文本,未解决的块保留原标记;`Resolved()` 返回已解决与总数。只在文本改变时重新解析。 + +## 状态 + +- 顶部显示“已解决 n / m 个冲突”与 Success 色进度条。 +- 未解决块标题为警示图标与“未解决”,已解决为对勾与“已解决”。 +- 被采纳的一侧显示浅色底与对勾,按钮带对勾;已解决块提供“撤销”。 +- 标记未闭合时显示 Danger 色提示与起始行号,不列出冲突。 + +## 事件 + +- `Changed()`:某块的选择改变。 + +## 键盘操作 + +- Tab 依次经过各块按钮,Enter 或 Space 采纳。 + +## 限制 + +- 支持 diff3 样式的 ||||||| 基准段,但不显示它。 +- 冲突块不虚拟化;适合单个文件的冲突数量。 diff --git a/docs/components/305-changes-list.md b/docs/components/305-changes-list.md new file mode 100644 index 0000000..54ae845 --- /dev/null +++ b/docs/components/305-changes-list.md @@ -0,0 +1,66 @@ +# 305 ChangesList 更改列表 + +## 用途 + +把工作区更改分为“已暂存”与“更改”两组,逐文件或整组暂存、取消暂存,并选择文件查看差异。只构建可见行。 + +## 最小示例 + +```go +var state mujica.ChangesListState +files := []mujica.ChangedFile{ + {Path: "main.go", Status: mujica.GitModified, Staged: true}, + {Path: "notes.txt", Status: mujica.GitUntracked}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ChangesList(c, &state, files, mujica.ChangesListOptions{}) + r.Element.Height(240) + if action, path, ok := r.Action(); ok { + _, _ = action, path // run git add or git restore --staged + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ChangesList(c *ui.Context, s *ChangesListState, files []ChangedFile, opts ChangesListOptions) GitListResult` + +## 参数 + +`ChangedFile` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Path | string | 必填 | 文件路径;为空时 panic。 | +| Status | GitStatus | GitModified | 状态,见 GitStatusBadge;未知值 panic。 | +| Staged | bool | false | 放入已暂存组。 | + +`ChangesListOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Disabled | bool | false | 禁用:不暂存、不改变选择。 | + +`ChangesListState` 由调用方持有,`Selected()` 返回所选文件在 `files` 中的下标,无则 -1。`files` 换成新切片或长度变化时重新分组,分组不在每帧计算。给返回的 `Element` 一个高度。 + +## 状态 + +- 组标题为衬线小字与计数,空组的整组按钮禁用。 +- 每行显示 GitStatusBadge(字母、边框与颜色)、文件名与目录。 +- 选中行:Selection 背景加左侧 AccentText 竖线。 +- 悬停与按下:图标按钮 SurfaceHover / Selection 背景。 + +## 事件 + +- `Action()` 返回 `"stage"`、`"unstage"`(附路径)或 `"stage_all"`、`"unstage_all"`。 +- `Changed()` 选择变化;`Submitted()` 双击或 Enter。 + +## 键盘操作 + +- Tab 进入列表;↑/↓、Home/End 移动选择,跳过组标题;输入文件名开头字母跳转;Enter 提交。 +- 行内暂存按钮可用 Tab 到达,Enter 或 Space 执行。 + +## 限制 + +- 不读取仓库:文件列表与暂存操作都由调用方完成。 +- 重命名的旧路径不单独显示。 diff --git a/docs/components/306-commit-input.md b/docs/components/306-commit-input.md new file mode 100644 index 0000000..4676a1a --- /dev/null +++ b/docs/components/306-commit-input.md @@ -0,0 +1,62 @@ +# 306 CommitInput 提交输入 + +## 用途 + +编辑提交标题与正文,标题长度提示,提交与修订(amend),并防止重复提交。 + +## 最小示例 + +```go +msg := mujica.CommitMessage{} +busy := false +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommitInput(c, &msg, mujica.CommitInputOptions{Busy: busy}) + if r.Committed() || r.Amended() { + busy = true // run git commit, then clear busy + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func CommitInput(c *ui.Context, m *CommitMessage, opts CommitInputOptions) CommitInputResult` + +## 参数 + +`CommitMessage` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Title | string | "" | 提交标题;为空时提交与修订禁用。 | +| Body | string | "" | 提交正文。 | + +`CommitInputOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| TitleLimit | int | 0(即 50) | 建议的标题长度;为负 panic。 | +| Busy | bool | false | 提交进行中:提交按钮显示加载,输入只读。 | +| Disabled | bool | false | 整体禁用。 | + +返回 `CommitInputResult`,含 `Element`。 + +## 状态 + +- 标题右侧显示“已用/上限”,超出时变为 Warning 色并朗读超出字数。 +- 提交后进入待定状态:按钮与输入锁定,直到调用方把 Busy 设为 true 再恢复 false。 +- Busy 时提交按钮保留尺寸并显示加载。 + +## 事件 + +- `Committed()`:点击提交、标题内 Enter 或正文内 Cmd+Enter。 +- `Amended()`:点击修订。 + +## 键盘操作 + +- Tab 依次经过标题、正文、修订、提交。 +- 标题中 Enter、正文中 Cmd+Enter(非 macOS 为 Ctrl+Enter)提交。 + +## 限制 + +- 防重入依赖调用方在提交期间设置 Busy;从未设置 Busy 时组件保持锁定。 +- 不做提交信息格式校验。 diff --git a/docs/components/307-commit-graph.md b/docs/components/307-commit-graph.md new file mode 100644 index 0000000..82398ea --- /dev/null +++ b/docs/components/307-commit-graph.md @@ -0,0 +1,67 @@ +# 307 CommitGraph 提交图谱 + +## 用途 + +按从新到旧的顺序显示提交,左侧绘制泳道、分支与合并线;只构建可见行,可承载十万级提交。 + +## 最小示例 + +```go +var state mujica.CommitGraphState +commits := []mujica.Commit{ + {Hash: "c3", Parents: []string{"c2", "b1"}, Subject: "Merge branch", Refs: []string{"main"}}, + {Hash: "b1", Parents: []string{"c1"}, Subject: "Feature"}, + {Hash: "c2", Parents: []string{"c1"}, Subject: "Fix"}, + {Hash: "c1", Subject: "Initial commit"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CommitGraph(c, &state, commits, mujica.CommitGraphOptions{}).Element.Height(240) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func CommitGraph(c *ui.Context, s *CommitGraphState, commits []Commit, opts CommitGraphOptions) GitListResult` + +## 参数 + +`Commit` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Hash | string | 必填 | 提交哈希;为空时 panic。 | +| Parents | []string | nil | 父提交;两个以上为合并提交。 | +| Author | string | "" | 作者。 | +| When | time.Time | 零值 | 提交时间。 | +| Subject | string | "" | 提交标题。 | +| Refs | []string | nil | 指向该提交的分支与标签。 | + +`CommitGraphOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| TimeFormat | string | "2006-01-02 15:04" | 时间格式。 | +| MaxLanes | int | 0(即 8) | 图谱最多显示的泳道数,超出部分裁剪;为负 panic。 | +| Status | DataStatus | DataReady | 加载、追加、失败状态。 | +| Error | string | "" | 失败说明。 | + +`CommitGraphState.List` 保存选择(`Selected()` 返回哈希)。泳道布局在提交切片或长度变化时计算一次,不在每帧计算。提交须按子提交在前的拓扑顺序给出。给返回的 `Element` 一个高度。 + +## 状态 + +- 普通提交为实心圆点,合并提交为空心菱形,形状区分而不只靠颜色。 +- 泳道颜色取自 AccentText、Info、Success、Warning、Danger、TextMuted,按位置区分。 +- 选中行:Selection 背景与对勾。 + +## 事件 + +- `Changed()` 选择变化;`Submitted()` 双击或 Enter 打开提交。 + +## 键盘操作 + +- Tab 进入列表;↑/↓、Home/End 移动选择;输入标题开头字母跳转;Enter 打开。 + +## 限制 + +- 原地修改提交切片而不改变其地址与长度时,布局不会重算;请传入新切片。 +- 泳道数超过 MaxLanes 时,右侧泳道被裁剪。 diff --git a/docs/components/308-commit-list.md b/docs/components/308-commit-list.md new file mode 100644 index 0000000..1cc292b --- /dev/null +++ b/docs/components/308-commit-list.md @@ -0,0 +1,53 @@ +# 308 CommitList 提交列表 + +## 用途 + +显示提交列表:标题、引用、作者、短哈希与时间,选择后查看。只构建可见行。 + +## 最小示例 + +```go +var state mujica.ListState[string] +commits := []mujica.Commit{{Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Subject: "Add the commit list"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommitList(c, &state, commits, mujica.CommitListOptions{}) + r.Element.Height(240) + if hash, ok := state.Selected(); ok && r.Submitted() { + _ = hash // show the commit + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func CommitList(c *ui.Context, s *ListState[string], commits []Commit, opts CommitListOptions) GitListResult` + +## 参数 + +`CommitListOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| TimeFormat | string | "2006-01-02 15:04" | 时间格式。 | +| Status | DataStatus | DataReady | 加载、追加、失败状态。 | +| Error | string | "" | 失败说明。 | + +`Commit` 见 CommitGraph。选择保存在 `ListState`,以哈希为键。给返回的 `Element` 一个高度。 + +## 状态 + +- 引用以 AccentText 描边小标签显示;短哈希为等宽 AccentText。 +- 空列表显示“没有提交”;加载与失败使用列表的统一占位。 +- 选中行:Selection 背景与对勾。 + +## 事件 + +- `Changed()` 选择变化;`Submitted()` 双击或 Enter。 + +## 键盘操作 + +- Tab 进入列表;↑/↓、Home/End 移动选择;输入标题开头字母跳转;Enter 打开。 + +## 限制 + +- 时间按调用方给定格式显示,不做相对时间。 diff --git a/docs/components/309-branch-selector.md b/docs/components/309-branch-selector.md new file mode 100644 index 0000000..e567aec --- /dev/null +++ b/docs/components/309-branch-selector.md @@ -0,0 +1,64 @@ +# 309 BranchSelector 分支选择器 + +## 用途 + +按钮显示当前分支,点击弹出可搜索的本地与远端分支列表;可选“新建分支”入口。 + +## 最小示例 + +```go +branch := "main" +branches := []mujica.Branch{{Name: "main", Current: true}, {Name: "origin/main", Remote: true}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.BranchSelector(c, &branch, branches, mujica.BranchSelectorOptions{AllowCreate: true}) + if name, ok := r.Created(); ok { + _ = name // run git switch -c name + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func BranchSelector(c *ui.Context, selected *string, branches []Branch, opts BranchSelectorOptions) BranchSelectorResult` + +## 参数 + +`Branch` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Name | string | 必填 | 唯一名称,远端分支带远端名,如 origin/main;为空时 panic。 | +| Remote | bool | false | 归入远端组。 | +| Current | bool | false | 当前检出的分支。 | +| Upstream | string | "" | 上游分支。 | +| Ahead, Behind | int | 0 | 领先、落后的提交数;为负 panic。 | + +`BranchSelectorOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| AllowCreate | bool | false | 搜索词不是已有分支名时,列表末尾提供“新建分支”。 | +| Disabled | bool | false | 禁用;打开中的弹层会关闭。 | + +返回 `BranchSelectorResult`,含 `Element`。过滤结果在搜索词或分支切片变化时才重新计算。 + +## 状态 + +- 弹层使用统一浮层外观,160 ms 淡入,尺寸限制在窗口内,内容滚动。 +- 本地、远端分组标题为衬线小字;当前分支加粗并带对勾。 +- 高亮项:Selection 背景,键盘移动时滚入视野。 + +## 事件 + +- `Changed()`:选择了另一个分支,`*selected` 已更新。 +- `Created()`:用户要求新建的分支名(已去除首尾空白)。 + +## 键盘操作 + +- Enter 或 Space 打开;焦点进入搜索框。 +- ↑/↓ 移动高亮并循环,Enter 选择,Escape 关闭并把焦点还给按钮。 + +## 限制 + +- 不执行 git:选择与新建都由调用方处理。 +- 搜索为大小写不敏感的子串匹配。 diff --git a/docs/components/310-branch-list.md b/docs/components/310-branch-list.md new file mode 100644 index 0000000..cec3aa1 --- /dev/null +++ b/docs/components/310-branch-list.md @@ -0,0 +1,62 @@ +# 310 BranchList 分支列表 + +## 用途 + +分支列表:标出当前分支,显示上游与领先、落后数,每行提供调用方定义的操作按钮。 + +## 最小示例 + +```go +var state mujica.ListState[string] +branches := []mujica.Branch{{Name: "main", Current: true, Upstream: "origin/main", Ahead: 2}} +actions := []mujica.GitAction{{ID: "delete", Label: "Delete", Icon: "trash-2"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.BranchList(c, &state, branches, mujica.BranchListOptions{Actions: actions}) + r.Element.Height(200) + if action, name, ok := r.Action(); ok { + _, _ = action, name // run the action on the branch + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func BranchList(c *ui.Context, s *ListState[string], branches []Branch, opts BranchListOptions) GitListResult` + +## 参数 + +`BranchListOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Actions | []GitAction | nil | 每行的图标操作;ID、Label、Icon 必填且 ID 唯一,否则 panic。 | +| Status | DataStatus | DataReady | 加载、追加、失败状态。 | +| Error | string | "" | 失败说明。 | + +`GitAction` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| ID | string | 必填 | `Action()` 返回的标识。 | +| Label | string | 必填 | 按钮名称与提示。 | +| Icon | string | 必填 | icons/ 中的图标名。 | + +`Branch` 见 BranchSelector。选择以分支名为键。给返回的 `Element` 一个高度。 + +## 状态 + +- 当前分支:对勾、加粗与“当前”文字。 +- 领先 ↑n、落后 ↓n 以箭头与数字显示,朗读完整说明。 + +## 事件 + +- `Action()` 返回操作 ID 与分支名。 +- `Changed()`、`Submitted()` 同 CommitList。 + +## 键盘操作 + +- ↑/↓、Home/End 移动选择;行内操作按钮用 Tab 到达,Enter 或 Space 执行。 + +## 限制 + +- 操作由调用方执行;组件不确认危险操作,需要时在回调里使用 Popconfirm 等组件。 diff --git a/docs/components/311-tag-list.md b/docs/components/311-tag-list.md new file mode 100644 index 0000000..13d9b89 --- /dev/null +++ b/docs/components/311-tag-list.md @@ -0,0 +1,59 @@ +# 311 TagList 标签列表 + +## 用途 + +标签列表:名称、注释与目标提交,每行可跳转到提交。 + +## 最小示例 + +```go +var state mujica.ListState[string] +tags := []mujica.GitTag{{Name: "v1.1.0", Target: "a1b2c3d4", Annotation: "Release"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.TagList(c, &state, tags, mujica.TagListOptions{}) + r.Element.Height(200) + if _, hash, ok := r.Action(); ok { + _ = hash // show the tagged commit + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func TagList(c *ui.Context, s *ListState[string], tags []GitTag, opts TagListOptions) GitListResult` + +## 参数 + +`GitTag` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Name | string | 必填 | 标签名,唯一。 | +| Target | string | 必填 | 目标提交哈希。 | +| Annotation | string | "" | 注释;轻量标签留空。 | + +`TagListOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Status | DataStatus | DataReady | 加载、追加、失败状态。 | +| Error | string | "" | 失败说明。 | + +Name 或 Target 为空时 panic。给返回的 `Element` 一个高度。 + +## 状态 + +- 注释为 TextMuted 单行,超长省略。 + +## 事件 + +- `Action()` 返回 `"jump"` 与目标哈希。 +- `Changed()`、`Submitted()` 同 CommitList。 + +## 键盘操作 + +- ↑/↓、Home/End 移动选择;“跳转到提交”按钮用 Tab 到达。 + +## 限制 + +- 不读取标签:数据由调用方提供。 diff --git a/docs/components/312-stash-list.md b/docs/components/312-stash-list.md new file mode 100644 index 0000000..f7901bd --- /dev/null +++ b/docs/components/312-stash-list.md @@ -0,0 +1,58 @@ +# 312 StashList 贮藏列表 + +## 用途 + +贮藏列表,每行提供应用、弹出与删除。 + +## 最小示例 + +```go +var state mujica.ListState[string] +stashes := []mujica.Stash{{Ref: "stash@{0}", Message: "WIP on main", Branch: "main"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.StashList(c, &state, stashes, mujica.StashListOptions{}) + r.Element.Height(200) + if action, ref, ok := r.Action(); ok { + _, _ = action, ref // run git stash apply, pop or drop + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func StashList(c *ui.Context, s *ListState[string], stashes []Stash, opts StashListOptions) GitListResult` + +## 参数 + +`Stash` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Ref | string | 必填 | 如 stash@{0};为空时 panic。 | +| Message | string | "" | 贮藏说明。 | +| Branch | string | "" | 创建时所在分支。 | + +`StashListOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Status | DataStatus | DataReady | 加载、追加、失败状态。 | +| Error | string | "" | 失败说明。 | + +给返回的 `Element` 一个高度。 + +## 状态 + +- Ref 为等宽 AccentText;三个操作为带名称与提示的图标按钮。 + +## 事件 + +- `Action()` 返回 `"apply"`、`"pop"` 或 `"drop"` 与 Ref。 + +## 键盘操作 + +- ↑/↓ 移动选择;操作按钮用 Tab 到达,Enter 或 Space 执行。 + +## 限制 + +- 删除不带确认;需要时由调用方在回调里确认。 diff --git a/docs/components/313-blame-view.md b/docs/components/313-blame-view.md new file mode 100644 index 0000000..ba5eada --- /dev/null +++ b/docs/components/313-blame-view.md @@ -0,0 +1,62 @@ +# 313 BlameView 逐行追溯 + +## 用途 + +代码逐行显示最后修改的作者与提交;同一提交的连续行合并显示,悬停显示提交详情。只构建可见行。 + +## 最小示例 + +```go +var state mujica.BlameViewState +lines := []mujica.BlameLine{ + {Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Summary: "Add main", Text: "package main"}, + {Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Summary: "Add main", Text: "func main() {}"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.BlameView(c, &state, lines, mujica.BlameViewOptions{Language: "go"}).Height(240) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func BlameView(c *ui.Context, s *BlameViewState, lines []BlameLine, opts BlameViewOptions) *ui.Element` + +## 参数 + +`BlameLine` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Hash | string | 必填 | 提交哈希;为空时 panic。 | +| Author | string | "" | 作者。 | +| When | time.Time | 零值 | 提交时间。 | +| Summary | string | "" | 提交标题,悬停时显示。 | +| Text | string | "" | 该行代码。 | + +`BlameViewOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Language | string | "" | 语法高亮语言,如 go;空为纯文本。 | +| TimeFormat | string | "2006-01-02" | 日期格式。 | + +`BlameViewState` 由调用方持有;块注释状态在数据或语言变化时计算一次。给返回元素一个高度。 + +## 状态 + +- 每段同提交行只在首行显示短哈希、作者与日期,段之间有细分隔线。 +- 左栏悬停为 SurfaceHover,600 ms 后显示提示:完整哈希、作者、日期与标题。 +- 代码使用统一的语法颜色,注释为斜体。 + +## 事件 + +- 无。 + +## 键盘操作 + +- 列表可获得焦点并滚动;输入行首文字跳转到该行。 + +## 限制 + +- 长行不换行,超出部分裁剪。 +- 悬停详情使用 MyGo 提示,只能用指针触发;每行左栏的名称同样朗读作者与提交。 diff --git a/docs/components/314-file-history.md b/docs/components/314-file-history.md new file mode 100644 index 0000000..5aab49a --- /dev/null +++ b/docs/components/314-file-history.md @@ -0,0 +1,53 @@ +# 314 FileHistory 文件历史 + +## 用途 + +单个文件的提交历史,每条提交提供“查看差异”入口。 + +## 最小示例 + +```go +var state mujica.ListState[string] +commits := []mujica.Commit{{Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Subject: "Edit main.go"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.FileHistory(c, &state, "main.go", commits, mujica.FileHistoryOptions{}) + r.Element.Height(240) + if _, hash, ok := r.Action(); ok { + _ = hash // open the diff of main.go at hash + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func FileHistory(c *ui.Context, s *ListState[string], path string, commits []Commit, opts FileHistoryOptions) GitListResult` + +## 参数 + +`FileHistoryOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| TimeFormat | string | "2006-01-02 15:04" | 时间格式。 | +| Status | DataStatus | DataReady | 加载、追加、失败状态。 | +| Error | string | "" | 失败说明。 | + +path 为空时 panic。给返回的 `Element` 一个高度,列表填满其余空间。 + +## 状态 + +- 标题行显示历史图标、等宽路径与“历史”。 +- 空历史显示“此文件没有历史”。 + +## 事件 + +- `Action()` 返回 `"diff"` 与提交哈希。 +- `Changed()`、`Submitted()` 同 CommitList。 + +## 键盘操作 + +- ↑/↓、Home/End 移动选择;“查看差异”按钮用 Tab 到达。 + +## 限制 + +- 不跟踪重命名:提交列表由调用方提供。 diff --git a/docs/components/315-pull-request-card.md b/docs/components/315-pull-request-card.md new file mode 100644 index 0000000..a5ad61a --- /dev/null +++ b/docs/components/315-pull-request-card.md @@ -0,0 +1,62 @@ +# 315 PullRequestCard 拉取请求卡片 + +## 用途 + +概览一个拉取请求:标题、作者、状态、检查、评审人与差异统计。 + +## 最小示例 + +```go +pr := mujica.PullRequest{Number: 42, Title: "Add git components", Author: "Sakiko", Head: "feature", Base: "main", + ChecksPassed: 3, Reviewers: []mujica.Reviewer{{Name: "Uika", State: mujica.ReviewApproved}}, Added: 120, Deleted: 8, Files: 6} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.PullRequestCard(c, pr, mujica.PullRequestCardOptions{}).Changed() { + // open the pull request + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func PullRequestCard(c *ui.Context, pr PullRequest, opts PullRequestCardOptions) ChoiceResult` + +## 参数 + +`PullRequest` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Number | int | 必填 | 编号,须为正。 | +| Title | string | 必填 | 标题。 | +| Author | string | "" | 作者。 | +| State | PullRequestState | PullRequestOpen | Open、Draft、Merged、Closed;未知值 panic。 | +| Head, Base | string | "" | 源分支与目标分支,都有值时显示。 | +| ChecksPassed, ChecksFailed, ChecksPending | int | 0 | 检查计数;为负 panic。 | +| Reviewers | []Reviewer | nil | 评审人与状态(Pending、Approved、ChangesRequested)。 | +| Added, Deleted, Files | int | 0 | 差异统计。 | + +`PullRequestCardOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Disabled | bool | false | 禁用打开。 | + +返回 `ChoiceResult`。 + +## 状态 + +- 状态徽章同时使用图标、文字与描边颜色。 +- 检查以图标加数字显示,朗读完整说明;为 0 的类别不显示。 +- 评审人以头像加角标图标表示状态,名称与状态写入提示和朗读文本。 + +## 事件 + +- `Changed()`:点击标题或在标题上按 Enter,表示打开。 + +## 键盘操作 + +- Tab 到标题链接,Enter 或 Space 打开。 + +## 限制 + +- 数据由调用方获取;组件不刷新检查状态。 diff --git a/docs/components/316-review-comment.md b/docs/components/316-review-comment.md new file mode 100644 index 0000000..6ed4b9a --- /dev/null +++ b/docs/components/316-review-comment.md @@ -0,0 +1,66 @@ +# 316 ReviewComment 评审评论 + +## 用途 + +行级评审讨论:显示文件与行号、评论列表,支持回复、解决与重新打开。 + +## 最小示例 + +```go +thread := mujica.ReviewThread{File: "main.go", Line: 12, Messages: []mujica.ReviewMessage{ + {Author: "Uika", When: time.Now(), Body: "Can this return early?"}, +}} +draft := "" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ReviewComment(c, thread, &draft, mujica.ReviewCommentOptions{}) + if text, ok := r.Replied(); ok { + thread.Messages = append(thread.Messages, mujica.ReviewMessage{Author: "Sakiko", When: time.Now(), Body: text}) + } + if r.Resolved() || r.Reopened() { + thread.Resolved = !thread.Resolved + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ReviewComment(c *ui.Context, thread ReviewThread, draft *string, opts ReviewCommentOptions) ReviewCommentResult` + +## 参数 + +`ReviewThread` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| File | string | 必填 | 文件路径。 | +| Line | int | 必填 | 行号,须为正。 | +| Resolved | bool | false | 已解决:隐藏回复框,显示“重新打开”。 | +| Messages | []ReviewMessage | 必填 | 至少一条评论(作者、时间、正文)。 | + +`ReviewCommentOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| TimeFormat | string | "2006-01-02 15:04" | 时间格式。 | +| Disabled | bool | false | 禁用回复、解决与重新打开。 | + +`draft` 保存回复草稿,发送后清空。 + +## 状态 + +- 已解决:标题栏显示 Success 色图标与“已解决”。 +- 回复按钮在草稿为空时禁用。 + +## 事件 + +- `Replied()`:发送的回复文本(去除首尾空白)。 +- `Resolved()`、`Reopened()`:对应按钮。 + +## 键盘操作 + +- Tab 经过回复框与按钮;回复框内 Cmd+Enter(非 macOS 为 Ctrl+Enter)发送。 + +## 限制 + +- 评论正文为纯文本,不渲染 Markdown。 +- 线程状态由调用方更新。 diff --git a/docs/components/317-diff-stat.md b/docs/components/317-diff-stat.md new file mode 100644 index 0000000..fc4143b --- /dev/null +++ b/docs/components/317-diff-stat.md @@ -0,0 +1,45 @@ +# 317 DiffStat 差异统计 + +## 用途 + +显示 +新增 −删除 行数,以及按比例填充的方块条。 + +## 最小示例 + +```go +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DiffStat(c, 120, 8, mujica.DiffStatOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func DiffStat(c *ui.Context, added, deleted int, opts DiffStatOptions) *ui.Element` + +## 参数 + +`DiffStatOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Blocks | int | 0(即 5) | 比例条方块数;为负 panic。 | + +added、deleted 为负时 panic。 + +## 状态 + +- 数字带 + 与 − 符号,不只靠颜色;非零一侧至少占一格。 +- 无变化时方块为 Border 色。 +- 朗读为“新增 n 行,删除 m 行”。 + +## 事件 + +- 无。 + +## 键盘操作 + +- 无:纯展示,不获取焦点。 + +## 限制 + +- 无。 diff --git a/docs/components/318-git-status-badge.md b/docs/components/318-git-status-badge.md new file mode 100644 index 0000000..c4f7ac1 --- /dev/null +++ b/docs/components/318-git-status-badge.md @@ -0,0 +1,44 @@ +# 318 GitStatusBadge Git 状态标记 + +## 用途 + +以字母 M、A、D、U、R、C 加描边与颜色标记文件状态。 + +## 最小示例 + +```go +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.GitStatusBadge(c, mujica.GitModified, mujica.GitStatusBadgeOptions{ShowLabel: true}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func GitStatusBadge(c *ui.Context, status GitStatus, opts GitStatusBadgeOptions) *ui.Element` + +## 参数 + +`GitStatusBadgeOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| ShowLabel | bool | false | 在字母旁写出状态名称;否则作为提示。 | + +`GitStatus`:GitModified、GitAdded、GitDeleted、GitUntracked、GitRenamed、GitCopied;`Letter()` 返回字母。未知值 panic。 + +## 状态 + +- 字母为等宽粗体,颜色依状态:修改 Warning、添加 Success、删除 Danger、未跟踪与重命名 Info、复制 AccentText。 +- 名称写入朗读文本与提示,不只靠颜色。 + +## 事件 + +- 无。 + +## 键盘操作 + +- 无:纯展示。 + +## 限制 + +- 无。 diff --git a/docs/components/319-command-block.md b/docs/components/319-command-block.md new file mode 100644 index 0000000..ee28831 --- /dev/null +++ b/docs/components/319-command-block.md @@ -0,0 +1,62 @@ +# 319 CommandBlock 命令块 + +## 用途 + +把一次命令执行显示为一块:提示符与高亮的命令、退出码、耗时与可折叠的 ANSI 输出,可复制命令或输出。 + +## 最小示例 + +```go +open := true +run := mujica.CommandRun{Command: "go test ./...", Output: "\x1b[32mok\x1b[0m example 0.4s", Duration: 400 * time.Millisecond} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommandBlock(c, run, &open, mujica.CommandBlockOptions{}) + if what, ok := r.Copied(); ok { + _ = what // "command" or "output" is on the clipboard + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func CommandBlock(c *ui.Context, run CommandRun, open *bool, opts CommandBlockOptions) CommandBlockResult` + +## 参数 + +`CommandRun` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Command | string | 必填 | 命令;为空时 panic。 | +| Output | string | "" | 输出,可含 ANSI 转义。 | +| ExitCode | int | 0 | 退出码。 | +| Duration | time.Duration | 0 | 耗时;为负 panic。 | +| Running | bool | false | 运行中:显示加载标记,不显示退出码与耗时。 | + +`CommandBlockOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Prompt | string | "$" | 命令前的提示符。 | +| MaxOutputHeight | float32 | 0(即 320) | 输出区最大高度,超出滚动;为负 panic。 | + +`open` 控制输出是否展开。 + +## 状态 + +- 成功:Success 色对勾与“退出码 0”;失败:Danger 色叉号与退出码。 +- 展开箭头 120 ms 转动,减少动画时直接切换。 +- 输出区为 Background 底色,等宽字体,横纵滚动。 + +## 事件 + +- `Toggled()`:展开或折叠。 +- `Copied()`:`"command"` 或 `"output"`;复制的输出已去除 ANSI 转义。 + +## 键盘操作 + +- Tab 到标题行,Enter 或 Space 展开或折叠;复制按钮用 Tab 到达。 + +## 限制 + +- 不运行命令:输出与状态由调用方提供。 diff --git a/docs/components/320-ansi-text.md b/docs/components/320-ansi-text.md new file mode 100644 index 0000000..a5255f7 --- /dev/null +++ b/docs/components/320-ansi-text.md @@ -0,0 +1,45 @@ +# 320 AnsiText ANSI 文本 + +## 用途 + +渲染终端输出:16 色、256 色、真彩,以及粗体、斜体、下划线、删除线、暗淡与反显。 + +## 最小示例 + +```go +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AnsiText(c, "\x1b[1;32mPASS\x1b[0m 12 tests\n\x1b[31mFAIL\x1b[0m 1 test", mujica.AnsiTextOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func AnsiText(c *ui.Context, text string, opts AnsiTextOptions) *ui.Element` + +## 参数 + +`AnsiTextOptions` + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| Wrap | bool | false | 按宽度换行;否则每行保持完整。 | + +样式跨行延续。 + +## 状态 + +- 16 色映射为在两种主题 Surface 上都达到 4.5:1 的颜色;256 色与真彩按原值显示。 +- 默认前景为 Text;反显以 Surface 为前景。 + +## 事件 + +- 无。 + +## 键盘操作 + +- 无:纯展示。 + +## 限制 + +- 只解释 SGR(m 结尾)序列;光标移动、清屏等其他 CSI 序列原样保留为文字,并以 slog.Debug 记录。 +- 256 色与真彩不做对比度调整。 diff --git a/example_git_test.go b/example_git_test.go new file mode 100644 index 0000000..51e60e0 --- /dev/null +++ b/example_git_test.go @@ -0,0 +1,263 @@ +package mujica_test + +import ( + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func ExampleDiffViewer() { + var state mujica.DiffViewerState + from := "func main() {\n\tprintln(\"hi\")\n}\n" + to := "func main() {\n\tprintln(\"hello\")\n}\n" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DiffViewer(c, &state, from, to, mujica.DiffViewerOptions{Language: "go", SideBySide: true}).Height(240) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleInlineDiff() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.InlineDiff(c, "The court meets at noon", "The court meets at dusk", mujica.InlineDiffOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleThreeWayMerge() { + var state mujica.ThreeWayMergeState + base, local, remote := "a\nb\nc", "a\nB1\nc", "a\nB2\nc" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ThreeWayMerge(c, &state, base, local, remote, mujica.ThreeWayMergeOptions{}) + r.Element.Height(280) + if done, total := state.Resolved(); r.Changed() && done == total { + _ = state.Result() // write the merged file + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleConflictResolver() { + var state mujica.ConflictResolverState + text := "a\n<<<<<<< HEAD\nmine\n=======\ntheirs\n>>>>>>> feature\nb" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ConflictResolver(c, &state, text, mujica.ConflictResolverOptions{}).Changed() { + _ = state.Result() // save the file once every block is resolved + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleChangesList() { + var state mujica.ChangesListState + files := []mujica.ChangedFile{ + {Path: "main.go", Status: mujica.GitModified, Staged: true}, + {Path: "notes.txt", Status: mujica.GitUntracked}, + } + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ChangesList(c, &state, files, mujica.ChangesListOptions{}) + r.Element.Height(240) + if action, path, ok := r.Action(); ok { + _, _ = action, path // run git add or git restore --staged + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleCommitInput() { + msg := mujica.CommitMessage{} + busy := false + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommitInput(c, &msg, mujica.CommitInputOptions{Busy: busy}) + if r.Committed() || r.Amended() { + busy = true // run git commit, then clear busy + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleCommitGraph() { + var state mujica.CommitGraphState + commits := []mujica.Commit{ + {Hash: "c3", Parents: []string{"c2", "b1"}, Subject: "Merge branch", Refs: []string{"main"}}, + {Hash: "b1", Parents: []string{"c1"}, Subject: "Feature"}, + {Hash: "c2", Parents: []string{"c1"}, Subject: "Fix"}, + {Hash: "c1", Subject: "Initial commit"}, + } + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CommitGraph(c, &state, commits, mujica.CommitGraphOptions{}).Element.Height(240) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleCommitList() { + var state mujica.ListState[string] + commits := []mujica.Commit{{Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Subject: "Add the commit list"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommitList(c, &state, commits, mujica.CommitListOptions{}) + r.Element.Height(240) + if hash, ok := state.Selected(); ok && r.Submitted() { + _ = hash // show the commit + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleBranchSelector() { + branch := "main" + branches := []mujica.Branch{{Name: "main", Current: true}, {Name: "origin/main", Remote: true}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.BranchSelector(c, &branch, branches, mujica.BranchSelectorOptions{AllowCreate: true}) + if name, ok := r.Created(); ok { + _ = name // run git switch -c name + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleBranchList() { + var state mujica.ListState[string] + branches := []mujica.Branch{{Name: "main", Current: true, Upstream: "origin/main", Ahead: 2}} + actions := []mujica.GitAction{{ID: "delete", Label: "Delete", Icon: "trash-2"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.BranchList(c, &state, branches, mujica.BranchListOptions{Actions: actions}) + r.Element.Height(200) + if action, name, ok := r.Action(); ok { + _, _ = action, name // run the action on the branch + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleTagList() { + var state mujica.ListState[string] + tags := []mujica.GitTag{{Name: "v1.1.0", Target: "a1b2c3d4", Annotation: "Release"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.TagList(c, &state, tags, mujica.TagListOptions{}) + r.Element.Height(200) + if _, hash, ok := r.Action(); ok { + _ = hash // show the tagged commit + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleStashList() { + var state mujica.ListState[string] + stashes := []mujica.Stash{{Ref: "stash@{0}", Message: "WIP on main", Branch: "main"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.StashList(c, &state, stashes, mujica.StashListOptions{}) + r.Element.Height(200) + if action, ref, ok := r.Action(); ok { + _, _ = action, ref // run git stash apply, pop or drop + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleBlameView() { + var state mujica.BlameViewState + lines := []mujica.BlameLine{ + {Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Summary: "Add main", Text: "package main"}, + {Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Summary: "Add main", Text: "func main() {}"}, + } + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.BlameView(c, &state, lines, mujica.BlameViewOptions{Language: "go"}).Height(240) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleFileHistory() { + var state mujica.ListState[string] + commits := []mujica.Commit{{Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Subject: "Edit main.go"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.FileHistory(c, &state, "main.go", commits, mujica.FileHistoryOptions{}) + r.Element.Height(240) + if _, hash, ok := r.Action(); ok { + _ = hash // open the diff of main.go at hash + } + } + ui.Render(view, 400, 300, 1) +} + +func ExamplePullRequestCard() { + pr := mujica.PullRequest{Number: 42, Title: "Add git components", Author: "Sakiko", Head: "feature", Base: "main", + ChecksPassed: 3, Reviewers: []mujica.Reviewer{{Name: "Uika", State: mujica.ReviewApproved}}, Added: 120, Deleted: 8, Files: 6} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.PullRequestCard(c, pr, mujica.PullRequestCardOptions{}).Changed() { + // open the pull request + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleReviewComment() { + thread := mujica.ReviewThread{File: "main.go", Line: 12, Messages: []mujica.ReviewMessage{ + {Author: "Uika", When: time.Now(), Body: "Can this return early?"}, + }} + draft := "" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ReviewComment(c, thread, &draft, mujica.ReviewCommentOptions{}) + if text, ok := r.Replied(); ok { + thread.Messages = append(thread.Messages, mujica.ReviewMessage{Author: "Sakiko", When: time.Now(), Body: text}) + } + if r.Resolved() || r.Reopened() { + thread.Resolved = !thread.Resolved + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleDiffStat() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DiffStat(c, 120, 8, mujica.DiffStatOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleGitStatusBadge() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.GitStatusBadge(c, mujica.GitModified, mujica.GitStatusBadgeOptions{ShowLabel: true}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleCommandBlock() { + open := true + run := mujica.CommandRun{Command: "go test ./...", Output: "\x1b[32mok\x1b[0m example 0.4s", Duration: 400 * time.Millisecond} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommandBlock(c, run, &open, mujica.CommandBlockOptions{}) + if what, ok := r.Copied(); ok { + _ = what // "command" or "output" is on the clipboard + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleAnsiText() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AnsiText(c, "\x1b[1;32mPASS\x1b[0m 12 tests\n\x1b[31mFAIL\x1b[0m 1 test", mujica.AnsiTextOptions{}) + } + ui.Render(view, 400, 300, 1) +} diff --git a/examples/gallery/pages_git.go b/examples/gallery/pages_git.go index 103b0e7..4ac34b8 100644 --- a/examples/gallery/pages_git.go +++ b/examples/gallery/pages_git.go @@ -1,3 +1,298 @@ package main -var gitPages = []page{} +var gitPages = []page{ + { + ID: "301", Name: "DiffViewer", ZhName: "差异查看器 比较 diff", Category: "Git", + Demo: gitDiffViewerDemo, + Code: `var state mujica.DiffViewerState +from := "func main() {\n\tprintln(\"hi\")\n}\n" +to := "func main() {\n\tprintln(\"hello\")\n}\n" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DiffViewer(c, &state, from, to, mujica.DiffViewerOptions{Language: "go", SideBySide: true}).Height(240) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab focuses the list; arrows and Page Up/Down scroll. Fold buttons take Tab; Enter or Space shows the hidden lines.", + }, + { + ID: "302", Name: "InlineDiff", ZhName: "行内差异 词级差异", Category: "Git", + Demo: gitInlineDiffDemo, + Code: `view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.InlineDiff(c, "The court meets at noon", "The court meets at dusk", mujica.InlineDiffOptions{}) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Not focusable; each line is read with its full text.", + }, + { + ID: "303", Name: "ThreeWayMerge", ZhName: "三方合并 合并冲突", Category: "Git", + Demo: gitThreeWayMergeDemo, + Code: `var state mujica.ThreeWayMergeState +base, local, remote := "a\nb\nc", "a\nB1\nc", "a\nB2\nc" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ThreeWayMerge(c, &state, base, local, remote, mujica.ThreeWayMergeOptions{}) + r.Element.Height(280) + if done, total := state.Resolved(); r.Changed() && done == total { + _ = state.Result() // write the merged file + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab reaches the take buttons of each conflict; Enter or Space chooses. The list scrolls with the arrows.", + }, + { + ID: "304", Name: "ConflictResolver", ZhName: "冲突解决 冲突标记", Category: "Git", + Demo: gitConflictResolverDemo, + Code: `var state mujica.ConflictResolverState +text := "a\n<<<<<<< HEAD\nmine\n=======\ntheirs\n>>>>>>> feature\nb" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ConflictResolver(c, &state, text, mujica.ConflictResolverOptions{}).Changed() { + _ = state.Result() // save the file once every block is resolved + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab moves through each block's buttons; Enter or Space accepts a side; Undo clears the choice.", + }, + { + ID: "305", Name: "ChangesList", ZhName: "更改列表 暂存 未暂存", Category: "Git", + Demo: gitChangesListDemo, + Code: `var state mujica.ChangesListState +files := []mujica.ChangedFile{ + {Path: "main.go", Status: mujica.GitModified, Staged: true}, + {Path: "notes.txt", Status: mujica.GitUntracked}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ChangesList(c, &state, files, mujica.ChangesListOptions{}) + r.Element.Height(240) + if action, path, ok := r.Action(); ok { + _, _ = action, path // run git add or git restore --staged + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down choose a file, skipping group titles; typing jumps by name; stage buttons take Tab, Enter or Space.", + }, + { + ID: "306", Name: "CommitInput", ZhName: "提交输入 提交信息", Category: "Git", + Demo: gitCommitInputDemo, + Code: `msg := mujica.CommitMessage{} +busy := false +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommitInput(c, &msg, mujica.CommitInputOptions{Busy: busy}) + if r.Committed() || r.Amended() { + busy = true // run git commit, then clear busy + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Enter in the summary or Cmd/Ctrl+Enter in the description commits; Tab reaches Amend and Commit.", + }, + { + ID: "307", Name: "CommitGraph", ZhName: "提交图谱 泳道 分支图", Category: "Git", + Demo: gitCommitGraphDemo, + Code: `var state mujica.CommitGraphState +commits := []mujica.Commit{ + {Hash: "c3", Parents: []string{"c2", "b1"}, Subject: "Merge branch", Refs: []string{"main"}}, + {Hash: "b1", Parents: []string{"c1"}, Subject: "Feature"}, + {Hash: "c2", Parents: []string{"c1"}, Subject: "Fix"}, + {Hash: "c1", Subject: "Initial commit"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CommitGraph(c, &state, commits, mujica.CommitGraphOptions{}).Element.Height(240) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down/Home/End choose a commit; typing jumps by subject; Enter opens it.", + }, + { + ID: "308", Name: "CommitList", ZhName: "提交列表 提交历史", Category: "Git", + Demo: gitCommitListDemo, + Code: `var state mujica.ListState[string] +commits := []mujica.Commit{{Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Subject: "Add the commit list"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommitList(c, &state, commits, mujica.CommitListOptions{}) + r.Element.Height(240) + if hash, ok := state.Selected(); ok && r.Submitted() { + _ = hash // show the commit + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down/Home/End choose a commit; typing jumps by subject; Enter opens it.", + }, + { + ID: "309", Name: "BranchSelector", ZhName: "分支选择器 切换分支", Category: "Git", + Demo: gitBranchSelectorDemo, + Code: `branch := "main" +branches := []mujica.Branch{{Name: "main", Current: true}, {Name: "origin/main", Remote: true}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.BranchSelector(c, &branch, branches, mujica.BranchSelectorOptions{AllowCreate: true}) + if name, ok := r.Created(); ok { + _ = name // run git switch -c name + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Enter or Space opens; type to filter; Up/Down move; Enter chooses or creates; Escape closes.", + }, + { + ID: "310", Name: "BranchList", ZhName: "分支列表 上游 领先落后", Category: "Git", + Demo: gitBranchListDemo, + Code: `var state mujica.ListState[string] +branches := []mujica.Branch{{Name: "main", Current: true, Upstream: "origin/main", Ahead: 2}} +actions := []mujica.GitAction{{ID: "delete", Label: "Delete", Icon: "trash-2"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.BranchList(c, &state, branches, mujica.BranchListOptions{Actions: actions}) + r.Element.Height(200) + if action, name, ok := r.Action(); ok { + _, _ = action, name // run the action on the branch + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down choose a branch; row actions take Tab, Enter or Space.", + }, + { + ID: "311", Name: "TagList", ZhName: "标签列表 tag", Category: "Git", + Demo: gitTagListDemo, + Code: `var state mujica.ListState[string] +tags := []mujica.GitTag{{Name: "v1.1.0", Target: "a1b2c3d4", Annotation: "Release"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.TagList(c, &state, tags, mujica.TagListOptions{}) + r.Element.Height(200) + if _, hash, ok := r.Action(); ok { + _ = hash // show the tagged commit + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down choose a tag; the jump button takes Tab, Enter or Space.", + }, + { + ID: "312", Name: "StashList", ZhName: "贮藏列表 stash", Category: "Git", + Demo: gitStashListDemo, + Code: `var state mujica.ListState[string] +stashes := []mujica.Stash{{Ref: "stash@{0}", Message: "WIP on main", Branch: "main"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.StashList(c, &state, stashes, mujica.StashListOptions{}) + r.Element.Height(200) + if action, ref, ok := r.Action(); ok { + _, _ = action, ref // run git stash apply, pop or drop + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down choose a stash; Apply, Pop and Drop take Tab, Enter or Space.", + }, + { + ID: "313", Name: "BlameView", ZhName: "逐行追溯 blame 作者", Category: "Git", + Demo: gitBlameViewDemo, + Code: `var state mujica.BlameViewState +lines := []mujica.BlameLine{ + {Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Summary: "Add main", Text: "package main"}, + {Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Summary: "Add main", Text: "func main() {}"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.BlameView(c, &state, lines, mujica.BlameViewOptions{Language: "go"}).Height(240) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab focuses the code; arrows scroll; typing jumps to a line starting with the text. Hover the left column for details.", + }, + { + ID: "314", Name: "FileHistory", ZhName: "文件历史 单文件提交", Category: "Git", + Demo: gitFileHistoryDemo, + Code: `var state mujica.ListState[string] +commits := []mujica.Commit{{Hash: "a1b2c3d4", Author: "Sakiko", When: time.Now(), Subject: "Edit main.go"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.FileHistory(c, &state, "main.go", commits, mujica.FileHistoryOptions{}) + r.Element.Height(240) + if _, hash, ok := r.Action(); ok { + _ = hash // open the diff of main.go at hash + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Up/Down choose a commit; View changes takes Tab, Enter or Space.", + }, + { + ID: "315", Name: "PullRequestCard", ZhName: "拉取请求卡片 合并请求 PR", Category: "Git", + Demo: gitPullRequestCardDemo, + Code: `pr := mujica.PullRequest{Number: 42, Title: "Add git components", Author: "Sakiko", Head: "feature", Base: "main", + ChecksPassed: 3, Reviewers: []mujica.Reviewer{{Name: "Uika", State: mujica.ReviewApproved}}, Added: 120, Deleted: 8, Files: 6} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.PullRequestCard(c, pr, mujica.PullRequestCardOptions{}).Changed() { + // open the pull request + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab reaches the title link; Enter or Space opens the pull request.", + }, + { + ID: "316", Name: "ReviewComment", ZhName: "评审评论 代码评审", Category: "Git", + Demo: gitReviewCommentDemo, + Code: `thread := mujica.ReviewThread{File: "main.go", Line: 12, Messages: []mujica.ReviewMessage{ + {Author: "Uika", When: time.Now(), Body: "Can this return early?"}, +}} +draft := "" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ReviewComment(c, thread, &draft, mujica.ReviewCommentOptions{}) + if text, ok := r.Replied(); ok { + thread.Messages = append(thread.Messages, mujica.ReviewMessage{Author: "Sakiko", When: time.Now(), Body: text}) + } + if r.Resolved() || r.Reopened() { + thread.Resolved = !thread.Resolved + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab moves through the reply field and buttons; Cmd/Ctrl+Enter sends the reply.", + }, + { + ID: "317", Name: "DiffStat", ZhName: "差异统计 增删行数", Category: "Git", + Demo: gitDiffStatDemo, + Code: `view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DiffStat(c, 120, 8, mujica.DiffStatOptions{}) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Not focusable; read as additions and deletions.", + }, + { + ID: "318", Name: "GitStatusBadge", ZhName: "Git 状态标记 文件状态", Category: "Git", + Demo: gitStatusBadgeDemo, + Code: `view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.GitStatusBadge(c, mujica.GitModified, mujica.GitStatusBadgeOptions{ShowLabel: true}) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Not focusable; each badge is read by its status name.", + }, + { + ID: "319", Name: "CommandBlock", ZhName: "命令块 终端输出 退出码", Category: "Git", + Demo: gitCommandBlockDemo, + Code: `open := true +run := mujica.CommandRun{Command: "go test ./...", Output: "\x1b[32mok\x1b[0m example 0.4s", Duration: 400 * time.Millisecond} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.CommandBlock(c, run, &open, mujica.CommandBlockOptions{}) + if what, ok := r.Copied(); ok { + _ = what // "command" or "output" is on the clipboard + } +} +ui.Render(view, 400, 300, 1)`, + Keys: "Tab reaches the header; Enter or Space folds the output; the copy buttons take Tab.", + }, + { + ID: "320", Name: "AnsiText", ZhName: "ANSI 文本 终端颜色", Category: "Git", + Demo: gitAnsiTextDemo, + Code: `view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AnsiText(c, "\x1b[1;32mPASS\x1b[0m 12 tests\n\x1b[31mFAIL\x1b[0m 1 test", mujica.AnsiTextOptions{}) +} +ui.Render(view, 400, 300, 1)`, + Keys: "Not focusable; shows the text with its styles.", + }, +} diff --git a/examples/gallery/pages_git_cards.go b/examples/gallery/pages_git_cards.go new file mode 100644 index 0000000..3f6dc03 --- /dev/null +++ b/examples/gallery/pages_git_cards.go @@ -0,0 +1,134 @@ +package main + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func gitPullRequestCardDemo(c *ui.Context, log func(string)) { + type state struct { + st int + failed, disabled bool + } + s := ui.Local(c.Root(), "315", func() state { return state{} }) + navigationDemo(c, func() { + mujica.SegmentedControl(c, &s.st, []mujica.Segment{{Label: "Open"}, {Label: "Draft"}, {Label: "Merged"}, {Label: "Closed"}}, mujica.SegmentedControlOptions{Label: "State"}) + navigationCheck(c, &s.failed, "Failing check", log) + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + pr := mujica.PullRequest{Number: 318, Title: "Git components 301–320", Author: "Sakiko", State: mujica.PullRequestState(s.st), + Head: "feature/git", Base: "main", ChecksPassed: 12, ChecksPending: 1, + Reviewers: []mujica.Reviewer{{Name: "Uika", State: mujica.ReviewApproved}, {Name: "Mutsumi", State: mujica.ReviewChangesRequested}, {Name: "Umiri"}}, + Added: 2412, Deleted: 310, Files: 46} + if s.failed { + pr.ChecksFailed = 1 + } + if mujica.PullRequestCard(c, pr, mujica.PullRequestCardOptions{Disabled: s.disabled}).Changed() { + log(fmt.Sprintf("Open #%d", pr.Number)) + } + }) +} + +func gitReviewCommentDemo(c *ui.Context, log func(string)) { + type state struct { + thread mujica.ReviewThread + draft string + disabled bool + } + s := ui.Local(c.Root(), "316", func() state { + return state{thread: mujica.ReviewThread{File: "commit_graph.go", Line: 88, Messages: []mujica.ReviewMessage{ + {Author: "Uika", When: gitDemoTime, Body: "Should merge lanes reuse the parent's color?"}, + {Author: "Sakiko", When: gitDemoTime.Add(time.Hour), Body: "Yes, the first parent keeps it."}, + }}} + }) + navigationDemo(c, func() { + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + r := mujica.ReviewComment(c, s.thread, &s.draft, mujica.ReviewCommentOptions{Disabled: s.disabled}) + if text, ok := r.Replied(); ok { + log("Reply: " + text) + s.thread.Messages = append(s.thread.Messages, mujica.ReviewMessage{Author: "You", When: c.Now(), Body: text}) + } + if r.Resolved() { + log("Resolved") + s.thread.Resolved = true + } + if r.Reopened() { + log("Reopened") + s.thread.Resolved = false + } + }) +} + +func gitDiffStatDemo(c *ui.Context, log func(string)) { + type state struct{ added, deleted, blocks float64 } + s := ui.Local(c.Root(), "317", func() state { return state{added: 120, deleted: 30, blocks: 5} }) + navigationDemo(c, func() { + navigationSlider(c, &s.added, "Added", 0, 500, log) + navigationSlider(c, &s.deleted, "Deleted", 0, 500, log) + navigationSlider(c, &s.blocks, "Blocks", 1, 10, log) + }, func() { + mujica.DiffStat(c, int(s.added), int(s.deleted), mujica.DiffStatOptions{Blocks: int(s.blocks)}) + }) +} + +func gitStatusBadgeDemo(c *ui.Context, log func(string)) { + type state struct{ labels bool } + s := ui.Local(c.Root(), "318", func() state { return state{} }) + navigationDemo(c, func() { + navigationCheck(c, &s.labels, "Show labels", log) + }, func() { + ui.Row(c).Gap(16).Wrap().Children(func() { + for st := mujica.GitModified; st <= mujica.GitCopied; st++ { + mujica.GitStatusBadge(c, st, mujica.GitStatusBadgeOptions{ShowLabel: s.labels}) + } + }) + }) +} + +func gitCommandBlockDemo(c *ui.Context, log func(string)) { + type state struct { + open, failed, running bool + } + s := ui.Local(c.Root(), "319", func() state { return state{open: true} }) + navigationDemo(c, func() { + navigationCheck(c, &s.failed, "Failed", log) + navigationCheck(c, &s.running, "Running", log) + }, func() { + run := mujica.CommandRun{Command: "go test -run Git ./...", Duration: 3214 * time.Millisecond, + Output: "\x1b[32mok\x1b[0m \tmujicaui\t3.214s\n\x1b[33mwarn\x1b[0m slow test: TestCommitGraphVirtualized"} + if s.failed { + run.ExitCode = 1 + run.Output = "\x1b[31m--- FAIL\x1b[0m: TestDiffViewer (0.02s)\n\x1b[1mFAIL\x1b[0m\tmujicaui\t0.401s" + } + run.Running = s.running + r := mujica.CommandBlock(c, run, &s.open, mujica.CommandBlockOptions{}) + if r.Toggled() { + log(fmt.Sprintf("Toggled: open=%v", s.open)) + } + if what, ok := r.Copied(); ok { + log("Copied " + what) + } + }) +} + +func gitAnsiTextDemo(c *ui.Context, log func(string)) { + type state struct{ wrap bool } + s := ui.Local(c.Root(), "320", func() state { return state{} }) + navigationDemo(c, func() { + navigationCheck(c, &s.wrap, "Wrap", log) + }, func() { + ui.Column(c).Padding(12).Background(mujica.Tokens(c).Surface).Radius(4).Children(func() { + mujica.AnsiText(c, "\x1b[1mBuilding\x1b[0m mujica \x1b[2m(v1.1)\x1b[0m\n"+ + "\x1b[32m✓\x1b[0m 300 passed \x1b[31m✗\x1b[0m 2 failed \x1b[33m!\x1b[0m 1 skipped\n"+ + "\x1b[30m0\x1b[31m1\x1b[32m2\x1b[33m3\x1b[34m4\x1b[35m5\x1b[36m6\x1b[37m7\x1b[90m8\x1b[91m9\x1b[92mA\x1b[93mB\x1b[94mC\x1b[95mD\x1b[96mE\x1b[97mF\x1b[0m\n"+ + "\x1b[38;5;208m256-color\x1b[0m \x1b[38;2;125;32;52mtrue color\x1b[0m \x1b[4munderline\x1b[0m \x1b[3mitalic\x1b[0m \x1b[9mstruck\x1b[0m \x1b[7m inverse \x1b[0m\n"+ + "A long line that only breaks when wrapping is on, so the terminal layout of columns stays intact as it was printed.\n"+ + "Unknown escapes stay as text: \x1b[2K(cleared line)", mujica.AnsiTextOptions{Wrap: s.wrap}) + }) + }) +} diff --git a/examples/gallery/pages_git_demos.go b/examples/gallery/pages_git_demos.go new file mode 100644 index 0000000..8ad4b9b --- /dev/null +++ b/examples/gallery/pages_git_demos.go @@ -0,0 +1,367 @@ +package main + +import ( + "fmt" + "strings" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +var gitDemoTime = time.Date(2026, 10, 5, 9, 30, 0, 0, time.UTC) + +const gitDemoOld = "package court\n\nimport \"fmt\"\n\n// Greet welcomes a guest.\nfunc Greet(name string) {\n\tfmt.Println(\"Welcome,\", name)\n}\n\nfunc Leave() {}\n\nfunc Dance() {}\n\nfunc Bow() {}\n" +const gitDemoNew = "package court\n\nimport \"fmt\"\n\n// Greet welcomes a guest by title.\nfunc Greet(title, name string) {\n\tfmt.Println(\"Welcome,\", title, name)\n}\n\nfunc Leave() {}\n\nfunc Dance() {}\n\nfunc Bow() {}\n\nfunc Curtsy() {}\n" + +func gitDemoCommits(n int) []mujica.Commit { + out := make([]mujica.Commit, n) + authors := []string{"Sakiko", "Mutsumi", "Uika", "Umiri", "Nyamu"} + for i := range out { + out[i] = mujica.Commit{Hash: fmt.Sprintf("%016x%024x", uint64(n-i)*0x9E3779B97F4A7C15, n-i), Author: authors[i%5], + When: gitDemoTime.Add(-time.Duration(i) * 37 * time.Minute), Subject: fmt.Sprintf("Chapter %d of the chronicle", n-i)} + if i+1 < n { + out[i].Parents = []string{fmt.Sprintf("%016x%024x", uint64(n-i-1)*0x9E3779B97F4A7C15, n-i-1)} + } + } + if n > 0 { + out[0].Refs = []string{"main", "origin/main"} + } + return out +} + +func gitDemoGraph() []mujica.Commit { + cs := []mujica.Commit{ + {Hash: "e7", Parents: []string{"e5", "f3"}, Subject: "Merge branch 'feature/lanes'", Refs: []string{"main"}}, + {Hash: "f3", Parents: []string{"f2"}, Subject: "Color lanes by branch"}, + {Hash: "e5", Parents: []string{"e4", "h1"}, Subject: "Merge hotfix"}, + {Hash: "h1", Parents: []string{"e3"}, Subject: "Fix the overture timing", Refs: []string{"hotfix"}}, + {Hash: "f2", Parents: []string{"f1"}, Subject: "Draw merge lines"}, + {Hash: "e4", Parents: []string{"e3"}, Subject: "Tune the ballroom palette"}, + {Hash: "f1", Parents: []string{"e3"}, Subject: "Start lane layout"}, + {Hash: "e3", Parents: []string{"e2"}, Subject: "Add the commit list"}, + {Hash: "e2", Parents: []string{"e1"}, Subject: "Add the blame view"}, + {Hash: "e1", Subject: "Initial commit", Refs: []string{"v1.0.0"}}, + } + for i := range cs { + cs[i].Author = []string{"Sakiko", "Mutsumi", "Uika"}[i%3] + cs[i].When = gitDemoTime.Add(-time.Duration(i) * 2 * time.Hour) + } + return cs +} + +func gitDemoBranches() []mujica.Branch { + return []mujica.Branch{ + {Name: "main", Current: true, Upstream: "origin/main", Ahead: 2, Behind: 1}, + {Name: "feature/lanes", Upstream: "origin/feature/lanes", Ahead: 5}, + {Name: "fix/blame"}, + {Name: "origin/main", Remote: true}, + {Name: "origin/feature/lanes", Remote: true}, + {Name: "origin/release/1.1", Remote: true}, + } +} + +func gitDiffViewerDemo(c *ui.Context, log func(string)) { + type state struct { + viewer mujica.DiffViewerState + split, plain bool + context float64 + } + s := ui.Local(c.Root(), "301", func() state { return state{context: 2} }) + navigationDemo(c, func() { + navigationCheck(c, &s.split, "Side by side", log) + navigationCheck(c, &s.plain, "Plain text", log) + navigationSlider(c, &s.context, "Context", 1, 6, log) + }, func() { + lang := "go" + if s.plain { + lang = "" + } + mujica.DiffViewer(c, &s.viewer, gitDemoOld, gitDemoNew, mujica.DiffViewerOptions{SideBySide: s.split, Context: int(s.context), Language: lang}).Height(380) + }) +} + +func gitInlineDiffDemo(c *ui.Context, log func(string)) { + type state struct { + from, to string + mono bool + } + s := ui.Local(c.Root(), "302", func() state { + return state{from: "The court meets at noon in the east hall.", to: "The council meets at dusk in the east hall."} + }) + navigationDemo(c, func() { + navigationCheck(c, &s.mono, "Monospace", log) + }, func() { + if mujica.TextInput(c, &s.from, mujica.TextInputOptions{Label: "Old line"}).Changed() { + log("Old: " + s.from) + } + if mujica.TextInput(c, &s.to, mujica.TextInputOptions{Label: "New line"}).Changed() { + log("New: " + s.to) + } + mujica.InlineDiff(c, s.from, s.to, mujica.InlineDiffOptions{Mono: s.mono}) + }) +} + +func gitThreeWayMergeDemo(c *ui.Context, log func(string)) { + type state struct { + merge mujica.ThreeWayMergeState + disabled bool + } + s := ui.Local(c.Root(), "303", func() state { return state{} }) + base := "title: Overture\ntempo: 96\nkey: D minor\nlength: 4:10\nhall: east" + ours := "title: Overture\ntempo: 104\nkey: D minor\nlength: 4:10\nhall: east\nencore: yes" + theirs := "title: Overture\ntempo: 92\nkey: D minor\nlength: 4:30\nhall: east" + navigationDemo(c, func() { + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + r := mujica.ThreeWayMerge(c, &s.merge, base, ours, theirs, mujica.ThreeWayMergeOptions{Disabled: s.disabled}) + r.Element.Height(360) + if r.Changed() { + done, total := s.merge.Resolved() + log(fmt.Sprintf("Changed: %d of %d resolved", done, total)) + } + ui.Text(c, s.merge.Result()).Font("monospace").TextColor(mujica.Tokens(c).TextMuted) + }) +} + +func gitConflictResolverDemo(c *ui.Context, log func(string)) { + type state struct { + res mujica.ConflictResolverState + disabled bool + } + s := ui.Local(c.Root(), "304", func() state { return state{} }) + text := "# Program\n<<<<<<< HEAD\nOpening: Overture in D minor\n=======\nOpening: Prelude in G major\n>>>>>>> feature/program\nInterval: 15 minutes\n<<<<<<< HEAD\nFinale: Masquerade\n=======\nFinale: Ave Mujica\n>>>>>>> feature/program" + navigationDemo(c, func() { + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + if mujica.ConflictResolver(c, &s.res, text, mujica.ConflictResolverOptions{Disabled: s.disabled}).Changed() { + done, total := s.res.Resolved() + log(fmt.Sprintf("Changed: %d of %d resolved", done, total)) + } + }) +} + +func gitChangesListDemo(c *ui.Context, log func(string)) { + type state struct { + list mujica.ChangesListState + files []mujica.ChangedFile + disabled bool + } + s := ui.Local(c.Root(), "305", func() state { + return state{files: []mujica.ChangedFile{ + {Path: "commit_graph.go", Status: mujica.GitAdded, Staged: true}, + {Path: "internal/git.go", Status: mujica.GitModified}, + {Path: "docs/old.md", Status: mujica.GitDeleted}, + {Path: "notes.txt", Status: mujica.GitUntracked}, + {Path: "icons/svg/tag.svg", Status: mujica.GitRenamed}, + }} + }) + navigationDemo(c, func() { + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + r := mujica.ChangesList(c, &s.list, s.files, mujica.ChangesListOptions{Disabled: s.disabled}) + r.Element.Height(320) + if a, path, ok := r.Action(); ok { + log("Action: " + a + " " + path) + s.files = gitStage(s.files, a, path) + } + if r.Changed() && s.list.Selected() >= 0 { + log("Selected: " + s.files[s.list.Selected()].Path) + } + }) +} + +// gitStage applies a stage action to a copy of files. +func gitStage(files []mujica.ChangedFile, action, path string) []mujica.ChangedFile { + out := append([]mujica.ChangedFile(nil), files...) + for i := range out { + switch { + case action == "stage_all": + out[i].Staged = true + case action == "unstage_all": + out[i].Staged = false + case out[i].Path == path: + out[i].Staged = action == "stage" + } + } + return out +} + +func gitCommitInputDemo(c *ui.Context, log func(string)) { + type state struct { + msg mujica.CommitMessage + busy, disabled bool + until time.Time + } + s := ui.Local(c.Root(), "306", func() state { return state{} }) + if s.busy && c.Now().After(s.until) { + s.busy = false + s.msg = mujica.CommitMessage{} + log("Committed") + } + if s.busy { + c.After(s.until.Sub(c.Now())) + } + navigationDemo(c, func() { + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + r := mujica.CommitInput(c, &s.msg, mujica.CommitInputOptions{Busy: s.busy, Disabled: s.disabled}) + if r.Committed() || r.Amended() { + log(fmt.Sprintf("Submit: amend=%v title=%q", r.Amended(), s.msg.Title)) + s.busy, s.until = true, c.Now().Add(1200*time.Millisecond) + } + }) +} + +func gitCommitGraphDemo(c *ui.Context, log func(string)) { + type state struct { + graph mujica.CommitGraphState + big bool + } + s := ui.Local(c.Root(), "307", func() state { return state{} }) + small, big := gitDemoGraph(), gitDemoCommits(100000) + navigationDemo(c, func() { + navigationCheck(c, &s.big, "100,000 commits", log) + }, func() { + commits := small + if s.big { + commits = big + } + r := mujica.CommitGraph(c, &s.graph, commits, mujica.CommitGraphOptions{}) + r.Element.Height(380) + if hash, ok := s.graph.List.Selected(); ok && (r.Changed() || r.Submitted()) { + log(fmt.Sprintf("Selected %s, open=%v", hash[:min(7, len(hash))], r.Submitted())) + } + }) +} + +func gitCommitListDemo(c *ui.Context, log func(string)) { + type state struct { + list mujica.ListState[string] + loading bool + } + s := ui.Local(c.Root(), "308", func() state { return state{} }) + commits := gitDemoCommits(40) + navigationDemo(c, func() { + navigationCheck(c, &s.loading, "Loading more", log) + }, func() { + st := mujica.DataReady + if s.loading { + st = mujica.DataLoadingMore + } + r := mujica.CommitList(c, &s.list, commits, mujica.CommitListOptions{Status: st}) + r.Element.Height(360) + if hash, ok := s.list.Selected(); ok && (r.Changed() || r.Submitted()) { + log(fmt.Sprintf("Selected %s, open=%v", hash[:7], r.Submitted())) + } + }) +} + +func gitBranchSelectorDemo(c *ui.Context, log func(string)) { + type state struct { + branch string + create, disabled bool + branches []mujica.Branch + } + s := ui.Local(c.Root(), "309", func() state { return state{branch: "main", create: true, branches: gitDemoBranches()} }) + navigationDemo(c, func() { + navigationCheck(c, &s.create, "Allow create", log) + navigationCheck(c, &s.disabled, "Disabled", log) + }, func() { + r := mujica.BranchSelector(c, &s.branch, s.branches, mujica.BranchSelectorOptions{AllowCreate: s.create, Disabled: s.disabled}) + if r.Changed() { + log("Changed: " + s.branch) + } + if name, ok := r.Created(); ok { + log("Create: " + name) + s.branches = append(append([]mujica.Branch(nil), s.branches...), mujica.Branch{Name: name}) + s.branch = name + } + }) +} + +func gitBranchListDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "310", func() mujica.ListState[string] { return mujica.ListState[string]{} }) + actions := []mujica.GitAction{{ID: "checkout", Label: "Check out", Icon: "git-branch"}, {ID: "delete", Label: "Delete", Icon: "trash-2"}} + r := mujica.BranchList(c, s, gitDemoBranches(), mujica.BranchListOptions{Actions: actions}) + r.Element.Height(300) + if a, name, ok := r.Action(); ok { + log("Action: " + a + " " + name) + } + if key, ok := s.Selected(); ok && r.Changed() { + log("Selected: " + key) + } +} + +func gitTagListDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "311", func() mujica.ListState[string] { return mujica.ListState[string]{} }) + tags := []mujica.GitTag{ + {Name: "v1.1.0", Target: "9e3779b97f4a7c15", Annotation: "Five hundred components"}, + {Name: "v1.0.0", Target: "3c6ef372fe94f82a", Annotation: "The first hundred"}, + {Name: "nightly", Target: "daa66d2c7ddf743f"}, + } + r := mujica.TagList(c, s, tags, mujica.TagListOptions{}) + r.Element.Height(220) + if _, hash, ok := r.Action(); ok { + log("Jump to " + hash[:7]) + } + if key, ok := s.Selected(); ok && r.Changed() { + log("Selected: " + key) + } +} + +func gitStashListDemo(c *ui.Context, log func(string)) { + type state struct { + list mujica.ListState[string] + stashes []mujica.Stash + } + s := ui.Local(c.Root(), "312", func() state { + return state{stashes: []mujica.Stash{ + {Ref: "stash@{0}", Message: "WIP on main: lane colors", Branch: "main"}, + {Ref: "stash@{1}", Message: "Try serif headings", Branch: "feature/type"}, + {Ref: "stash@{2}", Message: "Blame hover experiment", Branch: "fix/blame"}, + }} + }) + r := mujica.StashList(c, &s.list, s.stashes, mujica.StashListOptions{}) + r.Element.Height(240) + if a, ref, ok := r.Action(); ok { + log("Action: " + a + " " + ref) + if a != "apply" { + var keep []mujica.Stash + for _, st := range s.stashes { + if st.Ref != ref { + keep = append(keep, st) + } + } + s.stashes = keep + } + } +} + +func gitBlameViewDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "313", func() mujica.BlameViewState { return mujica.BlameViewState{} }) + var lines []mujica.BlameLine + for i, l := range strings.Split(strings.TrimSuffix(gitDemoNew, "\n"), "\n") { + who := []mujica.BlameLine{ + {Hash: "9e3779b97f4a7c15", Author: "Sakiko", When: gitDemoTime, Summary: "Create the court package"}, + {Hash: "3c6ef372fe94f82a", Author: "Uika", When: gitDemoTime.Add(-48 * time.Hour), Summary: "Greet guests by title"}, + }[min(i/4%2, 1)] + who.Text = l + lines = append(lines, who) + } + mujica.BlameView(c, s, lines, mujica.BlameViewOptions{Language: "go"}).Height(380) + ui.Text(c, "Hover the left column for commit details.").TextColor(mujica.Tokens(c).TextMuted) +} + +func gitFileHistoryDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "314", func() mujica.ListState[string] { return mujica.ListState[string]{} }) + r := mujica.FileHistory(c, s, "court/greet.go", gitDemoCommits(12), mujica.FileHistoryOptions{}) + r.Element.Height(360) + if _, hash, ok := r.Action(); ok { + log("Diff at " + hash[:7]) + } + if key, ok := s.Selected(); ok && r.Changed() { + log("Selected: " + key[:7]) + } +} diff --git a/file_history.go b/file_history.go new file mode 100644 index 0000000..d13a1fb --- /dev/null +++ b/file_history.go @@ -0,0 +1,48 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// FileHistoryOptions configure a FileHistory. +type FileHistoryOptions struct { + // TimeFormat lays out commit times; empty means "2006-01-02 15:04". + TimeFormat string + Status DataStatus + Error string +} + +// FileHistory lists commits that changed path; Action "diff" opens one. +func FileHistory(c *ui.Context, s *ListState[string], path string, commits []Commit, opts FileHistoryOptions) GitListResult { + if path == "" { + panic("mujica: FileHistory needs a path") + } + k := Tokens(c) + u := Density(c).Unit() + layout := gitTimeLayout(opts.TimeFormat) + var r GitListResult + col := ui.Column(c).AlignItems(ui.Stretch).Gap(u * 2) + col.Children(func() { + ui.Row(c).AlignItems(ui.Center).Gap(u * 2).Children(func() { + ui.Icon(c, icons.Must("history")).Size(16, 16).TextColor(k.Ornament.Mix(k.Text, 0.35)) + ui.Text(c, path).Font(theme.MonoFont).FontWeight(600).SingleLine().MinWidth(0) + ui.Text(c, msg(c, "file_history.title")).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).Shrink(0) + }) + actions := []GitAction{{ID: "diff", Label: msg(c, "file_history.diff"), Icon: "arrow-left-right"}} + v := List(c, s, len(commits), ListOptions[string]{ + Key: func(i int) string { return gitCommitHash(commits[i]) }, + Label: func(i int) string { return commits[i].Subject }, + Status: opts.Status, Error: opts.Error, Empty: msg(c, "file_history.empty"), + }, func(i int) { + commitListRow(c, commits[i], layout) + gitRowActions(c, actions, commits[i].Hash, &r) + }) + v.Element.Grow(1) + r.changed, r.submitted = v.Changed(), v.Submitted() + }) + r.Element = col + return r +} diff --git a/file_history_test.go b/file_history_test.go new file mode 100644 index 0000000..21fcbac --- /dev/null +++ b/file_history_test.go @@ -0,0 +1,65 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestFileHistoryDiffAction(t *testing.T) { + var s ListState[string] + commits := gitHistory(3) + diff := "" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := FileHistory(c, &s, "commit_graph.go", commits, FileHistoryOptions{}) + r.Element.Height(240) + if a, item, ok := r.Action(); ok && a == "diff" { + diff = item + } + }, 700, 280) + if !tt.HasText("commit_graph.go") || !tt.HasText("History") { + t.Fatalf("header: %q", tt.Texts()) + } + r, _ := tt.Find("Commit number 2") + tt.ClickAt(700-30, r.Y+r.H/2) + if diff != commits[1].Hash { + t.Fatalf("diff %q", diff) + } + _ = tt.Click("Commit number 1") + tt.Key(0, ui.KeyUp) + if key, _ := s.Selected(); key != commits[1].Hash { + t.Fatalf("selected %q", key) + } +} + +func TestFileHistoryEmptyAndInvalid(t *testing.T) { + var s ListState[string] + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + FileHistory(c, &s, "a.go", nil, FileHistoryOptions{}).Element.Height(200) + }, 400, 240) + if !tt.HasText("No history for this file") { + t.Fatalf("empty: %q", tt.Texts()) + } + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + var s ListState[string] + FileHistory(c, &s, "", nil, FileHistoryOptions{}) + }, 300, 120, 1) +} + +func TestFileHistorySnapshot(t *testing.T) { + commits := gitHistory(3) + snapshot(t, "file_history", 640, 200, func(c *ui.Context) { + s := ui.Local(c.Root(), "list", func() *ListState[string] { return &ListState[string]{} }) + ui.Column(c).Padding(16).Children(func() { + FileHistory(c, *s, "internal/git.go", commits, FileHistoryOptions{}).Element.Height(170) + }) + }) +} diff --git a/git_status_badge.go b/git_status_badge.go new file mode 100644 index 0000000..b9b44a4 --- /dev/null +++ b/git_status_badge.go @@ -0,0 +1,72 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// GitStatus is a file's change state in version control. +type GitStatus int + +const ( + GitModified GitStatus = iota + GitAdded + GitDeleted + GitUntracked + GitRenamed + GitCopied +) + +var gitStatusKeys = [...]string{"modified", "added", "deleted", "untracked", "renamed", "copied"} + +// Letter is the git status code, as M. +func (s GitStatus) Letter() string { return string("MADURC"[gitStatusIndex(s)]) } + +func gitStatusIndex(s GitStatus) int { + if s < GitModified || s > GitCopied { + panic("mujica: unknown GitStatus") + } + return int(s) +} + +// GitStatusBadgeOptions configure a GitStatusBadge. +type GitStatusBadgeOptions struct { + // ShowLabel writes the status name beside the letter. + ShowLabel bool +} + +// GitStatusBadge marks a status by letter, outline and color. +func GitStatusBadge(c *ui.Context, status GitStatus, opts GitStatusBadgeOptions) *ui.Element { + k := Tokens(c) + name := msg(c, "git_status_badge."+gitStatusKeys[gitStatusIndex(status)]) + col := gitStatusColor(k, status) + row := ui.Row(c).AlignItems(ui.Center).Gap(Density(c).Unit() * 1.5).Shrink(0).Label(name).Role(ui.RoleImage) + if !opts.ShowLabel { + row.Tooltip(name) + } + row.Children(func() { + ui.Box(c).Size(18, 18).Shrink(0).Center().Radius(theme.ControlRadius).Border(theme.BorderWidth, col). + Children(func() { + ui.Text(c, status.Letter()).Font(theme.MonoFont).FontWeight(700).FontSize(FontSize(c, theme.CaptionSize)).TextColor(col) + }) + if opts.ShowLabel { + ui.Text(c, name).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).SingleLine() + } + }) + return row +} + +func gitStatusColor(k theme.Tokens, s GitStatus) ui.Color { + switch s { + case GitAdded: + return k.Success + case GitDeleted: + return k.Danger + case GitUntracked, GitRenamed: + return k.Info + case GitCopied: + return k.AccentText + } + return k.Warning +} diff --git a/git_status_badge_test.go b/git_status_badge_test.go new file mode 100644 index 0000000..2888fdc --- /dev/null +++ b/git_status_badge_test.go @@ -0,0 +1,65 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestGitStatusBadgeLettersAndNames(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Gap(8).Children(func() { + for s := GitModified; s <= GitCopied; s++ { + GitStatusBadge(c, s, GitStatusBadgeOptions{}) + } + }) + }, 400, 80) + for i, name := range []string{"Modified", "Added", "Deleted", "Untracked", "Renamed", "Copied"} { + if _, ok := tt.Find(name); !ok { + t.Errorf("no badge named %q", name) + } + if got := GitStatus(i).Letter(); got != string("MADURC"[i]) { + t.Errorf("letter %d = %q", i, got) + } + } + if !tt.HasText("R") || !tt.HasText("U") { + t.Fatalf("letters not shown: %q", tt.Texts()) + } +} + +func TestGitStatusBadgeLabelAndInvalid(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + GitStatusBadge(c, GitDeleted, GitStatusBadgeOptions{ShowLabel: true}) + }, 300, 80) + if !tt.HasText("已删除") { + t.Fatalf("label missing: %q", tt.Texts()) + } + defer func() { + if recover() == nil { + t.Fatal("unknown status did not panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + GitStatusBadge(c, GitStatus(9), GitStatusBadgeOptions{}) + }, 100, 50, 1) +} + +func TestGitStatusBadgeSnapshot(t *testing.T) { + snapshot(t, "git_status_badge", 520, 90, func(c *ui.Context) { + ui.Column(c).Padding(16).Gap(12).Children(func() { + ui.Row(c).Gap(10).Children(func() { + for s := GitModified; s <= GitCopied; s++ { + GitStatusBadge(c, s, GitStatusBadgeOptions{}) + } + }) + ui.Row(c).Gap(14).Children(func() { + for _, s := range []GitStatus{GitModified, GitAdded, GitDeleted} { + GitStatusBadge(c, s, GitStatusBadgeOptions{ShowLabel: true}) + } + }) + }) + }) +} diff --git a/icons/svg/archive.svg b/icons/svg/archive.svg new file mode 100644 index 0000000..47823fa --- /dev/null +++ b/icons/svg/archive.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/icons/svg/arrow-left-right.svg b/icons/svg/arrow-left-right.svg new file mode 100644 index 0000000..1b0e8bd --- /dev/null +++ b/icons/svg/arrow-left-right.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/icons/svg/chevrons-up-down.svg b/icons/svg/chevrons-up-down.svg new file mode 100644 index 0000000..629ee86 --- /dev/null +++ b/icons/svg/chevrons-up-down.svg @@ -0,0 +1,15 @@ + + + + diff --git a/icons/svg/git-branch.svg b/icons/svg/git-branch.svg new file mode 100644 index 0000000..85b3f96 --- /dev/null +++ b/icons/svg/git-branch.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/icons/svg/git-commit-horizontal.svg b/icons/svg/git-commit-horizontal.svg new file mode 100644 index 0000000..5ee4eb5 --- /dev/null +++ b/icons/svg/git-commit-horizontal.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/icons/svg/git-merge.svg b/icons/svg/git-merge.svg new file mode 100644 index 0000000..dc901a4 --- /dev/null +++ b/icons/svg/git-merge.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/icons/svg/git-pull-request.svg b/icons/svg/git-pull-request.svg new file mode 100644 index 0000000..d2540a1 --- /dev/null +++ b/icons/svg/git-pull-request.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/icons/svg/history.svg b/icons/svg/history.svg new file mode 100644 index 0000000..02ac266 --- /dev/null +++ b/icons/svg/history.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/icons/svg/message-square.svg b/icons/svg/message-square.svg new file mode 100644 index 0000000..4908056 --- /dev/null +++ b/icons/svg/message-square.svg @@ -0,0 +1,14 @@ + + + diff --git a/icons/svg/reply.svg b/icons/svg/reply.svg new file mode 100644 index 0000000..eb1eb3f --- /dev/null +++ b/icons/svg/reply.svg @@ -0,0 +1,15 @@ + + + + diff --git a/icons/svg/rotate-ccw.svg b/icons/svg/rotate-ccw.svg new file mode 100644 index 0000000..1d22d4a --- /dev/null +++ b/icons/svg/rotate-ccw.svg @@ -0,0 +1,15 @@ + + + + diff --git a/icons/svg/tag.svg b/icons/svg/tag.svg new file mode 100644 index 0000000..954f3f2 --- /dev/null +++ b/icons/svg/tag.svg @@ -0,0 +1,15 @@ + + + + diff --git a/inline_diff.go b/inline_diff.go new file mode 100644 index 0000000..bcbca60 --- /dev/null +++ b/inline_diff.go @@ -0,0 +1,66 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// InlineDiffOptions configure an InlineDiff. +type InlineDiffOptions struct { + // Mono sets the lines in the code font. + Mono bool +} + +type inlineDiffCache struct { + from, to string + a, b []internal.WordSpan + done bool +} + +// InlineDiff shows old and new lines with changed words marked. +func InlineDiff(c *ui.Context, from, to string, opts InlineDiffOptions) *ui.Element { + k := Tokens(c) + col := ui.Column(c).AlignItems(ui.Stretch).Shrink(0).Radius(theme.ControlRadius).Clip() + cache := ui.Local(col, "words", func() *inlineDiffCache { return &inlineDiffCache{} }) + w := *cache + if !w.done || w.from != from || w.to != to { + w.a, w.b = internal.WordDiff(from, to) + w.from, w.to, w.done = from, to, true + } + if opts.Mono { + col.Font(theme.MonoFont) + } + col.Children(func() { + inlineDiffLine(c, "−", msg(c, "inline_diff.removed"), w.a, k.Danger, k) + inlineDiffLine(c, "+", msg(c, "inline_diff.added"), w.b, k.Success, k) + }) + return col +} + +// inlineDiffLine shows one side with its changed words marked. +func inlineDiffLine(c *ui.Context, sign, name string, spans []internal.WordSpan, col ui.Color, k theme.Tokens) { + u := Density(c).Unit() + out := make([]ui.Span, 0, len(spans)) + plain := "" + for _, s := range spans { + plain += s.Text + sp := ui.Span{Text: s.Text} + switch s.Op { + case internal.DiffDelete: + sp.Background, sp.Strikethrough, sp.DecorationColor = col.Mix(k.Surface, 0.7), true, col + case internal.DiffInsert: + sp.Background, sp.Underline, sp.DecorationColor = col.Mix(k.Surface, 0.7), true, col + } + out = append(out, sp) + } + if len(out) == 0 { + out = append(out, ui.Span{Text: " "}) + } + ui.Row(c).AlignItems(ui.Start).Gap(u*2).Padding(u, u*3).Background(col.Mix(k.Surface, 0.9)).Label(name + ": " + plain). + Children(func() { + ui.Text(c, sign).Font(theme.MonoFont).FontWeight(700).TextColor(col).Shrink(0) + ui.RichText(c, out...).TextColor(k.Text).MinWidth(0) + }) +} diff --git a/inline_diff_test.go b/inline_diff_test.go new file mode 100644 index 0000000..1f78728 --- /dev/null +++ b/inline_diff_test.go @@ -0,0 +1,49 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestInlineDiffNamesAndShowsBothLines(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + InlineDiff(c, "The court meets at noon", "The court meets at dusk", InlineDiffOptions{}) + }, 600, 120) + if _, ok := tt.Find("Old: The court meets at noon"); !ok { + t.Fatalf("old line: %q", tt.Texts()) + } + if _, ok := tt.Find("New: The court meets at dusk"); !ok { + t.Fatalf("new line: %q", tt.Texts()) + } +} + +func TestInlineDiffCachesWords(t *testing.T) { + from, to := "a b", "a c" + var cache *inlineDiffCache + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + e := InlineDiff(c, from, to, InlineDiffOptions{Mono: true}) + cache = *ui.Local(e, "words", func() *inlineDiffCache { return nil }) + }, 300, 100) + first := &cache.a[0] + tt.Frame() + if &cache.a[0] != first { + t.Fatal("word diff recomputed without a change") + } + to = "a d" + tt.Frame() + if cache.b[1].Text != "d" { + t.Fatalf("new text not diffed: %+v", cache.b) + } +} + +func TestInlineDiffSnapshot(t *testing.T) { + snapshot(t, "inline_diff", 560, 200, func(c *ui.Context) { + ui.Column(c).Padding(16).Gap(12).Children(func() { + InlineDiff(c, "The court meets at noon in the east hall.", "The council meets at dusk in the east hall.", InlineDiffOptions{}) + InlineDiff(c, "return a + b", "return a - total", InlineDiffOptions{Mono: true}) + }) + }) +} diff --git a/internal/diff.go b/internal/diff.go index ccc9071..9b0f2af 100644 --- a/internal/diff.go +++ b/internal/diff.go @@ -1,6 +1,9 @@ package internal -import "strings" +import ( + "strings" + "unicode" +) // DiffOp says whether a diff line is kept, removed or added. type DiffOp uint8 @@ -119,6 +122,61 @@ func myers(out []DiffLine, a, b []string, ao, bo int) []DiffLine { return out } +// WordSpan is a run of a line that a word diff kept, removed or added. +type WordSpan struct { + Op DiffOp + Text string +} + +// WordDiff compares two lines by words: from holds kept and removed spans, to kept and added. +func WordDiff(a, b string) (from, to []WordSpan) { + add := func(spans []WordSpan, op DiffOp, s string) []WordSpan { + if n := len(spans); n > 0 && spans[n-1].Op == op { + spans[n-1].Text += s + return spans + } + return append(spans, WordSpan{op, s}) + } + for _, d := range LineDiff(wordTokens(a), wordTokens(b)) { + switch d.Op { + case DiffEqual: + from, to = add(from, DiffEqual, d.Text), add(to, DiffEqual, d.Text) + case DiffDelete: + from = add(from, DiffDelete, d.Text) + case DiffInsert: + to = add(to, DiffInsert, d.Text) + } + } + return from, to +} + +// wordTokens splits s into words, runs of spaces and single other characters. +func wordTokens(s string) []string { + var out []string + kind := func(r rune) int { + switch { + case r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r): + return 1 + case unicode.IsSpace(r): + return 2 + } + return 0 + } + start, prev := 0, -1 + for i, r := range s { + k := kind(r) + if i > start && (k != prev || k == 0) { + out = append(out, s[start:i]) + start = i + } + prev = k + } + if start < len(s) { + out = append(out, s[start:]) + } + return out +} + // DiffStats counts the added and removed lines of a diff. func DiffStats(d []DiffLine) (added, removed int) { for _, l := range d { diff --git a/internal/diff_word_test.go b/internal/diff_word_test.go new file mode 100644 index 0000000..29bdb1d --- /dev/null +++ b/internal/diff_word_test.go @@ -0,0 +1,38 @@ +package internal + +import ( + "slices" + "testing" +) + +func TestWordTokens(t *testing.T) { + got := wordTokens("let x_1 = foo(bar); ok") + want := []string{"let", " ", "x_1", " ", "=", " ", "foo", "(", "bar", ")", ";", " ", "ok"} + if !slices.Equal(got, want) { + t.Fatalf("tokens %q", got) + } + if wordTokens("") != nil { + t.Fatal("empty line has tokens") + } +} + +func TestWordDiff(t *testing.T) { + from, to := WordDiff("return a + b", "return a - total") + wantFrom := []WordSpan{{DiffEqual, "return a "}, {DiffDelete, "+"}, {DiffEqual, " "}, {DiffDelete, "b"}} + wantTo := []WordSpan{{DiffEqual, "return a "}, {DiffInsert, "-"}, {DiffEqual, " "}, {DiffInsert, "total"}} + if !slices.Equal(from, wantFrom) || !slices.Equal(to, wantTo) { + t.Fatalf("from %+v to %+v", from, to) + } + join := func(s []WordSpan) (out string) { + for _, w := range s { + out += w.Text + } + return + } + for _, p := range [][2]string{{"", "new text"}, {"old text", ""}, {"same", "same"}, {"中文 词语", "中文 句子"}} { + f, to := WordDiff(p[0], p[1]) + if join(f) != p[0] || join(to) != p[1] { + t.Errorf("%q→%q rebuilt %q→%q", p[0], p[1], join(f), join(to)) + } + } +} diff --git a/internal/git.go b/internal/git.go new file mode 100644 index 0000000..6d0f166 --- /dev/null +++ b/internal/git.go @@ -0,0 +1,76 @@ +package internal + +import ( + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// CodeSpans colors a code line; inBlock carries block comments. +func CodeSpans(k theme.Tokens, language, line string, inBlock bool) ([]ui.Span, bool) { + toks, open := Highlight(language, line, inBlock) + spans := make([]ui.Span, 0, len(toks)) + for _, t := range toks { + s := ui.Span{Text: t.Text, Color: k.Text} + switch t.Kind { + case TokKeyword: + s.Color, s.Weight = k.AccentText, 600 + case TokString: + s.Color = k.Success + case TokNumber: + s.Color = k.Info + case TokComment: + s.Color, s.Italic = k.TextMuted, true + case TokType: + s.Color = k.Warning + case TokPunct: + s.Color = k.TextMuted + } + spans = append(spans, s) + } + return spans, open +} + +// ansiLight and ansiDark are 16 colors readable on Surface. +var ( + ansiLight = [16]string{"#211C1D", "#A12635", "#326247", "#805714", "#355E80", "#7A3B78", "#2F6B6B", "#6A5B55", + "#6A5B55", "#B0303F", "#3B7352", "#8E6417", "#3F6E94", "#8A4787", "#367A7A", "#211C1D"} + ansiDark = [16]string{"#A89A95", "#F0A1AA", "#94C6A4", "#DFC080", "#9DBDDA", "#D9A6D6", "#8FCFCF", "#F2EBDD", + "#BCAEAA", "#F5B7BE", "#ADD6B9", "#E9CF99", "#B5CDE4", "#E4BDE2", "#A9DCDC", "#FFFFFF"} + ansiCube = [6]uint8{0, 95, 135, 175, 215, 255} +) + +// AnsiResolve resolves a color; ok is false for default. +func AnsiResolve(dark bool, col AnsiColor) (ui.Color, bool) { + switch col.Kind { + case AnsiRGB: + return ui.RGB(col.R, col.G, col.B), true + case AnsiIndexed: + i := col.Index + switch { + case i < 16 && dark: + return ui.Hex(ansiDark[i]), true + case i < 16: + return ui.Hex(ansiLight[i]), true + case i < 232: + i -= 16 + return ui.RGB(ansiCube[i/36], ansiCube[i/6%6], ansiCube[i%6]), true + default: + g := 8 + 10*(i-232) + return ui.RGB(g, g, g), true + } + } + return ui.Color{}, false +} + +// StripAnsi drops SGR escapes from s, keeping its text. +func StripAnsi(s string) string { + spans, _ := ParseAnsi(s, AnsiStyle{}) + var b strings.Builder + for _, sp := range spans { + b.WriteString(sp.Text) + } + return b.String() +} diff --git a/internal/git_test.go b/internal/git_test.go new file mode 100644 index 0000000..d5831b8 --- /dev/null +++ b/internal/git_test.go @@ -0,0 +1,41 @@ +package internal + +import ( + "testing" + + "mujicaui/theme" +) + +func TestAnsiPaletteReadable(t *testing.T) { + for _, k := range []theme.Tokens{theme.Light(), theme.Dark()} { + for i := range 16 { + col, ok := AnsiResolve(k.Dark, AnsiColor{Kind: AnsiIndexed, Index: uint8(i)}) + if !ok { + t.Fatalf("index %d unresolved", i) + } + if r := theme.Contrast(col, k.Surface); r < 4.5 { + t.Errorf("dark=%v color %d contrast %.2f", k.Dark, i, r) + } + } + } + if c, _ := AnsiResolve(false, AnsiColor{Kind: AnsiIndexed, Index: 196}); c.R != 255 || c.G != 0 || c.B != 0 { + t.Errorf("cube 196 = %v", c) + } + if c, _ := AnsiResolve(false, AnsiColor{Kind: AnsiIndexed, Index: 244}); c.R != 128 { + t.Errorf("gray 244 = %v", c) + } + if _, ok := AnsiResolve(true, AnsiColor{}); ok { + t.Error("default color resolved") + } +} + +func TestCodeSpansColorKeywords(t *testing.T) { + k := theme.Light() + spans, _ := CodeSpans(k, "go", "func main() // hi", false) + if spans[0].Text != "func" || spans[0].Color != k.AccentText { + t.Fatalf("keyword span %+v", spans[0]) + } + if last := spans[len(spans)-1]; last.Color != k.TextMuted || !last.Italic { + t.Fatalf("comment span %+v", last) + } +} diff --git a/messages_git.go b/messages_git.go new file mode 100644 index 0000000..445a4cd --- /dev/null +++ b/messages_git.go @@ -0,0 +1,114 @@ +package mujica + +func init() { + addMessages(map[string][2]string{ + "git_status_badge.modified": {"Modified", "已修改"}, + "git_status_badge.added": {"Added", "已添加"}, + "git_status_badge.deleted": {"Deleted", "已删除"}, + "git_status_badge.untracked": {"Untracked", "未跟踪"}, + "git_status_badge.renamed": {"Renamed", "已重命名"}, + "git_status_badge.copied": {"Copied", "已复制"}, + + "diff_stat.label": {"%d additions, %d deletions", "新增 %d 行,删除 %d 行"}, + + "command_block.copy_command": {"Copy command", "复制命令"}, + "command_block.copy_output": {"Copy output", "复制输出"}, + "command_block.exit": {"exit %d", "退出码 %d"}, + "command_block.no_output": {"No output", "无输出"}, + "command_block.output": {"Command output", "命令输出"}, + "command_block.running": {"Running", "运行中"}, + + "commit_list.empty": {"No commits", "没有提交"}, + + "branch_list.ahead": {"%d ahead of upstream", "领先上游 %d 个提交"}, + "branch_list.behind": {"%d behind upstream", "落后上游 %d 个提交"}, + "branch_list.current": {"current", "当前"}, + "branch_list.empty": {"No branches", "没有分支"}, + + "branch_selector.create": {"Create branch", "新建分支"}, + "branch_selector.empty": {"No matching branches", "没有匹配的分支"}, + "branch_selector.label": {"Branch", "分支"}, + "branch_selector.search": {"Search branches", "搜索分支"}, + "branch_selector.local": {"Local", "本地"}, + "branch_selector.remote": {"Remote", "远端"}, + + "tag_list.empty": {"No tags", "没有标签"}, + "tag_list.jump": {"Go to commit", "跳转到提交"}, + + "stash_list.apply": {"Apply", "应用"}, + "stash_list.pop": {"Pop", "弹出"}, + "stash_list.drop": {"Drop", "删除"}, + "stash_list.empty": {"No stashes", "没有贮藏"}, + + "blame_view.line": {"Line %d, %s, %s", "第 %d 行,%s,%s"}, + + "file_history.title": {"History", "历史"}, + "file_history.diff": {"View changes", "查看差异"}, + "file_history.empty": {"No history for this file", "此文件没有历史"}, + + "pull_request_card.open": {"Open", "开放"}, + "pull_request_card.draft": {"Draft", "草稿"}, + "pull_request_card.merged": {"Merged", "已合并"}, + "pull_request_card.closed": {"Closed", "已关闭"}, + "pull_request_card.files": {"%d files", "%d 个文件"}, + "pull_request_card.passed": {"%d checks passed", "%d 项检查通过"}, + "pull_request_card.failed": {"%d checks failed", "%d 项检查失败"}, + "pull_request_card.pending": {"%d checks pending", "%d 项检查进行中"}, + "pull_request_card.approved": {"approved", "已批准"}, + "pull_request_card.changes": {"changes requested", "要求修改"}, + "pull_request_card.review_pending": {"review pending", "待评审"}, + + "review_comment.placeholder": {"Write a reply", "写下回复"}, + "review_comment.reply": {"Reply", "回复"}, + "review_comment.field": {"Reply text", "回复内容"}, + "review_comment.resolve": {"Resolve", "解决"}, + "review_comment.reopen": {"Reopen", "重新打开"}, + "review_comment.resolved": {"Resolved", "已解决"}, + + "changes_list.staged": {"Staged changes (%d)", "已暂存的更改(%d)"}, + "changes_list.unstaged": {"Changes (%d)", "更改(%d)"}, + "changes_list.stage": {"Stage", "暂存"}, + "changes_list.unstage": {"Unstage", "取消暂存"}, + "changes_list.stage_all": {"Stage all", "全部暂存"}, + "changes_list.unstage_all": {"Unstage all", "全部取消暂存"}, + + "diff_viewer.added": {"Added", "新增"}, + "diff_viewer.deleted": {"Deleted", "删除"}, + "diff_viewer.fold": {"%d unchanged lines", "%d 行未更改"}, + + "inline_diff.removed": {"Old", "原文"}, + "inline_diff.added": {"New", "新文"}, + + "three_way_merge.resolved": {"%d of %d conflicts resolved", "已解决 %d / %d 个冲突"}, + "three_way_merge.ours": {"Local", "本地"}, + "three_way_merge.base": {"Base", "基准"}, + "three_way_merge.theirs": {"Remote", "远端"}, + "three_way_merge.result": {"Result", "结果"}, + "three_way_merge.unresolved": {"Unresolved", "未解决"}, + "three_way_merge.empty": {"No lines", "无内容"}, + "three_way_merge.take_ours": {"Take local", "采纳本地"}, + "three_way_merge.take_theirs": {"Take remote", "采纳远端"}, + "three_way_merge.take_both": {"Take both", "两者都要"}, + "three_way_merge.take_base": {"Keep base", "保留基准"}, + + "conflict_resolver.resolved": {"%d of %d conflicts resolved", "已解决 %d / %d 个冲突"}, + "conflict_resolver.broken": {"Conflict markers are not closed after line %d", "第 %d 行起的冲突标记未闭合"}, + "conflict_resolver.none": {"No conflicts", "没有冲突"}, + "conflict_resolver.title": {"Conflict %d · line %d", "冲突 %d · 第 %d 行"}, + "conflict_resolver.open": {"unresolved", "未解决"}, + "conflict_resolver.done": {"resolved", "已解决"}, + "conflict_resolver.current": {"Current", "当前"}, + "conflict_resolver.incoming": {"Incoming", "传入"}, + "conflict_resolver.take_current": {"Accept current", "采纳当前"}, + "conflict_resolver.take_incoming": {"Accept incoming", "采纳传入"}, + "conflict_resolver.take_both": {"Accept both", "两者都采纳"}, + "conflict_resolver.reset": {"Undo", "撤销"}, + + "commit_input.title": {"Summary", "提交标题"}, + "commit_input.body": {"Description", "提交说明"}, + "commit_input.count": {"%d of %d characters", "%d / %d 字符"}, + "commit_input.long": {"Summary is %d characters over the suggested length", "标题超出建议长度 %d 个字符"}, + "commit_input.commit": {"Commit", "提交"}, + "commit_input.amend": {"Amend", "修订"}, + }) +} diff --git a/pull_request_card.go b/pull_request_card.go new file mode 100644 index 0000000..e51706b --- /dev/null +++ b/pull_request_card.go @@ -0,0 +1,179 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// PullRequestState is where a pull request stands. +type PullRequestState int + +const ( + PullRequestOpen PullRequestState = iota + PullRequestDraft + PullRequestMerged + PullRequestClosed +) + +// ReviewState is a reviewer's verdict. +type ReviewState int + +const ( + ReviewPending ReviewState = iota + ReviewApproved + ReviewChangesRequested +) + +// Reviewer is a person asked to review. +type Reviewer struct { + Name string + State ReviewState +} + +// PullRequest is what a PullRequestCard shows; the caller fetches it. +type PullRequest struct { + Number int + Title string + Author string + State PullRequestState + Head, Base string + // Checks counts CI results. + ChecksPassed, ChecksFailed, ChecksPending int + Reviewers []Reviewer + Added, Deleted, Files int +} + +// PullRequestCardOptions configure a PullRequestCard. +type PullRequestCardOptions struct { + Disabled bool +} + +// PullRequestCard summarizes a pull request; Changed reports opening. +func PullRequestCard(c *ui.Context, pr PullRequest, opts PullRequestCardOptions) ChoiceResult { + if pr.Number <= 0 || pr.Title == "" { + panic("mujica: PullRequest needs a positive Number and a Title") + } + if pr.ChecksPassed < 0 || pr.ChecksFailed < 0 || pr.ChecksPending < 0 || pr.Files < 0 { + panic("mujica: PullRequest counts must not be negative") + } + k := Tokens(c) + u := Density(c).Unit() + small := FontSize(c, theme.CaptionSize) + card := ui.Column(c).AlignItems(ui.Stretch).Gap(u*2).Padding(u*4).Background(k.Surface). + Border(theme.BorderWidth, k.Border).Radius(theme.CardRadius).Disabled(opts.Disabled) + res := ChoiceResult{Element: card} + card.Children(func() { + ui.Row(c).AlignItems(ui.Center).Gap(u * 2).Children(func() { + pullRequestStateBadge(c, pr.State) + title := ui.ButtonBase(c).Justify(ui.Start).Gap(u*2).Padding(u, u).Radius(theme.ControlRadius). + Role(ui.RoleLink).Label(fmt.Sprintf("#%d %s", pr.Number, pr.Title)).Shrink(1).MinWidth(0).Cursor(ui.CursorPointer) + internal.Ring(title, k.Focus, theme.ControlRadius) + if title.Hovered() { + title.Background(k.SurfaceHover) + } + title.Transition(colorFade) + title.Children(func() { + ui.Text(c, pr.Title).FontWeight(600).SingleLine().MinWidth(0) + ui.Text(c, fmt.Sprintf("#%d", pr.Number)).TextColor(k.TextMuted).FontFeatures("tnum").Shrink(0) + }) + if title.Clicked() && !title.IsDisabled() { + res.changed = true + slog.Debug("mujica: pull request card open", "number", pr.Number) + } + }) + ui.Row(c).AlignItems(ui.Center).Gap(u * 2).FontSize(small).TextColor(k.TextMuted).Wrap().Children(func() { + ui.Text(c, pr.Author).FontWeight(600).TextColor(k.Text) + if pr.Head != "" && pr.Base != "" { + ui.Icon(c, icons.Must("git-pull-request")).Size(12, 12) + ui.Text(c, pr.Head+" → "+pr.Base).Font(theme.MonoFont).SingleLine().MaxWidth(320) + } + }) + ui.Row(c).AlignItems(ui.Center).Gap(u * 4).Wrap().FontSize(small).Children(func() { + pullRequestChecks(c, pr) + if len(pr.Reviewers) > 0 { + ui.Row(c).AlignItems(ui.Center).Gap(u * 2).Children(func() { + for _, r := range pr.Reviewers { + pullRequestReviewer(c, r) + } + }) + } + ui.Spacer(c) + ui.Text(c, fmt.Sprintf(msg(c, "pull_request_card.files"), pr.Files)).TextColor(k.TextMuted).FontFeatures("tnum") + DiffStat(c, pr.Added, pr.Deleted, DiffStatOptions{}) + }) + }) + return res +} + +func pullRequestStateBadge(c *ui.Context, st PullRequestState) { + k := Tokens(c) + u := Density(c).Unit() + icon, col, key := "git-pull-request", k.Success, "open" + switch st { + case PullRequestOpen: + case PullRequestDraft: + icon, col, key = "git-pull-request", k.TextMuted, "draft" + case PullRequestMerged: + icon, col, key = "git-merge", k.AccentText, "merged" + case PullRequestClosed: + icon, col, key = "circle-x", k.Danger, "closed" + default: + panic("mujica: unknown PullRequestState") + } + ui.Row(c).AlignItems(ui.Center).Gap(u).Padding(2, u*2).Radius(theme.ControlRadius).Border(theme.BorderWidth, col). + TextColor(col).Shrink(0).Children(func() { + ui.Icon(c, icons.Must(icon)).Size(14, 14) + ui.Text(c, msg(c, "pull_request_card."+key)).FontSize(FontSize(c, theme.CaptionSize)).FontWeight(600).SingleLine() + }) +} + +func pullRequestChecks(c *ui.Context, pr PullRequest) { + k := Tokens(c) + u := Density(c).Unit() + ui.Row(c).AlignItems(ui.Center).Gap(u * 3).Children(func() { + for _, ch := range []struct { + n int + icon, key string + col ui.Color + }{ + {pr.ChecksPassed, "circle-check", "pull_request_card.passed", k.Success}, + {pr.ChecksFailed, "circle-x", "pull_request_card.failed", k.Danger}, + {pr.ChecksPending, "clock", "pull_request_card.pending", k.Warning}, + } { + if ch.n == 0 { + continue + } + name := fmt.Sprintf(msg(c, ch.key), ch.n) + ui.Row(c).AlignItems(ui.Center).Gap(u).TextColor(ch.col).Label(name).Tooltip(name).Children(func() { + ui.Icon(c, icons.Must(ch.icon)).Size(14, 14) + ui.Text(c, fmt.Sprint(ch.n)).FontFeatures("tnum") + }) + } + }) +} + +func pullRequestReviewer(c *ui.Context, r Reviewer) { + k := Tokens(c) + key, icon, col := "pull_request_card.review_pending", "clock", k.TextMuted + switch r.State { + case ReviewPending: + case ReviewApproved: + key, icon, col = "pull_request_card.approved", "check", k.Success + case ReviewChangesRequested: + key, icon, col = "pull_request_card.changes", "circle-alert", k.Danger + default: + panic("mujica: unknown ReviewState") + } + name := r.Name + ": " + msg(c, key) + ui.Box(c).Size(28, 28).Shrink(0).Label(name).Tooltip(name).Children(func() { + Avatar(c, r.Name, AvatarOptions{Size: 24}).Absolute().Left(0).Top(0) + ui.Box(c).Size(14, 14).Radius(7).Background(k.Surface).Center().Absolute().Right(0).Bottom(0).TextColor(col). + Children(func() { ui.Icon(c, icons.Must(icon)).Size(10, 10) }) + }) +} diff --git a/pull_request_card_test.go b/pull_request_card_test.go new file mode 100644 index 0000000..caa4960 --- /dev/null +++ b/pull_request_card_test.go @@ -0,0 +1,82 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func pullRequestSample() PullRequest { + return PullRequest{Number: 318, Title: "Git components 301–320", Author: "Sakiko", State: PullRequestOpen, + Head: "feature/git", Base: "main", ChecksPassed: 12, ChecksFailed: 1, ChecksPending: 2, + Reviewers: []Reviewer{{Name: "Uika", State: ReviewApproved}, {Name: "Mutsumi", State: ReviewChangesRequested}, {Name: "Umiri"}}, + Added: 2412, Deleted: 310, Files: 46} +} + +func TestPullRequestCardShowsAndOpens(t *testing.T) { + opens := 0 + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if PullRequestCard(c, pullRequestSample(), PullRequestCardOptions{Disabled: disabled}).Changed() { + opens++ + } + }, 700, 240) + for _, name := range []string{"Open", "#318", "feature/git → main", "12 checks passed", "1 checks failed", "2 checks pending", + "Uika: approved", "Mutsumi: changes requested", "Umiri: review pending", "46 files", "2412 additions, 310 deletions"} { + if _, ok := tt.Find(name); !ok { + t.Errorf("missing %q", name) + } + } + if err := tt.Click("Git components 301–320"); err != nil { + t.Fatal(err) + } + tt.Key(0, ui.KeyEnter) + if opens != 2 { + t.Fatalf("opens %d", opens) + } + disabled = true + tt.Frame() + _ = tt.Click("Git components 301–320") + if opens != 2 { + t.Fatal("disabled card opened") + } +} + +func TestPullRequestCardStatesAndInvalid(t *testing.T) { + for st, word := range map[PullRequestState]string{PullRequestDraft: "Draft", PullRequestMerged: "Merged", PullRequestClosed: "Closed"} { + pr := pullRequestSample() + pr.State = st + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + PullRequestCard(c, pr, PullRequestCardOptions{}) + }, 700, 240) + if !tt.HasText(word) { + t.Errorf("state %d: %q", st, tt.Texts()) + } + } + for _, pr := range []PullRequest{{Title: "x"}, {Number: 1}, {Number: 1, Title: "x", Files: -1}, {Number: 1, Title: "x", State: 9}} { + func() { + defer func() { + if recover() == nil { + t.Errorf("%+v did not panic", pr) + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + PullRequestCard(c, pr, PullRequestCardOptions{}) + }, 300, 100, 1) + }() + } +} + +func TestPullRequestCardSnapshot(t *testing.T) { + snapshot(t, "pull_request_card", 640, 300, func(c *ui.Context) { + ui.Column(c).Padding(16).Gap(12).Children(func() { + PullRequestCard(c, pullRequestSample(), PullRequestCardOptions{}) + pr := pullRequestSample() + pr.Number, pr.State, pr.Title, pr.Reviewers, pr.ChecksFailed, pr.ChecksPending = 301, PullRequestMerged, "Diff viewer", nil, 0, 0 + PullRequestCard(c, pr, PullRequestCardOptions{}) + }) + }) +} diff --git a/review_comment.go b/review_comment.go new file mode 100644 index 0000000..5731307 --- /dev/null +++ b/review_comment.go @@ -0,0 +1,127 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strings" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// ReviewMessage is one comment of a review thread. +type ReviewMessage struct { + Author string + When time.Time + Body string +} + +// ReviewThread is a line-level review discussion. +type ReviewThread struct { + File string + Line int + Resolved bool + Messages []ReviewMessage +} + +// ReviewCommentOptions configure a ReviewComment. +type ReviewCommentOptions struct { + // TimeFormat lays out message times; empty means "2006-01-02 15:04". + TimeFormat string + Disabled bool +} + +// ReviewCommentResult is a built ReviewComment and its events. +type ReviewCommentResult struct { + Element *ui.Element + reply string + resolved, reopened bool +} + +// Replied returns the reply sent this frame. +func (r ReviewCommentResult) Replied() (string, bool) { return r.reply, r.reply != "" } + +// Resolved reports the Resolve button this frame. +func (r ReviewCommentResult) Resolved() bool { return r.resolved } + +// Reopened reports the Reopen button this frame. +func (r ReviewCommentResult) Reopened() bool { return r.reopened } + +// ReviewComment shows a line's review thread; *draft is the reply. +func ReviewComment(c *ui.Context, thread ReviewThread, draft *string, opts ReviewCommentOptions) ReviewCommentResult { + if thread.File == "" || thread.Line <= 0 || len(thread.Messages) == 0 { + panic("mujica: ReviewThread needs a File, a positive Line and a message") + } + k := Tokens(c) + u := Density(c).Unit() + small := FontSize(c, theme.CaptionSize) + layout := gitTimeLayout(opts.TimeFormat) + card := ui.Column(c).AlignItems(ui.Stretch).Background(k.Surface).Border(theme.BorderWidth, k.Border). + Radius(theme.CardRadius).Disabled(opts.Disabled).Clip() + res := ReviewCommentResult{Element: card} + card.Children(func() { + ui.Row(c).AlignItems(ui.Center).Gap(u*2).Padding(u*2, u*3).Background(k.Background).FontSize(small).Children(func() { + ui.Icon(c, icons.Must("message-square")).Size(14, 14).TextColor(k.TextMuted) + ui.Text(c, fmt.Sprintf("%s:%d", thread.File, thread.Line)).Font(theme.MonoFont).SingleLine().Grow(1).MinWidth(0) + if thread.Resolved { + ui.Row(c).AlignItems(ui.Center).Gap(u).TextColor(k.Success).Children(func() { + ui.Icon(c, icons.Must("circle-check")).Size(14, 14) + ui.Text(c, msg(c, "review_comment.resolved")).FontWeight(600) + }) + } + }) + for i, m := range thread.Messages { + ui.Column(c).Gap(u).Padding(u*3, u*4).Children(func() { + if i > 0 { + ui.Box(c).Height(1).Background(k.Border).Margin(0, 0, u*2, 0).Role(ui.RoleNone) + } + ui.Row(c).AlignItems(ui.Center).Gap(u * 2).Children(func() { + Avatar(c, m.Author, AvatarOptions{Size: 20}) + ui.Text(c, m.Author).FontWeight(600).SingleLine() + ui.Text(c, m.When.Format(layout)).FontSize(small).TextColor(k.TextMuted).FontFeatures("tnum") + }) + ui.Text(c, m.Body) + }) + } + ui.Box(c).Height(1).Background(k.Border).Role(ui.RoleNone) + ui.Column(c).Gap(u * 2).Padding(u * 3).AlignItems(ui.Stretch).Children(func() { + if !thread.Resolved { + in := TextArea(c, draft, TextAreaOptions{Placeholder: msg(c, "review_comment.placeholder"), Label: msg(c, "review_comment.field"), + MinHeight: 56, MaxHeight: 160, Disabled: opts.Disabled}) + send := in.Submitted() + ui.Row(c).Gap(u * 2).Justify(ui.End).Children(func() { + if Button(c, msg(c, "review_comment.resolve"), ButtonOptions{Variant: Secondary, Icon: icons.Must("check"), Disabled: opts.Disabled}).Clicked() { + res.resolved = true + } + if Button(c, msg(c, "review_comment.reply"), ButtonOptions{Icon: icons.Must("reply"), Disabled: opts.Disabled || strings.TrimSpace(*draft) == ""}).Clicked() { + send = true + } + }) + if send && !card.IsDisabled() && strings.TrimSpace(*draft) != "" { + res.reply, *draft = strings.TrimSpace(*draft), "" + } + return + } + ui.Row(c).Justify(ui.End).Children(func() { + if Button(c, msg(c, "review_comment.reopen"), ButtonOptions{Variant: Secondary, Icon: icons.Must("rotate-ccw"), Disabled: opts.Disabled}).Clicked() { + res.reopened = true + } + }) + }) + }) + if card.IsDisabled() { + res.resolved, res.reopened = false, false + } + switch { + case res.reply != "": + slog.Debug("mujica: review comment reply", "file", thread.File, "line", thread.Line) + case res.resolved: + slog.Debug("mujica: review comment resolve", "file", thread.File, "line", thread.Line) + case res.reopened: + slog.Debug("mujica: review comment reopen", "file", thread.File, "line", thread.Line) + } + return res +} diff --git a/review_comment_test.go b/review_comment_test.go new file mode 100644 index 0000000..f2b8711 --- /dev/null +++ b/review_comment_test.go @@ -0,0 +1,97 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func reviewSample() ReviewThread { + return ReviewThread{File: "commit_graph.go", Line: 88, Messages: []ReviewMessage{ + {Author: "Uika", When: gitTestTime, Body: "Should merge lanes reuse the parent's color?"}, + {Author: "Sakiko", When: gitTestTime, Body: "Yes, the first parent keeps it."}, + }} +} + +func TestReviewCommentReplyResolveReopen(t *testing.T) { + thread := reviewSample() + draft := "" + var replies []string + resolves, reopens := 0, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ReviewComment(c, thread, &draft, ReviewCommentOptions{}) + if s, ok := r.Replied(); ok { + replies = append(replies, s) + } + if r.Resolved() { + resolves++ + thread.Resolved = true + } + if r.Reopened() { + reopens++ + thread.Resolved = false + } + }, 600, 500) + if !tt.HasText("commit_graph.go:88") || !tt.HasText("Yes, the first parent keeps it.") { + t.Fatalf("thread: %q", tt.Texts()) + } + _ = tt.Click("Reply") + if len(replies) != 0 { + t.Fatal("empty reply sent") + } + if err := tt.Click("Reply text"); err != nil { + t.Fatal(err) + } + tt.Type(" Agreed. ") + tt.Key(ui.Cmd, ui.KeyEnter) + if len(replies) != 1 || replies[0] != "Agreed." || draft != "" { + t.Fatalf("replies %q draft %q", replies, draft) + } + _ = tt.Click("Resolve") + if resolves != 1 || !tt.HasText("Resolved") || tt.HasText("Reply text") { + t.Fatalf("resolve: %d %q", resolves, tt.Texts()) + } + _ = tt.Click("Reopen") + if reopens != 1 || !tt.HasText("Reply") { + t.Fatalf("reopen: %d", reopens) + } +} + +func TestReviewCommentDisabledAndInvalid(t *testing.T) { + draft := "Text" + acted := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ReviewComment(c, reviewSample(), &draft, ReviewCommentOptions{Disabled: true}) + _, replied := r.Replied() + acted = acted || replied || r.Resolved() + }, 600, 500) + _ = tt.Click("Resolve") + _ = tt.Click("Reply") + if acted || draft != "Text" { + t.Fatal("disabled thread acted") + } + for _, th := range []ReviewThread{{Line: 1, Messages: reviewSample().Messages}, {File: "a", Messages: reviewSample().Messages}, {File: "a", Line: 1}} { + func() { + defer func() { + if recover() == nil { + t.Errorf("%+v did not panic", th) + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + ReviewComment(c, th, &draft, ReviewCommentOptions{}) + }, 300, 100, 1) + }() + } +} + +func TestReviewCommentSnapshot(t *testing.T) { + snapshot(t, "review_comment", 560, 420, func(c *ui.Context) { + draft := ui.Local(c.Root(), "draft", func() string { return "" }) + ui.Column(c).Padding(16).Children(func() { + ReviewComment(c, reviewSample(), draft, ReviewCommentOptions{}) + }) + }) +} diff --git a/stash_list.go b/stash_list.go new file mode 100644 index 0000000..f505ca0 --- /dev/null +++ b/stash_list.go @@ -0,0 +1,58 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// Stash is one stash entry. +type Stash struct { + // Ref names the entry, as stash@{0}. + Ref string + Message string + Branch string +} + +// StashListOptions configure a StashList. +type StashListOptions struct { + // Status and Error show the load state. + Status DataStatus + Error string +} + +// StashList shows stashes with apply, pop and drop actions. +func StashList(c *ui.Context, s *ListState[string], stashes []Stash, opts StashListOptions) GitListResult { + var r GitListResult + k := Tokens(c) + actions := []GitAction{ + {ID: "apply", Label: msg(c, "stash_list.apply"), Icon: "check"}, + {ID: "pop", Label: msg(c, "stash_list.pop"), Icon: "upload"}, + {ID: "drop", Label: msg(c, "stash_list.drop"), Icon: "trash-2"}, + } + v := List(c, s, len(stashes), ListOptions[string]{ + Key: func(i int) string { return stashListKey(stashes[i]) }, + Label: func(i int) string { return stashes[i].Message }, + Status: opts.Status, Error: opts.Error, Empty: msg(c, "stash_list.empty"), + }, func(i int) { + st := stashes[i] + small := FontSize(c, theme.CaptionSize) + ui.Icon(c, icons.Must("archive")).Size(14, 14).Shrink(0).TextColor(k.TextMuted) + ui.Text(c, st.Ref).Font(theme.MonoFont).FontSize(small).TextColor(k.AccentText).Shrink(0) + ui.Text(c, st.Message).SingleLine().Grow(1).MinWidth(0) + if st.Branch != "" { + ui.Text(c, st.Branch).FontSize(small).TextColor(k.TextMuted).SingleLine().MaxWidth(140).Shrink(0) + } + gitRowActions(c, actions, st.Ref, &r) + }) + r.Element, r.changed, r.submitted = v.Element, v.Changed(), v.Submitted() + return r +} + +func stashListKey(s Stash) string { + if s.Ref == "" { + panic("mujica: Stash needs a Ref") + } + return s.Ref +} diff --git a/stash_list_test.go b/stash_list_test.go new file mode 100644 index 0000000..fd76dd0 --- /dev/null +++ b/stash_list_test.go @@ -0,0 +1,72 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func stashSample() []Stash { + return []Stash{ + {Ref: "stash@{0}", Message: "WIP on main: graph lanes", Branch: "main"}, + {Ref: "stash@{1}", Message: "Experiment with blame colors", Branch: "fix/blame"}, + } +} + +func TestStashListActions(t *testing.T) { + var s ListState[string] + var acted [][2]string + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := StashList(c, &s, stashSample(), StashListOptions{}) + r.Element.Height(200) + if a, item, ok := r.Action(); ok { + acted = append(acted, [2]string{a, item}) + } + }, 700, 240) + r, _ := tt.Find("Experiment with blame colors") + y := r.Y + r.H/2 + // Apply, Pop and Drop sit at the right end, 28 DIPs each. + for _, x := range []float32{700 - 90, 700 - 60, 700 - 30} { + tt.ClickAt(x, y) + } + want := [][2]string{{"apply", "stash@{1}"}, {"pop", "stash@{1}"}, {"drop", "stash@{1}"}} + if len(acted) != 3 || acted[0] != want[0] || acted[1] != want[1] || acted[2] != want[2] { + t.Fatalf("actions %q", acted) + } + for _, name := range []string{"Apply", "Pop", "Drop"} { + if _, ok := tt.Find(name); !ok { + t.Errorf("no %s button", name) + } + } +} + +func TestStashListEmptyAndInvalid(t *testing.T) { + var s ListState[string] + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + StashList(c, &s, nil, StashListOptions{}) + }, 400, 200) + if !tt.HasText("没有贮藏") { + t.Fatalf("empty: %q", tt.Texts()) + } + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + var s ListState[string] + StashList(c, &s, []Stash{{Message: "x"}}, StashListOptions{}).Element.Height(100) + }, 300, 120, 1) +} + +func TestStashListSnapshot(t *testing.T) { + snapshot(t, "stash_list", 640, 140, func(c *ui.Context) { + s := ui.Local(c.Root(), "list", func() *ListState[string] { return &ListState[string]{} }) + ui.Column(c).Padding(16).Children(func() { + StashList(c, *s, stashSample(), StashListOptions{}).Element.Height(100) + }) + }) +} diff --git a/tag_list.go b/tag_list.go new file mode 100644 index 0000000..7e14756 --- /dev/null +++ b/tag_list.go @@ -0,0 +1,50 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// GitTag is a tag and the commit it names. +type GitTag struct { + Name string + Target string + // Annotation is the tag message; empty for a lightweight tag. + Annotation string +} + +// TagListOptions configure a TagList. +type TagListOptions struct { + Status DataStatus + Error string +} + +// TagList shows tags; Action "jump" carries the target hash. +func TagList(c *ui.Context, s *ListState[string], tags []GitTag, opts TagListOptions) GitListResult { + var r GitListResult + k := Tokens(c) + v := List(c, s, len(tags), ListOptions[string]{ + Key: func(i int) string { return tagListKey(tags[i]) }, + Label: func(i int) string { return tags[i].Name }, + Status: opts.Status, Error: opts.Error, Empty: msg(c, "tag_list.empty"), + }, func(i int) { + t := tags[i] + small := FontSize(c, theme.CaptionSize) + ui.Icon(c, icons.Must("tag")).Size(14, 14).Shrink(0).TextColor(k.TextMuted) + ui.Text(c, t.Name).FontWeight(600).SingleLine().Shrink(0).MaxWidth(200) + ui.Text(c, t.Annotation).FontSize(small).TextColor(k.TextMuted).SingleLine().Grow(1).MinWidth(0) + ui.Text(c, gitShortHash(t.Target)).Font(theme.MonoFont).FontSize(small).TextColor(k.AccentText).Shrink(0) + gitRowActions(c, []GitAction{{ID: "jump", Label: msg(c, "tag_list.jump"), Icon: "git-commit-horizontal"}}, t.Target, &r) + }) + r.Element, r.changed, r.submitted = v.Element, v.Changed(), v.Submitted() + return r +} + +func tagListKey(t GitTag) string { + if t.Name == "" || t.Target == "" { + panic("mujica: GitTag needs a Name and a Target") + } + return t.Name +} diff --git a/tag_list_test.go b/tag_list_test.go new file mode 100644 index 0000000..5f4ada8 --- /dev/null +++ b/tag_list_test.go @@ -0,0 +1,64 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func tagSample() []GitTag { + return []GitTag{ + {Name: "v1.1.0", Target: gitTestHash(42), Annotation: "Five hundred components"}, + {Name: "v1.0.0", Target: gitTestHash(7)}, + } +} + +func TestTagListJumpAndSelect(t *testing.T) { + var s ListState[string] + jump := "" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := TagList(c, &s, tagSample(), TagListOptions{}) + r.Element.Height(200) + if a, item, ok := r.Action(); ok && a == "jump" { + jump = item + } + }, 600, 240) + if !tt.HasText("Five hundred components") || !tt.HasText(gitShortHash(gitTestHash(42))) { + t.Fatalf("row: %q", tt.Texts()) + } + if err := tt.Click("v1.0.0"); err != nil { + t.Fatal(err) + } + if key, _ := s.Selected(); key != "v1.0.0" { + t.Fatalf("selected %q", key) + } + if err := tt.Click("Go to commit"); err != nil { + t.Fatal(err) + } + if jump != gitTestHash(42) { + t.Fatalf("jump %q", jump) + } +} + +func TestTagListInvalid(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + var s ListState[string] + TagList(c, &s, []GitTag{{Name: "v1"}}, TagListOptions{}).Element.Height(100) + }, 300, 120, 1) +} + +func TestTagListSnapshot(t *testing.T) { + snapshot(t, "tag_list", 600, 140, func(c *ui.Context) { + s := ui.Local(c.Root(), "list", func() *ListState[string] { return &ListState[string]{} }) + ui.Column(c).Padding(16).Children(func() { + TagList(c, *s, tagSample(), TagListOptions{}).Element.Height(100) + }) + }) +} diff --git a/testdata/snapshots/darwin/ansi_text-dark.png b/testdata/snapshots/darwin/ansi_text-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0f36ef05500c59af98566a623b9e7866866c8837 GIT binary patch literal 20216 zcmdSAWpErpvn@Dc$rj6EW+sc7EM{hAW+n?PX0VtwVrB-5nVFfH`OSCl-raxuBHsSm ziHe@;?&+HDs?3w;WL1YN$cZC-!}$gP01zZ4eklO};IN?jFf2G|3w{z)3IND;Oa2m4 z@yI;ifYJCN{snWrvesU(;YhPoLWvIsHV}eS`(IPC}U!{j5 zJeNYP2C~2tC3@LdLFhy@$|L_b37f-%@8hD7AZJhilj`joV(j_EC4BQO?^|nD8c*t= zFms?F5i%@fXaENQ`Zt&X0PFwnUpqNa5F>2c+ZP-J)rLVuF!B`@Wqlg-8nvR&N{mdYYnv`#OOD~HehU)CHPZ&yDnvD};RF(0Q&>4I%qdAE#QX3G z>FYCoZTjXQQCgnHrKLG4Y!5vn|LA<$?h6%to*8p!&8&H0K@pBuWCqITG|sPSCl6<7 zhah6NxV(hyQBG}hpIYj7I}OH-VYAq2nW-^U`H?a+qfBKpKWy*p*}uZDWx(x;-@S;% zw->0=xV~u#2Y?^=>!x}XRGu6fc#|*`>HUcs&-^Z_UhqUvR#EXUl$8*ul$_{2HL*ZV zON+Ebtc_EqN$5GKZhmo66ROdwyM^INsE?tu<)k@p}jV4dCQ&v<(5qE zf{LVsj24r>+Lxa%gZ>A?5*R!HqGwvjkVsPL4j*W4l7SVOg?9le10=n-s`}d^S~5L_ zn!4QXRvxnBB3=S~e)V{`T54};X&8|u`%qPTd>6Z=x33l&X;!kb zK07@F`;Yw||7My`$vrVVI6$A-^4-`fXiiLo5Vn|V){h(rWNbPIjR|+g1h<K(w$IH(9h9t*Q3c>zet3(_%EGW-}~jwo9tqRVQ-?_D)d^XCl*>eI(8+_}bu=X?5Crjm}8__Jh+@*wpl(7OgmXKo}zfyOk$o>T36jqb#~0h+#73rWn<3 zv#Z{2!YDZ1GBGogyQd&lgRJ9AoVW_&KiH8c(q~{q=X5o*F)9^^EF~!`0;{Pl-A`gz zEEh759xb%Gszn?OfB(S7Qib8u6<>sp8VT8gWV=#lc`!{3fg)@aKfO5#txihc89pG4 zdselmmhg&M!%{5Ig@gN*tI&3rADQo+ZQeal}V<(h#JXxdosV zN?CbgR@B!YqA;PWhqFV2&UH#_#u_6~M;S)J}p*5yDx({-;{ph%Y{qo$`fQy}h+6C#%dkAH3(lf@a0JUYfW zJUOCXzTo4B>Em(sV&xsIQ)TdTM640vwy;H`ROQzXFh$P==l0vWFRV9AxAin)c?AJiYYl44EGiAnvR+G`*uIX8jIbBPfOQZW0 z!8~HHlhfUj{W=D(aqlXEw!44(*5cso90u4{$!@Y{PSQN9GmCOIF?n;nF$Yk| zlY<_OxKM!#mw}|GtO>PMCxD~0m#pLFrxjaSS=k|OBLwb$_k%4KDr(|oktxlOZ_3Jh zVfYzmM+E8gR(LuyQXaevLAlv$NH9i({B#kU?kyLcz`~*|9{&?JDI8xojN52PA5t&d zarYSkDWK@q5T3<+?g1}NzF5F$wm`9Z%HL!@^Pl=(1m!?19Go(hvN3i0=`Y24VT_5n z@pgp*W)9_?A1QWP-8TC7i2mJ*5AFt)7-=$-Mr^)imM5B0z<(nn1jPIMCOKJ&>e||o z?p^Urn&X3hfd2x;JVT9EullXv6KQpuU$CuhoZQw79I(Xr`0TD9Kd0@*^{ay?%;r9* zlBFh$vN17Jnx>W1)Z~0cO4`~&UPI!tvl%3n#+lf>m>Y2x2br*bef&j5wU;PEk_gX6NRsw$&ZKY$(i9jL^t$9zca83zJ>Dg`2I zX~ptm#{s#H#^R@EXD@Hjg9UiMB5k!MgM_K+rH0RmD8=8n>WkP`H$GL=RO>b9V7#pk zMdam|3iPWfU>a!UBcvq~&X<;S?_lXQf3%q$d?{+fBH+I2Nm;%2Q#&^WUyTos_R?#~ zOO7Z@OMmyOYB#hiE_6>$eY%*duaf(lys?;EacEW~6aaR?Crc|0CzQLJP}~9z9?*g7 z`4JHRy!RFr#XToND;gU)H(Q^;pj%&GPq4$cO#7nK7f;Tf@i15G3lA+cB@m0fx5qVH zuL4_vy+m+`8nQjNSyWI4k>li93Bm5IiMRBqA;%dGoMIzVwS|Snb zSQQ4@$o0d`Ec|P+G*DC$v)Y&2ez1)#62E-~4pI#4)7VY4OT$b{<-UJogUw@gh)i-4 z0q$Q`WA=JSU;xCcmZsap7-NsC$_zZ=0>a~YPC|N-LPrY{%k)x;1;v!CY^ggB_ww4X zNyO^vsyCFs#bW{3$J_FXmbP26PJ4EgxA3FeBH2ix{eVoAXv{{5_F%`m_q`X5)ryk) zP{gQ|7a#39a}PemI)EBb5T#}8hOIx3gRik`b8 z#-$vUa&k%z0gkKe<`nZpZ91S*+TU!+g#C;8hLrNMC{bmK7umFZj-DVdezd{Zw4WpP z^TQ|}0;3b{#VR!Q&Nv%})1k8PSdqx5OG{ao0iPQ)Ik3Bjs~=l%-HTt`+oa6@UAS+> zjVzEtjdPVst*k!#(fz60+PI~F5d>;p7d09c_FbF9L}3MvH<*mN-@n0YV6khLsyyOv z&z<5nHU0pBg=B*4-Q6=&F>up*P{ujo8{_Og(2M_?_ z*6blS=@%e=@P8yRJ_)c|bS9Cfz#jbFz@=~_lYxahgf4-CpKmWn-s)f&3%6ZI=XEa9 zQluNyR1$C)gQ`D%XoJLJ!oYwg%ApCuzCUdrm6+JK zEa6{K8sFCTGg-{q;(9v~Dr2y`3J%wnAW4LtkB-l#Twoz@xrJ zGclPio>u90I znS7YUSjESkf5L};gc?hnXB343_6t2Gj;hfiP-+xTn6_I4K1|* zH2{Sq*Q;MPJadvlQV?L+E1b2PObB3Lc!GL8 z@IUP4{&oh9CZPY>S}ETwzXj}3f@&srCY`V zeksJ|{36l4!>xE7u(xj(WqH^*N*mYnF0Ly=XT*g)wHj@A_rk(C#^Z8}Nv^W8D9Wp< zvx}CVKU*eba4MWR1~n`t6^4*u^rAmUSz1c7h2Rs2DQNV&|N1CAK*FeC?l|fb6V=vldcbHAQ9#y{?5_fM%x}}$g7xnfzJ zRwG9Z50&Fc^$=+8NK7tI8;2);7o6%V%rC`DgAb@4-8t7Q~8N6vs{0BY+zH9 z+gi9Y0Kn5+?e6sco$(X%_xxHo6>pYhz|9MFx7lx5cbb zW_vUZ&ttV#Mm7#ySu#{KRArw@z0%UszT4@OGs{ZNP915H#;PvnQ`hqomXz9iH*oNG zy><><>{B;4H-1lym@PvpfAVK`I+V)o$>d~TZrX{TtsWE6*3ZNOzuVHC z3>CwVF8eMn@OR?vZHBbp=Tj;RDjlD<Wq2qiUS-vkXhs8LXL2mjx9c}Jy7dK-W)TDil5907lWtp0k zXzM9H(9k@F=E#FO?L$wyzRs!nlCx)Q?CyG#O@^|dveS4m)AU)f$29FOX{4!ot6#Rh znKWLa^hERRF{kHV)BZV&o`D(-4L`3ExH&ufO2@f7+6Yja9M#RnjYfC?IoU}X*Jh|( zJ%2u}I$cwa5hWQ}T>9UEv9X{n80Z|s>z65*9A-6S^|(>_;m#KP0ryS&P zNCekp^2j4_!0skF7=Q`kBlxKl65R0YaN+K7(gb~UOcFCCX>oBeGCX{}>x7n=fn8W5 zEY?0Z3>JwaB{Oq;bzy8}dAY9sE(+e2F*wCQYg+atf>3ctIx7a+qVH>}9e!}=qj}Iv(mDzUpFq$@v&z*XtJVox* z!ny<2UzQ?Ky@dhf7|e^#0i#KIm*9x z7jezSb#=R{-D{1m2xm)e%Nl79_@TOwd~#%{@|j(*0HQ={`J7NbPmIOod0r_+0)cOA zii+_B=%oXM-y_#Lz7KWYNlFq(GoVbB6nPY@r5WQ(fXY1K2VQj4 zH#xbvyj%e+J@meWB_y<;&)~$RWkEsN$)Ona!_C;P16LJvcGhgMENBN|Lu3sVcb4P* z^UKoA6~8}2;@`hM=${T{of|867E8EeZC(>sZc0vG`(s#hGthLB$I5u-F)(w|vb zx>t#_&o5~Wtdrxxv9az8s~6Szo8SPwZXX+S>l5#hoWw-qs8U6-Lzp4YD!}g*L}jGQ ztpI@~1?22BIYB!-cRjosCtppGzFp~~GVSyH*HVaI}gmD1O7}TCaqe$2B|RJjNNJ?5d(UyrQm6dE4dH=+Y7)5uVR^A!GaG!oJzvYE`_Pxz_INjiKc#wcUS6B;+3Mlp-vQ|*qd?J(jSWo3tsXInQ!AS1 z0R39;s~K@2V!-bqr1$Zm7>ala4IDR`WNypTj=z7^G_gyEYu*+Y4~69QVPUUhnc2P} zMz43EPoU{&Yj@j>@Pd9Y1w2^%YX%R!#~4bky3i;r4DL8Hb;I*tv8X*fATdMPHmd2; zW3OFL{dCMa>!~tMA?X`8ibCA|PCMyaetG$r^Aa)0Y9-MsIJ_&YEG)ixy@D%8e7&t= zJ2KCFY!>T@56RZ&2%d;h&N?_cN`*ykbe*iN&;GOzXm4Gyz@@G4eeUWb-OBv}Am7|h zfNapIZgzQzpPX&Z@zKSV&D7400XnEx2^bR-uHQUJ-t*-nWo70f^WNE$tCs1Vuh*@6 z(8c;VQSS~n(%Xw-xKr&N(OaTup>MzQzT#{q-&X{nrlr2`UnURxWz;Wy2=S{c>SnVU z-@l4Dzoe-sNak>Fx6H!I!pa(Vo{LZJ4o&>Y%Btk@hMPSV%gG-rcO%50Z^f>g)d(xy z_ftntL#5857f(8p+0pUp3KAOq$B&)ll8deOKhe<_&*9%yw;+#Tn7FeDUVgTjqjmV8 z7nJ64D=ED@TXF%2ZhW<*r!0yZDo7Z=&>l+(fK;(WVQuN7qN2Zr`!1HH@dB-UF62V$v(q|~x))i^Zn}jo2}ho-^t=sHPD%5L%FTDX z{``dT5@fR{QA6^=@;R;Nto~4GGHGmc1Q~OIkJ-;J>+1HczE3j}l8yiXdq8znm5_!; zO-+qSQ=+uqC#9sM3P*m|=Mnh73b;VsER)4^5n0)V(10Zh*%}7=@-TUcBL6-2$qCw2 z6M?JA&Y}E#Qg&OH*a)BgsVSGJOfL5c+k?aBU=wAuzIuKbUpagOQCR?BU;toH)WdfuAM%!!`L8pz+RpsB!m(^Xau^+ilfoU?~sXS^Urg%s+t9qgT= z_}vc(-$@Av15B%II9NXc?S6{N$lb1_dAB-Zd&qXjrKG&XVb`w&aUm3x!vuoA^P%=z zm_I5iz+znC+p{17;!;ATBo6)GApzI?=gR6!f@G+bbc24MI${)GK5AW!^QWZRu)Y=?^hH@bTTRhtq<@CwYCweLmAyxw*6KY`HKx831a3jlV_;J;3bj z{GZt1xs68-oV(%;-+~BIOH1%wTn5kH2EHx*nY=UO^CsYzK$!#k@9vdvuf4wACGnIE``t=;Vf117Rtg6~r z6@wurvA(WDQGjrrA*hb(LjGZ=j>@8@sp)S0M9!=kzV05B9;T$E1j^|(I(*u=p=uk> z9KpG%1qOm65#-5DA+-_;?E7U3*sGbEvIP=FVsanu?;job|6Bg&`V!c;nSJE@F}M~5 z3Jkn{qbZ&PV79xE<;L?Ht`E^M^~H*%^GQFF+MK+H&HA{Tljftyzh_+=E8^O-*d@QA zeq{ulV6TAs(vsE7X^I*|ND_x=m}gLi zk6@5?su)x}p5x4g0a0Abl5#3)YAoCnp!t5yqN|gmBlL4ltQS6y>8uAyd|X^AIH07Y zg5g<(*EIq^O=e_tQnzhbQc-czZ8wuqe-(AJIEIA-;kp|cgMe+*3{Tu1%86oz3&d~$Mpo8Lo2Mbr<#wzK7n(^9nQLGrjN7YoJJ zRy(?O2|6BX>%^S50ksdG?nDodI*FcGMhyG*(NTH1HK)_Lj)Mi+q9wPZ%N3`yGD-Y1 z1^48%;L*-r+#cl&A{!>=(G98hU@Fed?QK$05){A3>5)Gs691XaMu(WTG(JE~%Iffh zMP1{}8{cfzeyvVS@OMtHfr*LV@}XyLVIh2mhx6o7Zd>}#EIA~^@J!B`SF@fVW&V_F z^Y=Z@8v6_ovwS9)V<`Zd|G9ejUSB)tr|x?==`Jt*b&89Zy8-?_70bRjg!GG^pV)Kc z_JK6`&t~TbH#$~5pWYBt@uEZ1nwom#Nz>^W5@fN-S1=YbvnJl+KT4KGnml$H# z6GTfZol824h?Z7eOIY8r7lFiQ*W&bVSPASz6-nk`obq zk}H(XCrp`Y_?+>8YV!?rHYZ4s{Y(ZLx{}kmLP5|M{#&r!J2-JzM4(RoPt*cKg&>2L zfdBt+;F>2aAS2SbF!-6#RCRCn03$hB5LSRw)CaP<(4yOj(O0>QxHACLKWOt0Y#{P0 zp!!#IY>K#$T1eKff8V>(8^Vr{j3XfSFnP@cJhB`^(dql&>QjjxHI2 zkZ}rU35ZixV)ZRr?0alP*V8k#8zUN9bO8fxq38_j6R?pjgW;{nm!@Y5de!We7SS#Y zDZ177oLdk2pPgq|WNx_eiHnz(o27@$3s+WY$speqK8%y?`!I_vQ~xwzIwOpLBR zpOaMUfeYxuK7{P599Z&fImg`fWw{l*#?+WF8Anp(v!jOyo4vg2=eU1U@mF{)7t6F= zG9iAj-lMZU1bs~TWJC$2>X+2i4KpUa%!<#+EGF+|2>z0@J6)ttZuP9?=%Pu{ZF9PF zRDhLkwV4qXM?X+ZC7J>khfy^JT7$Wd(b5jZuxA^YD{JYYq@q76 z2W&HYPfk>3vum?2?%-Ix{yp~ATw1@rl=SD$-iVbTGdcXbg&2W}wv%H5JZK&4swt!( zKVxC+-iE$%*3G(*x6`XArDDlpvMsBZHrADu(LhEaPEt$G?sgZ7lb=@TGf1A3LgzA_ zs^?LZ2QlK}83H_kZ~@K|y7&GL6kKgj&zH10eh&l*2?Hrrk^jqy`W(=LRxJ7|);s3m zRra}Fb$79hA(TZvrca^WqD7q|)BJQgXY{bL0DUT*pI_c}5&GwSK{LOwghsP1HzlzeQIHh*sy z4AA(1fL1|YD4vh~QQ`W)B~kd$Wp16JNKs-_63OZ0l-V@7w~Te)DPuH8Q2s^CtlalY zTvVTr@uhscG?VQ_SV5Zgi(N5#q8)@#49?oQKyt%|(SRhqpyrA0%*a@ZG0v z5PcSkL-{9ckETHF&xK8$0#(u!Fbqo!=;;!F%HZ+Kv}Z6lQm2OEs#H9tZTXSBOkZko zdn4{E1qp7HPit(OAD67(X9PuVOX|s%RlFqUa0f?Yb!bT z-1EJH)FCc%8QYl|XS45Nk?Owh7VTE1qLZOfn1)F)SIQoC8fT*hObj}=LrNY+rU&Dx zyoPm^u0o38mE<%tiSf~9T7xao=n*~aEu5*fV5$%Z40@MGON1jO!zbD}{?hP}BmqG| zg=CaX(_pIKq(*)v0wScO=1%Stzz?098k^2t-ScOhM`q6P9f8s98$@-;@zje)^h9TT0UzUP9c ztD-A9;`un9&38>kMpvDS42Vn036&bAcU|PIP^bKqtV@J<6;s@6%KclC<)SG4evygS{gQ3oDb{(6S?%4+|d;^kujTqe;ky zhc!l|@p2DQiZz7Y_}MG=#xwK)6&2Ngq@<~yix%^xi5K0jEkgg}cT6Y{S(Adu26jet zjHLJ(sXu<8UbZ=05^ag|2Kvag|5a`q7NWGx!S1d=sN2Pl6j%1VlRwkFsx#)==u4HYKbKFkGw2?iM?-lmmn@x zq_NYko4C40BqZD@2Mj^Ge*?blCgXa5Y3#MB2&qwUGjtU;tP84J419+ zCM2xV^Gko`m%iiEtEIObzfh<6m;|3M3d#qf>-zWWJ5?1`e|HW2IL?(UH~Kx4ZG>gl z8)*?n)sXa%rm*EeP?^sh4I)4rkKXSy;*ZI=lqpdB(@$1uPLGkC00Yn%Pt{M&x}|10 znGc$KE+y)w>n_Wa(!^N^K}!%b-TvA4FU<0Htc+s3C_E^4im@kSzYgD@|NWR6 z96ZE}JKla18j>Fp&=C>NciQOO@kdhyewFsg_i^7)rXiqil&;>9{S|uXYO61Qcht*@ z_q{`_s0~yqz#t>B%B<2w3Ka61yRU}$+v>dXlOI1>rn(zg9UYt`N1|yM4aH&`qbI0z zvtBei`-x_#RezS0SC(aS<>t+uC^q}^E|nA(_HWoib-{pvf!%luJ`1f(DJZJyswobb zK=JcSI^IN-r3Yw&5hI(~>QPk@JsdAjl*yaYsX5dwg@1F1Pee5-lWflACKCoP+2+rZ zvbDGTS(k0a>(^F?$o(Zgsrb5*cH|af*^|zry1_x7nKElvw9VAN5*ACI~Q~tc_oWg@i0E74%g&^(sgU zW)-%nT(YbW?<~p(2T0fy0{!WMGZxq{0>fiS2so@3eFojUMgRa=Q4!Avn`_`h%lf;# zGG$EhoFz4OiBwHMM}8(O_kq5O;O{UZmS`D;VjojaJ<|cQ<}@j>Q}Q&ZK%;*liG%qB zk9Fy@ng0sMZ(Sn?FSX6znCLS4#T-%#2Mm4(Hz+l<`wl~N6HgNu?=?)GjUS5Y;vYlK zz1O{;n9Ys+aI&;LX{enGgWPSmagkHhRC8NOVSHR`64P&&E1siIp(k%{PAOv9ssZH~ zpRQG6 zl*)|SVSHlLwh@!Na28ldVY6Lrvtv<*;JIJoD8wkv5YFV-z|eT4^3zmOXz+MW#}m|d zM?puo$02)O+*ozh^e0IInREpm(kIdV&?JSY2hh`o^02n$W zhRZ7ym}ejX!)H`uXH>@0RX_E}lMjDjB(q)Kgs-3foOA}FuO8T+tb5XQw7j21W*o@9 zsHxA6`G0)^^_Fp(7h@RB39@9Lf6MJ$z21^Lv>)AP@til?2?gz_Ed0PxPN? z3mf)D273(!q0jVR8~;-%i2oNg^l9DS!+x)vClvHZSofaUqWAVSl~-o@s0#unJgUDDWy0DP!CQ#tJBpfqH;BQ$*eZkEw&8ev=^*nvTe)|@ot-a>= z!W!m}^fk2U+9T>{`@v&NE9<2lK@ZlOQB%O2Px08Fj%h4Q$2@SXTrst2B+H6Z z!1xj+MlJ=3UK4~~s+6?Z)cZFr>&36WT|^UEF=#5q{mcBJ+4*Wbi>Gh$W6OCm%Xzcm zZbeFvC*ovWN=N;w(>RgIsmPwp`HfZc^EHszz|DazqGm!pak$HbSskKRI1sKv5&Sq_ zXrTm4H|Vq(8a8k|lb`wEvM-}qsiiJOWPcj$^0G=Wc5AYq*V_!9*A%{UVdUx!LYt6Z zDiVjMvZ>}_zkLJO$G1ZutNGmM+_dUkmC1UL49}cUBLwUX>9b^k-9vP1ZtmiFh7U9s zQFvsKSk^6ddz;fK@VQ687wBfEJ(2t$63~MZ1eLSNBeS}u8wpSlAt^^2N7_IK1H9u8 zr`{msE7){X>m^!D+Je!7eH;~jLxB3%)m)$*fX9@Cy;~^;aA2LgVV+*?pGL$~gikC` zW~1_rG>qA1r$T}W!=<2_F5S{H5>zzVd5?V}sRrwG|tYuUGVgNXN2 z_Jk&R^fm`W0{An+s#2i5Gt0L7TCdX!+7aqM=rKw95UTHmX>UZls z@XLwWkkKgUYnx;_waG`Q?7&5qO>k zf?(m^Zg!tO+fKM?)}VZeMAbN~O>Uza%(=G&(IJ95O|*!lV*^IlxO(>1)Ecz89|&?l zxO6;DwMW(a1Pk+=W-p!1*~E}Gi|+GE3v<~6shd=r&lqj9AGUZI7>^2wH%dGib4b!R zSTVr!S<3s zxq%L;vX&oe7yN?UI*e*l0U`m-!?!m))exzw(`QT-7LZCYGaNl(SF>u849+(u7fLS^ zBdp{g90WZHE{%QqAo$$`Wnsgb>5~6||+Y`6u*r`1Z}b`JwDf#cI>f$B^K zg6CiU50lfd;Q+wzJxV`kSJzWaf1*+XgvOg zkDUTmO7YORZ3b@q50E9Faa`JTK};Cm_A{dmiG%UUy}!BGYHYb}W^1!olEC8i)qt7_ zbwh##ygNS>opCHvb%0Fz%Xl%A;4*=d%hP;n;M3=pql%Aowb|bN;ndYGG8w{~LsBPe z#U3!8-Au<)&oHE~V9?XS#R7tcq|wtt>t^-Jl?pY1C#0pQ^^W8^8n1HZ(9u*B&{DKr ztDb!Fuk+Q$xkSpBlxiJkM>ik;^L7#FCkOx;#fDb1;ZYt$hHb@4@b$q#va&hdyU|D{ zLEibp;eo(fgXz_Wcj+Ty6DbMIB0H!1=TfVuP1j#p-0qF`t0C*9D`ZH=lU=w)PMw0) zyNw-M_3AS!-DpQKW$s>+a9|G5ZUi9WfrzfM6Ijfb`Df%yH@0h>s@+QTYwGnQWTbavdNuVE&)(r3^ z8*^hF9e($w68NrKMzvooE=-7f`i3$q_sGap2F)1k3oaB2d;Sa7Eh`CQE*&{LnSin(i>95KkFkvthHlX(|6v|ALs_fVqDkR8U+*49Bu;r}`?G7&)P{NmK>zeCNP^T?F zGqE)_xwu;8`@CEU`Dm27F_#;5*78I)OB19Bi%lm##dSa77KvI-AKLq1Ow9yZJ$Zos z9@W0y>^M#&8*RQ%&*57-I++x*cz3j;mW8}m8#%x0L^mx1cwLt-Lj`|~GTbl}XI{p2H#UP%T4^AE~jnoVv5H}Hk!=JK? zDxVcYO<(Tdo}!|~?(@{&6QIWO$Q0(}(HHo>A_@<>Bc`mnmSq^R7u1 zCP?pIe<(KyC2A7r?Sy6Hl15K@=yDyjSDt$N7Vq= zW7X!yM!Sa-X`d_qG;dO>@%fFSqPJwM6^uO!a6~Gfmld||71!yubw`ZNCmu;wr38^~ z7RmVb9$c4#CHI9hSDZufiT*w+<-#ghq2MD>xG2fqR)=$2e$*tvI#JjL7Zu2OB6t;t zVeJA@P{#L_ZH=6lEh|D2{%~6R&z4h@`Yyzd-Rul$me1UT{u@&sh4Hi`_=}35Wf|71 zheI$J#ch~DYFep%lQ_2ZplUxui%>iVh0b<76tLhE<#`llTZvzRO@cm15lSx5Dpu18{husq(Q#_$=tMKd^^?!r}MtdBc#$;STg?)J%`v%MD!&JJ^LG zRhb(C^L}tgfJfm{@K({3sY>Z-B1691W;AwZ#Rwsj-HfLB?HIOqzX=g-KfxljxeK_S zw_pQ)&nU*1tNR)5b4f=Mv_HS>qMu*T)91YIaB_r$X3^_$ITG#HWwJTUL+TUz zhH~g)+TV9E-9d}G;R{Y-j5C9vtj*IiZb&62ey769pHi+0P7%#TinhPD1jh?KEcXZVYJ zZ;}k^NULvN_0?47tVAIN0w4M6zgE>$M@DIBT8)@4gPuHijYj8NN2s3^fAD>rAq8x_ zw~nR+MZ0EzW^w@l7^IK+Twz9%T8E=Y3rL~YM+AIc7vb5)H3*W|uz~z8Utz`pa1O(yTNM5hoRTs!^Z@Bh!9)zeJ&+{B) z13mwIBWI%Ub9zboozCapPX+GPUfWbOLs_}-W7k$Ti%_4rQhFlr``@v*VTddl%D1KO z9tCn5Yhe~jp=5l<)Gz?1E2KS5*eJ`jkkxxKOK#ivpl4nu4ReM-RM%-O_hIjeL2z}fx}TqruNvsR zOLVD5sZN(0Jau!*yfAzb>9JASbBT(;?Cgd8aG6QeMV9@Yf`>r%6bMd5S=NK;R%h62ZLv2xj?#6FEdG&&U&pt%jYCS-q13-q+1?b)((gVD^jq zYiODWCP^s5^X?eim8k659HmSDb%3AWV3Iz)B?4+6E(tVBFCKxWDQ$j%oE9c+biwkC z_`ki_C^Z44(99`RA5<0FUURzV27vh|qijjha<_{bxnFtQ(N)iFZ@;oFWb~jQx+(9U z7_h=pZZL)5#%_y}Hp1u#VVuw4bU*~SYp2Nkk2evsuLax=#)FP!#Th40F>9H~Q@GKU zq-9A~z>hwv7DM$s<@kwJE2|W!vs8*Ql;6jvrVO)Shkp)*MbxP-^^WiLm3bB)D8)r~{bbU7ei5I!(s$*UF5hAzJPh z`KAmzg+bgrxqQhogq;QL=@`XAXF!ex9BgZ4ByW+Q0wZHp4xuXL6$^Q$Shu~2QZBp8 z=U{clxZCeGmU@mKXX)P}5pxHeQ4eyBd1^xeKG#7r`;*iuJZGr5nrCy~D?t;v>v`Y4 zy}VkPLMyalyaqz}vj#4qHy%{B+Wel=qhJ~io39b)4{AlQ$zaaJaCuFjp`1ixYVHz6 zx;0gyU_j?y>55w-n-W*X*}F|?%Q|M%$x8AwPxb<$nM-&AKIPWU{Qd|N+Ebm*+dtxl z044zPR5M!!{3T9L8-0ahex}*P#H5C9XgM}Ml2Cmq4piSJ2|*w#0?ff6lgwro6TkI5 zc+WR-A11}0)WrZ&QwjNXaELHNANO8Jr4Xz9a4(XA6?`4V0K-4Yw4?k-O6fL-PU$GX zgoPU(_gfaawb#tW{c@@K2r1Mb8W8++p=sUEAtN9yHKtZ=nw4X_s^Nxk ztg`N4lH>^CWt~foZvowPv07x#%e>HZVM8}Q;pCL#1a&@CUfJHi@Nz8QU7^!BQu7){ zCYk69LSBwi29L&v9;WeM#?uxJeizYmR)mDr?x9GZ7cxzo za`u@Sw97opG|3A=Fi#-fJO5=+R&K3=5CfUJSgS(|1tsd%v=}My6>ONQI-@P0$!km$ z^7lW8DT~~9`gsd0FDuMHHKAmF&19~!y_9`Zb$Ca@%l1YJES~+-xxvauzM5EiuAfra zo5S@U{>g?;!`d2_y4*Urq11fRrWquLOU#h+zbG+v?sIT15hv=K@jGH4_ zceiz>+ViRcv~*H8pJi`>vq?(;uO2M5^$Le|Xe5n=Qr~n)Z+dL5a3`@u;g>#WFRkTo zp0uSc%z8!0j3!ZwJzuCpo}36+5#|(4S`sNB_^uLkHnV6_V;zgT=g0B9UyH`TabZR1 ziqcqCiC{4tSsed6duib;+@3U3FW)Su-8Ymd7-W=Dw{iGh$>14qv4P`#cyi+syI`n- zCDAt2L#1?;Q_xgDtbTRu4T?&X0e27Ul_z`2<0AcQgGFw$y-u0>HvuTA7>g?J$6W(!#DN5y2o3X}(%dY~g-;b2qqf1@9`4oU6%0 zVU^Wy@z5-0DYK3SrXf1CvjzaZ5UZ*tK{S$#Vd`5%C_;4H$Pc)1jwtRbsY<1C@n48Z zQl>xC-p^k&D*slLm?S2KKEQkWkGJP-K!^mk7nz%2bDP;9m}=9~(UfkjZVP=d!(Z%9 zal2;W;fEkZOUO@+j!rI|9PcN+fv)&!HIg(_n@kEf#>cZk`ttZ!m_r{d1!Tu+WYwya zVVD~8FY0DJg63iS(;M_Uk@kcRFnEe#)4_&Cgh&1cWxZ&Z!(~h&JEzaMHQlQGcC1=) zqd=jqqEhpeSJ8n=6bAg$`g@L3UDRHcraZ;J6M3Mf;#?<)u>EDxz-o#keU-)3tTd>l z_xSpbbO#jBvB1@W$0*&@ZkR&mi7~UU1)^(Nmwkdc>%B`Fx{IO319XDU+icBJuQ+0< z1QtdeL~+6Bmva40?z&q{6bqifu9?inh*o-|z#`oo- zjMn8=dM48xA~gtv?M>v&t=F`>}@n!$?wboncnTv%yz@BIGhbJnB* zLC=#>7Cu)84@xO~JTJOY#rjfMUXaWF3Bc-LQWWT7Yv!Svx16-pSQiwIhURlYE3TY?-!IOfj2kz> z&`s31jWgrBjj1gyS|N(ZLCaQ_L8-lS*h}bj*y)Fu8;dM-<7VM3|vyTyhzgK^V;B z^2WI28isNi%ru-|=RLjaeg8XuynmjxervDa`mMFsde(mSZ#~cR+28#r!53>$Sbk4i zyi`KA5#}iYe%h@{zBV)*iIhk<%rUPnao(z;=dEmhNYD5%S6z1f<1oPez??QhDlL?g zERb=K6aNkjb~cE}cXCx5q0F8lX;?>L26#X&?9ZnMao?us3yzttK{B zn$3Q4deOsRN-9fC8&_KkZ}JXaJ7l8^;k>MMk%Xwi+;bfLPvFG+jQv;|=j>BGt_BD- zIk>TOH-7^^(PLYg| zK=G1Zk!aP`t-ICxnGya0NV44WhC`DFWC zSSmn~8g?v)9QaWxjwUi&q%1BW4LJ^!MnwOcz5~aQ44$^}$R{4^o={#`a=p&pD^f}9 z9W<8#IwM)2jYtx?3jX@3DdMu%-_>}k% z2KBewAwMT}kycw5u3ycQcYHS0ryacTXpyXh&f!@ zugO(v<9nJXcEPX`vwq0Dvyv##gWGlhlmonI|E;VMwlj_{Tb}D@}(D4v&}Tx zt8!-+F((LHVh5fR6c$8w%gjnaEiv%)>FBjr@d}`@;QZKau-0t)OSRnw6=&p+bDG3-Z;+f=hjFe>>(||dbTfs zBV2MxFCedc%yeO>?D#g5f!}G*!mF391E$j$A(e@HqrIxFzh9ga*8&GcB^Qe7-QG*Z z8zI>57mRPLUy6yX`WLUHSFb-H|EEXS;zEplmIX_eyHhKxo<8?e`LgxgCipv2=0hWz z<>M{k*-=vyfb_h4g`sf=1Em(;=<$n~kG`l;n6L|vP4EyWWn&flyom`X zl>0+@h=8zIP8F4rX|InE3TyD^L7+{$odlC$t>ap`dX?q$x8>M%OL4ROZuDR(c&(=u zga`j=0)I=13c~s{`HtXY#tg<6Hs*HK9%%OLjlyRE)KxD)$ZU}II-lbF+M9xCgX5=V z?CfYIS(g-9S#fJt+?mcC(!@s79e<#Iy9QhQitSRHnzq#1s(u2J@Zv<_p$CH6@RUkj zP?_`OINeutc93l1#7lr0;u`fwDKj6KSP!C%-+&KjdSw%E$CT2t*4jVtA4HMA{R-n; z7Bq~&m9mRB^U9S@==)v9R>QLIBeV2w@{7AcAmFwM{&jjQF!mWQ%|{#S z{vgDaE4gRM!=?TT18?M{V{cC6yK<`eOYpF}C&OKD%?%RhZ;&4qkr9l(qt~*vG_6&~ z)YUk!$+g(O%3>ti?@(yc{rmfg^=z~|ez--B9&A~{;0E|V5X~?U0ZSNGSCLR=$C6VT zgN+Y;^zA&DQK>V=owE9PYv^^UBFa9-wSJz}X?$T3mMtzyu(Corci$^mCkdA${9Hcf|3^SFzej9S&2HuRqamH> zAiq{ef*%}syyDZ2Y!=@uiZDmWs;vcE0=^=0_+5(eyJD?lS@-5tKtUUA>>Vkr$|HyX z7PP{e9roMoepwrvL;z?bQK+A?s#K{SyZLaY0N?IWk0BndFFrl#(e5mn=S@>V#%Gd4Y)1r!2YTwMBm!}WFb zUAC#NMFTgIF4Hu&tXWNWLYjN1RP7o>Jz*i^$p;6Dq!!q5C@vl+=z5Yl8gbRCdSaSB zv%*_I&x~ts;y%;#1D^%8SbD?TfyO)`0IklF-B(Eaj-59ArU-2svH{1uI&yZ*d(ja^ zc{*k7YLQMUj=pCg_PdGE_@Qy^szr?GIkidb>QQ60T?Q?5TiKp69`Vy{bXQTF^)pIA zF{;k9wxXi%?Nnk?;3QDX0@c7IqrcS{nOMQ%~vB83hHyln7boA+M*9rK=t%SV+9UP4ceoc}IxA zp(S>(!;es}Wqi}!nYsvUsd*|Jz3uHDlW}xl?f0*k{Ji%$!8AC*NE)4Bx1cc6(b)I~ z0J1Ic?X~ip&1j__rfngknrC)(8@5B#*Vz?pLg-$lLA1&oOae$&NHV~ z`d5i~|4!-RMz$wFjnvdQ;N2?C0cHpU;){Az9UUXg7)P3Y<~`cMVv&6$QNFof&E*aq zu`{IYOG#wyw;d-#7Yy6}?Lh^_VrM0=QeQQI5#ZBY97*)+ejp++>VH;yaunn5XqCs8 ztijvemsP;P1!AhQE3`#9Mv|vHNDSHllGKV60sr&*|BVC50DQ+|p|1=GHz-moVxDr! iQv07cf6F%ys1nEz4Li@8j9C8~Au9{pbCk30(SHDu1xpA3 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/ansi_text-light.png b/testdata/snapshots/darwin/ansi_text-light.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c5d94cd6a22d6c80665185eba3b4f9d26652a6 GIT binary patch literal 19973 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

80)xTpMeF7|pCZ`H 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 Dm)9yE literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/blame_view-light.png b/testdata/snapshots/darwin/blame_view-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64377712ab649b2ae6c639d64eaca553373d13 GIT binary patch literal 22795 zcmdSAWo#tPwk>G8&D3UQX1mSoHZwCbGn5(HZZo#I&CJZq%*@Qp%&+b__q_Q=8qJUQ zG@6;JQYkW&nTm+LV{KTm!xZGi5nyp(K|nwdBqc9I_K|nNS zB}D{P+|$o9Jam+YR);9be*Ox?2NPLwLqCHo?gs+4$T!^!Iaggt)(EoI{GOl1y{egrryEdMd_Eml8Jr0lYW(A zeweNR{!jo74(9)pX!@%P?HUvW3j`hn66D)2&~6X|5T^gXUv9fWbfbA+tCR1u!!|#l z)M!w|@9-l1*Mv8fV(P@BF#-h5Z`f@9*EyskmT);s_=8VGI&H%p#IWd$|IL+rKLtq|F^M7Iv$VG#!gi7*iwpTq=;rFW3;#cb)U^dt zSymCTii_S(ie=vJaX_g*&T~VU?m3i@lG3*P7JnUzl}@bgEi@Wez;7v_*Ngox2|qW0 z((SXlN|AB0{V~a4CT;^Q`sCSISZ6d7pzbT_A`25yQdXwLb{JPGVdeYK5*M!;sw^ul zb#}HR4Yaa8yS>`%TeoGT9rP+7*iEpn zE&J=5;ke7L;d^Gj9ipAxE-}i8gmu9&v?4Pw%UTI ztiJyk3@*FZYle#!hIW_>tyzaeDfSPX4r7XXg8RPd!-I&-a0{lcmW_>5#bDvJ##jmzF=w(0C#O_sa`C4ba zWS7nrpX7O%-_c>~coTmxwitn^{(eP{$NsjK zy^WkFzP7vu6V$u^9B5f*UdNyAKzuQTD!vESwOLS{zwBn}zuiA`McF2s#WeEZVXJGR z@i(fYqacdyGDke|;6NPF+uY1haGdUDpILzMO3tqGYx2U%%4!BVRv?3iV`>bw=~&TE z7zGx5(5%p!!;XlCIKOzAqg`Lp8Dm@!Ix#tMY}$I_*B&O61vBPW1cKF(NCnM!Fn$vq*nF<|zak{_ZQ`wViLtn}XNi*xixV)ajf3O)El?M&|_*z?^ zG(7Bb_LSU0TH+zE2g^*&1BaH-`4-rJ;Oz0eiK(FcfFxuL{L|dPM@rJke3g@5;WI7K z7W1xNdSYSpVyB)48e7Tl?KS<$uz#;()q-O$`@a#z?;XC_xsWv|h4I`(G*&BWUhYjCRiE@8D6F>Y-d{l}y7@^MD%`I(zv^R+wcbYX~`*YadmWW1Aw^S5E|on| zgyaW2yo<{N4kzBOz2Ccrs3@S9Or1Gs_wbSd4YrJy_N`1u=Uzcrc@A)j7C23Wy0?M6 zV}{`~M9>^1>&%Bir@waQd$5_&Rvw0m4GGE0?X!BG0^#B2Aj$Z^K^Ci!T~Z*LH@9HH zijz?(Q?QF+uP2*0MSB-+CqiCgRdQ#=)fAmECf_3A{e6K^NdUpJw7f2zQ|!8(n2)Zq zvRLHPHoY|tz|;~%Tm6?QTvz9HE}BY@9``Mt_Q=Aj=X)~3IX&KCGvdB11y7x&yrr6d zF6>Q)&N|?a_CtG%B0;zOTH}+TRxpL~)^JZD87U*cSmH@@B}+?7`|b`7;8I^fH_>{)3;qTE0viA&42{^t((v%8sq<~F|9~yRQw@8)&~N{! z$#i!ab|Tvnx)R^iIDS_8N9)4LybA*{OG8xv=9diiwp_c zkrZfcrZH7e zaI&k-qv^NCVmmwK55b>{RgV7^DKfolWh7)As4~XP=o-~(v-oux>Tn>B?W(MMc==LZ z(|#y*eAVRpu12@mY(6EmRI%|qHl+>$mJ?Oc5Ek}Bh>DZS<$7CCQgTS6yap6>&94m) z3*U$ABRP`KuxE61bYfxxs5f0@bE~VZW)GgI%6kiC>L%t#kPtx(`aAgesG8c!xLD1o zOP&#|wu>^lK0bldcdM(O>}%`cp&YCZr`W;4WGFB|T*)skE7G3Yxz|t0D=WgRW1QV` z6IR&9{7%SAr2L9lOM2d(MNYSHsKg)C&s5vB`PJ2^@1U)EvNnciuf@s>FOog4lTDSiQ9{=0zp|zr+7%}#iR9ZTkG;xN(kRF4y z+IoO`MNV*luG(B}e{yWmB8Rv2@uKU{J2|-u*nM_19@>U)AwwA{7*p@yJ$ki&(5>$N zIMdC75zTFEWZzBFrP)BOWihg!hHo0t_rdsJCnprTl&GM`ZRV>Vpf;M{LyxyqXWXRWd9g40m&&frJU4Ag5V7# zHODvpqI~a}9D9dg9S&pVa!T$qEv)a;_&?O0U%O}0G{Vpvah#(w1}onF0F9K6&iGEB zW0vo!cn;NMCZF-r(pq9df*jc(AnT5%lm-Sy5&h@%Q-kCCf4;%htYofB> z=w=W>8vy}9NcguTnUd!#o7+Ar^Bk%?qBVpNkGHT z^dgb#pVzrN=Zk)B0IBuS`D7KBr?ss4g%em7^Pt=(2H7gGp85xt4 zd2NJ*IDA&m$BKQxR_>f7BH|+^U|3jq{(vq{kG-&Nx3_qJ|`rNXk97*i)`3fOvZytOU zJiFb!q%;p9D!#U!o?rpZ*CQokZmv=Acfv>USCT+jxCkVnPtddx6C-OSO--%{a{cbQ zY9`c(0aew7!$Y&?*ENz98CTxNV&+6{zgX`epsQSWzQUpt4esrq)Tri{sJbve&&GPl zNT!B?5E&VMx$)KTTtgi1aVmlmLmPu&bN$4D)8GH;nUd6)q(Bs72>lF(5|*D+GU9Qw z`}SAZsr&f&^=f@{>yJ*6OeU*sX)r~N@5xSwyZ$gijmCQ_ZO?`61@M82280m>xA}xp zp$ljI%`6;<5EBVlvRV?+MNzuPz1qDo{-P7h6mG8K6ALv=w7pXaii>=zk+k=je0(DW zVZP71*R$BLyWVg6{ij3PZu%Q_`+88#5~|ujRe#5|W_pMkf?r@}??3PpXO#crPe}f( z3~+r>ygZZMzJX9K@>*TdiXyy{D4M&w+8iSPS6I;u*R29rHThaVC{Pv0cxDKPx#a(1 zONk_&6G%s;=`wNgld|8uu&``MJI(!>6M5~>hT>ZM>RVF)ha6YR;I5+l{JeL4!AR@o zSGy;d!WF|*--J`#_GNr^xtB_V$@xp*sC!Tk+t`>n0rO!O&O-gC35^H!7E_|kxiLky z5zay)*+7Jvr}SKVe%wJ3Ylq7O^DJC&n0>6Ir|gdtsZlBPa||3D5+vx|U9(RW z_s)Eck{OGnLOT6MIxf#uv<59yekazs44ci{&D$mQ!oos&-PXS)bpusRS7Tv}|&IQ!(u`c=jCK2mBbv#j*VUd%piik+k5t*!@Fvt`n0;zvp;=gTv^@gpL0^^Jns z6-sOqyiKc`B#E0a1Zfj?uh4q6xw^`iz`LwGT5Mr_JX$2^%xX0FIy%&gY^%=}PZ<)E z5<)k~WkK2;I4R;wW|rNvK&~XV6z`>DALM6UsISjo>Y%_~_LZ;`Yju=$$J{VCs5*80 z?$oM?lcL`Ldi+H~$w(qOJ5s-?t2I~>EaY)~NGMKFKdn@U@shAh(&uTtncE}{et#+X zu_)Gy4s+yPWA_xWFyK)%MaYSPguOYqxbCUBX+ysCft1OVkz2Bx*CbyF=OqC{ti!Q$ zESf}%$g0Z5F-9w*SK(b`BaaLV!77W1nG6YePZ{X#cMDZmKpH!ek0zQiDu9Y+l7ga~ zlw@j7=DMd5+w3{6a zogOzg48x}r?JHAoKJsJatLoi25D4&w51djuH^^ToJEz_bC3<^B#=wPj@zW+;9UV^y zv8J2n-0#oU6=MV%1$fqUX>J~G9Ot>HT#nUKG$~`g%$GxVj^N;=rKNH+qwQ|6Y$;T7 zmOBA!p^ACWLOna_A35Png$1H`7qbu6=pl~>?|>T;#E|&5ub=XS_K3-IqaRlV<35I$ z8$1n73fM6A_t@CpKc2kCNZ4q*Q3S?Jx^E`h+J(V<*L^}yEUEp%u?m&+M%*1uy92Lt z?d4Q45~+8Kn4|i`CX5_)NRlbNd5tCQtXl1li8}iyW)|0dIz;qpaR-tGJZWYYl(lZ0 zVdjL^eGV==^+xv~^s6=wcdpX9jO`~DMm@aPoi+kxlD#D6#;+%*SoreeYRA-TAJ2`o zR>Mn6wel9%6*LbeDpggSTJV7BtJqN8WgAhA;mQrK0;RC5tfyB5Lf9a%$_KWKi=#3% z>qo+21o-2xstarcgw@BcLZHd{QUu{|G&T2`sBn}%WI-1p*cPBOlRC^@03@mse0I*U zYYd8k?uqI0>pnZ4lhl>OPVC8P#?$?2)s7x?7EPA>|7LrEjKWsE2<-<>8w%+q-Ja^wXM5KvIU2I>y^mg*}@7bYu7 zW+GSW__sbsF69MC14U#b9?#~ADne{DA)ycy17p0+7if$qeBNGSvUp2GSy08>(0;hu zXj-0FSJAmTxjLan98oeDT+Yz%UeZ2cb05nL`qr(S6C!gPZL$hUZ1;C1Wbha9>M11Y zbMpFHZ5Cz(E+2-VI~NwymQ5Y(<8QS~pVNPr|9ij)<8jh6eSCx_W6R+Bw22>kPMx69u7Gy}&-?&Ud}nI&*Gk$9z$@F8|ChxJAJ@bMd}tL9S@ zgQ7zU+QX>#FIyQsCR({h=KHC2nR=zx(f&RfI~}K`VZg_~pB?WL1gz zoyWyV#lorY$AdZ}V^twb=R{eQ48@!eqP8qWyjt18jr)^B)+KV?ijJ--d92h0t`@CW zUX4~koV&ZrxlV~(*#a)SP)@aRTfU+-yk|yQ+gnE4ysM>x`kFexRa1a@u%d|WGvYxk z<8$(^XB_MV5@RSRSG$EQXU1TDaq$Kig*Mn8Hfhf-aiIBn^s6#F#9)a*bG1=EZEI^2 z_*e!TJzjiKh^iO;z=`yBLsoXwFDdCbpl~v^+lXGV;a7HG_q`lT6VNGwhBGX^ihF&9 ztXt_ny3?N5ijfjhWUy&mv9bGv{1tGUJz4-~{sGC`yM78uY7i2Xdwy@5s%p)xxqxn2 z)S2Wwf|tC-5aU$u@RTVuci&fB^>C28T2ggDe{fEBcm8~K+`ChMgrX^=@?3@6<`@qrHKXHbg(hNXMl%ZQhTxx>9m(LOhhX^>u^6^3EXSOW8h< za;xq0mGZd)MOc_7W0p6A1r(%3=*PV(?hco`Z)%LxF`N%!bLWO5ERNvkw&m#ca|zxO z)Jp@=?E@wQ9sm%}@$h!GIJ9W{ekK6{${!eJLM3KD zOyy}Rs*S>T!oqAt1qI)yf^W*x^?exNf=J+kt#m*{`DOqD{|l4}1hV`8D;MwGAa=#} z7RB}kcEr#DE^^mi-Oqdm?*!F-Ti+H>TzF>Ps3H=~>RQ~kHh2#rN*5c%uJzZ%;NxS)3s?~d}3 zsI9Ot#2-+P>Z+xGG5)b2ZrI&@eIeRkcU^otmk1e>O@Ax6juOGMrnF`>_Z%=|g z>+H0w3%ArAO}L`BFa!P}f=j7iReCL{H2Q>8i7Hg8vp!TFpa40 zjE{Z{Xu}ns>PYoin0p8 z{GysqMINBOGdF;qo$8cY8*+Q z$c<$De)~SD%efSE8qmNOk|1@E_)dEm6FOo9=>{|C+5Mm8bncFNQ0h<%(e03;2Hy>T zKRdvzWF15EdvN$psHQ*K7Ku~}gj3H0?#1`-2|5(YWedv-gmG-F283Ce>qLoG4O-`? zFZl}=X*jqwWt1fw)E%o-%_`X{Gy*U0@dNsFK&Iyf^R6Z{IZm%iAk&eTgnM`3I08v& z7#+CxfIoBjj0$gsFt-0lw|WIsUAG0`biqFJLGyca+W3~|Lm)Hwp`I~AtIm1cMsMo6 zS(K%QJ+0O4@^&Xi?JdyF(Sew!MG3zo!8K%!|Mc5uhSNEPiMhOv(;m3%g4)UoC5PSe z``L(0Iq1a8wK2hz-(|bzP_$_VSB4iE>BVl4w0I1`T2?Er^vjV19olEJWnFoWVA+hw z&?6p;AuoY_sls}zCy=lJOL}KA=%?| zqY@3;iPsalZd<3xLbA;F?pLtO0K3@cg<(&vr3oIIh$7z#WHE`3B zz+1b=@vda<#SLM@2T$?8L>`Rvrv5k2xeUL}vUPDjO=))Oe>KLaC!5hye>TkNMu2%{ zBVN?C78W_!>Acm4lbPRUek+6uiKxepYi;4zywA6VeedZkFuLVaO!5Vpv>6>qfn80j zj0Imv5jb70$s+J<091pidEkuv1@Xn?u^7>y7kyfo=}1VZn&X9XBsM;}o_G3;y`H!o z?~@ZU+W2*EAZ9X`eQR|xYwwCce?vW-E;Usay6!FMLqR}6fdjh5o`r##mNgFB$GsaF z0lhnUEMk|2?Ck5=0*J9>ZXOf6%4d2XLcvLiBbb_`{a>w4lYitPuZ*D4JqQxXI7`_=^3r!u7pe$Ac!G- z!2#qJ8UexN$4gEytJ!lwG1#w*^&-6f+qmdb)s&_CQqJGGo5)Q+*22!b$Pdd`Ufo-o zORJByUc&+b5f>7Ve&u4N^Wqr353(-3jXQJp<_D>3(;r)K>_e28<{xU_@8^fl`x7@K zi4YvN2;w9>TuRi@DzLF8eisI6=i_AOD^o>%Au+zS7TB()uqiT0oMyYx_yXFVZ%?== zt8AW5K!#T$vY_4Y77qFtQvfNX&!bwy4&JRsAry&*mLA~Za=K8(*fVK&9f}Mal-pW5 zs^&COVMG(P=w^T?G#qhO=lS90%lp;X_g7ep5u59EV;{R>)3Op%FYID&==T7LGSy9A zh#oCfzo*v7VnPBeSCky3GS#FBbBYi#7pH++djczt>}qCx`X1M&jy+A{D@lw6{>o6T zrj1(DwOt`xAUGhvHm#A*^I3un&Ev(rM5VO-&ci7MPuef;)avZooi~1T>(A^{fxsre+DmrrvssM@-3j5Ae$^bI6i@!prtH(zioTA@`rZYB@CDBx}4MyNaa~VI03=oD5SR>^Lrr`EhkT1Ah zPOFV>!f(9}Fi`2X;gb39pi^IXV1^inP*wIgH_D+;6wf_>dHjw?P_ z2_zn}W2x1fQ(STv!p3hwi(BE-^~X!$E>VLf7ccAmC9Y$kb z3e{h8_vAkKKl!XC3SSu&8 ztZ-wjybCfUE9>Z#(pIEJhKhJqc4bviQ|~*)DzLiFicnG(^_5ss^SJpi`4J>N1aNZ3a*7ZkrK-pp<+zW&DL4DB zo9i3`{X63tZS-IG`1mlcf$=MpLEbrX=308WGZuwg2~rzGwph$Y!+WfONFzP>5$+CO z{xcSIwDfh&+AT76OjvZN4mqvQFK-1`(u~v$VJFzAt9)pEv*Apn zE^L{YXW3Z%K@RJm%;3op*t!cIwqU(nsfpj;W}>kyZvmaLsE2yGGX9WYh@aCvX^hKA z&(JNNS2RYIT}xg**Iu$;r>B0{cbHXvWRs{kgQ~-%Gid6TAIol=MRz)zEz_YG+Hp|9 zksUtzs=t78#&rT1(`j_hFDASWA^>stkJaJCG0Yx&xn|jdm3}RX&O`R8-N?qwp4gs4 zGwqA|vfep6%v3=cg!4fowYo`6kzc*z0J_W7GpJfmFQJ1gS!sQ?w2rZ@0m^t33X1tUs`CjCCy70 zv(ju#yjmBu&3xm5)Oy?^4lJC?)N?PXCh9VHJG`jrFb*My?+XS-G{9X|Mf>Z(duAf9 z$jF>*=bG~gWb0QGX;~#25H$0>>O>AyF+eyLrB$5@(y};&hIFykF-t*O|NL0ULrxa6EZ>NCOnq^|58i%{0qURp1Aa;Z=Hew8e6yjI1rXrEX` z=ysW|35Ur5b47qbfSi=!!%Ta&KdGzD(ckO1S!+q!2Y64GPSaKrLg(~ zM7l&NK-2!^wPK&w<7pVuC~ur(-W;8F2T(R09Uptil>AxpZUx%xDLgzpKqc^X{HO*% zr*w1x2*orlQ$mWwU8atYGiQdFqje|Sc=x}8dCgeB!TY5L^&jjxWNpKob(7?|p9 zQq;WM+aZn)RwG38No{HOGEla>mj&RAH{|n#-Eko9duwRT;e&v3%U7Vv@@rJ0h-c#{ zYqZ@^{J2(BQ2}4HNAH`kJ+2l+rKFfhYf_-GwXm`xi9K)8u@4h*x;B7JdN?e(R{Fd$ zcOH^wdtnI@GUP(Qo9EJ~n#L#m1fCyqa>pPTDA*cI4%rif3gDpzq7r**UrSOn)LZ zCaL*+Bu|tWAaPv5p9}vHD}ff#pLC}vLK15sPsd1mv~&mV-Jqt60!oL{p!RQ! zdLslNU??QHH5iaMwh#1cg1~kT+Q+Qb%jvt!`C6XN!t|d$+ts@&Je9PZ3$rzZUsQN=%N-F5Tw{h!p_=byiX zp&eUY&%b8oh40i)Shd7yxE#k|b6dF4`CTTj4LxFgJ3+gZhZ^E=&4| z^KN<{=bH+ndyE+_U~22?*5Yf8C(|JmV>^IuRfgPJyXm*&vpI?h6gbR@F5i#CUWkY# zpEuRP*zv!|n1j*M8^-1dL-dL$5t z6D*jEFOnx+URjZH%~6V{pe(wOx%&I74yONI6vY#f^MWLL|z--uah992|esKET0O#1(n>(@%zCp&#K+g;jW zw2}q}f*FqO^$Ph{8y7_{I`IVY?q(prVBSt;aEX(|Lc-%rw^*AiLkW=%Me_b}GU(Hq zgAIflGd>rwt^frC+f4+QW1z8Ld+aZ6SDvTdO_3MIi9%=)GUrHzD2_2@#R6Ed)ienH zIDT;I{5yE_lU{owBo?^5J%et{ykibiWv`xLS`}t>e70uqK*JnVSEoGoQT#=Q9VI5| z(}BB}@}4DE6dyWZcUj?j#P3zCN)x3foui;;v1UC03_2+jycXt|gT^ zV%RIxFGPLpf@owm>^6lF4?)?&@(>3fv}b3UbsTJt%4_GM&8z(JFiR^ z^FpIFh~ogMP4!9|SEJ>m28RDl`0WPGt)+xE8ZE! zy!ZXKeM%B|aOeO1#3cdpuZoGqs51^vK0Qk??3(kBu}wxdZ|bQ3j82@jd#Ef1Hypt! zNGJ8D7zL032Q&Z*BBTmn{*!@=g>x8+if&wN)MT8DqaYyzChFP*-ZW!6RS7E(x%6;0 zPz8}5zW`mG5&{f9>8v3{c|6AX_~3$<@x}{7un0lraeOY@(*emCBI4rG;$qC`+BCJb zbv6}^X%`&Ib4vP}H{oJsISzR3ef3i=c^_gnIyQoaJ?pbAXmSfVrGu?vB+Q?)%T5gk zw*zDRRrVVpXGX@x1!aga6$_2#O9UjNqmxq7@^yddT_-!=m&V{=;R1TLW4j1T1eC8H z+ySUA(#edfC8{FzZ}M$*l%{79_ep*lIA^$HO9^c{mB8q(L+kPMIr3&U=qk*7S{cwh z+PusejBU(smzm0;%Izc%4D`}nk4ibzB~goiDT3yKi9tldayro(glx>XlvqBluk;vH zA4~4E@niF+~wJ56?OXO+Q*u2*TmIRSNr=x`UsaQR2lHK zROyy4bBFZlO9$uNKD+f9bwEM1%sCV0G9p`|u#NdPM24QXe;j`o2abEn-B3(P3I&;M zk!=yLA|;gv@F{)QmafagzlIDC8FoC`jo-8;D^etv?sSbv((1i)o9*S0e(7&oHg?eJ zbTf*%*5$B_-($c;%{5}^mR`*D1OB8B3Ne|1CMqH#{!rn+=Y@stu&>t5CT?{LdyAq1 zGSYN0A( z`5PTF(sdXZQx(w&6tz54iJ*P6vNUShwKbFYo|}H>d=uf@;G>?(mpDQmauiXi&E8kM zM{nB9)SJpKG7%j4(<$OowwE-w!-|I6pJNvwM-l(C><8m01ZKC_29Z!)}%oOb{I`1;%faHl)9@Y>l}*fzGc@%*56JQgiwEp4;c z+~s)*OF;#0sDd!U?^`2dCbcPbSJZrM85=V*Gs3z@mz8#cNGhe%@yt#XSkRf)oa&v0 z>qd<_+^O5PXh|wDE(Qe%7{8=%ELX3rKlZ7%ygnAO=H>h6G2n&IEWvWXGu z5t@c@!@t3GIZ7JbSD!x^eptoVOBFbs6=`EKXfDq!+$~I2jp{L`#qp5O3w64`v_8D9 zJ}pUo7ymOXiMHbt^#s`OsQTJ6+#erG6Yxd3N2nlkb5g7=ws-Y&t~g1x%oy*@ z6ERseXTD%b#F3Vc61a87pkLCWX;Ke%JIO;JBrl@qx?6J-`bH8YRC79^y7l?87EX^& z(@^RlmP1t;Y9}Kzo?w}?n;6T&74Lj$M<76^SJh-87TdhfZS25E^Kr)hq=QL3rN8l((IKe#2t@`~C8s5RpU@{ow!L$o{i4|8Gc0 zhkcO9wroet`#E1s7wtI@OU!>f9|O0Y^}5Ff9YFMz^0k}C`;X!M&v71uihF;5);~{o z(@|b}8VtXO7|q2X4+DZQb3+FdGxX|WNW8=6bi z2U^=l07Gm7N__Uz`iC|ECUiCFQ}5{R8tRE_s^tjD`RXn52s*yn00l#)H$YN@2?mbB zu!oH9Zy>~fcfK~oRTKRp{$KdEf&A6eU0)p+tlH)>a7V<-{1y!4h`6@D=DD^B=qOo^ zyvIH6VV`C09q$~3tN6uLxn8177XsAy1*49cdhh{X7oP9Wnu?B=Z&e1lT}_RR6k50P z5o+Q*uGh=yqR!*v6AFY>)HGpS_^7SiDk0^+Up+D7)sQ>93QIE1_NRr5udZe{(%hVx zo!xmiUn|ZMRTC6Bz?r}uz95-G1{D^RhG-r)|A^4-%wm&u@bmh2u&XD=hma!O+f2;d zZjz(Ho}HdPJUpNsJZX}l6y)c(w#D@C-4uUUQBhG-U-0JXEof~mtZeixu0z$j)kjGi zP$EG}NJvl!Q7JE^03aaTmnLshP$(x#^zS$n=Y2=1hXD^@M^{yyCst=}y9Y##9dL8; zynsIwVS-TYB$^EQr1J5i-H{yPKt`yN(3DwOzsG}AR+jiA>(8&QrlzKTR+Qa!K^TOI z#JLcUj4qxEzk-3#mD7z^jK?#O(ZlP80_U&z+lFhnZ~jwzex~hMH7IE1yV&c;FK&KG z9mJ=e4Jf@%J=bsN(4*k<2oMhiO6LXda4H|%U$dhQdd8^T20CW4uUn@O7GdxO_%TzV z9kac=RLH7@=W8~H+S`y$&aro-CoDW%!%v-AvZyU8?xO+#4 z%Y38+(;!2++PKq}kqH2PB*Ej)@+)3lQqG;j7#zTHB7dj!_AY|6_? z%1F7#CHWqVHZ(u8Sd91yBe1UC^mWyxrh?nrGT4z8K~41=#iIFhaB(FY?Q!8n1J8P1 zzrPe>9P)u59UbaLMwzqy5EYuyuxHGY1U-|ud(wH;X-M1vZ#Xv^8ob|t+a;{E{~+R+vD2<+GK{Im9@3QgM+D*4u{Y=144bq z`gY8qUxCp}+ZTB4k~91pDS zONt-5Z2EQ_Yk#ktA1fCPd3v?PVC!n@Iy+qH;d*&V<674T$t5b6P$GWWnHdttO8gQ5 zTTM)fy&>WAxk!>NEiD~-By7)2V5N58*2+`9ZS6O#i<*$Zq}QkL;qhC1Z%cFJ(qT{g zuzs$3SL^H}3JFuD7{&YZVC6`xEovKJMuA&Z?(!LO0Rn<<8$}J}E5+qdNk(sNrqWys z2?KJy6#N@FdFMS65RjsxsvP**#b>cEz^qSsZb07Gv0;xd79Au=x3$6MmRln;3+C?u ztyUf$*(Wk>oIKeFO*}-mt=c|+E90SP*i5bl;}6mwCt{<0^)+9(0ESoIn6>jG z4&Tl7E7j?oz6tG-o13tLc_%2Zv;yg)?*y#b#>d@zY~r6cM|tA%K_szj63L0Q7{H>v zY+3)?S|?N%)ReRF*4I|CK{0ew^enLL@Bqw_8?QfGAXxkSfaAYJ_24=@4VgwK^BUS( zw}&;UjX870mW`8{5_4CXMLL^Xi@oU3T2trHBAY(pQaxu=IS-z33RK`A226kLeE)^i zua+nn9r@`~wgfFqNO`{&ni{HckJOTGN;|-L1(IF*ohSL5ESq{`B>IQP)X9+KcFLf!bmr{tZQaUNtd9(4s32>fEd`@RX;Kk&D4p+$f&pcwkw>G!YQJPC*F}K-gZJf@e3Rqzg1v*zasX1@j9`~_ZkQNe>*~uR(a(jO_GV1Q1I1Q$04V-Y#sx}BeYCdGPG4N0MbFj*~|^z0i*e5Pez6Q9eZ(md+P&G zkotRBUEU)tc)Xwinr8P&z)d=j%{pDZl6;&5*$QKwYFH_-Qlpl18y;)&*V`KW-=9hs zShuJnTEohUTiMo8=dTI*9Wq?rgKlfE==2Y`YlwU?axNJxqGN%%rb31ZstaATl2MVk z%(h^jxFt%Y#yV#5y?_lL!-e^-7FR#VT|z$Akn(IjKPFe%(6jZD5oF5C^XT+uTKEn@ zx0aSDPWSDnfrupe44myT zK$fDC((a8rycnq#n3k3nMsQ$iYD!?>xX&$_&)eh1n(vBIVRZTBK3!lb0B z{a-nKA$d(#xjmD@JdIw8P(}!>ui3=H({4Y4CX5>ZpvU~}AV)xm-|7?@Ni)%4{173~BE!?c5sP-g=A$4YC0!eW!glX)Pq8&N<}w?1!-5}NT@Ba(luH)P$d2zn#^;OC&@&_| zUdNXFsi%V^;W?hV8eTr`K~*UXB!I+<49a^8o9HyX%GBifh{-Q8=NQNR-E+v_W(I6T zU5KV&r>HaP7bsBq_xSUX1^omO26#h= zO(~2J8KoIDpBiLmWrDt_D+_#%NM;}(7|5ELn-jevPW(xv(P`7*@BewZv4aIq!NoPO zwPn6qKLYYAtH~A!YtmF`k5fk}Q%6}`zP$^!`Jh3wa`+grA|i19G_k{GHTw`OxVT%L zo(Jr!#!B1w>Y6J*isW#Ws36g#G%ZUMh)gSDOHPI)wP%r4mE&m?S21cnFxk^&m6Xfq zXob}iZzvAU{$)T=aekQ3}{o%?TaTtm|0CH_aPt)0#Y;Q)wA@DMOkIWR0D0N|p zUzG~7x(M{3+}x}9_YfeQoXdv?==EQ);o;JvBr}X_u?0^1@rr5;3^`IEIGvdSw$M-C z|FT)lhl2Rod$lp(BDs^dD-elPwWa}+xlbF%@#FYi-!6p3av@WSEBg#*Ulm%)TpnC9 zLU_!(#wUH^t!=I8Nx{Idz?uocut1phmLKa;VKg!AYb_Bx8xPs@bdh1%nIZ_fmcKGw z?B%Blox_}VE19}3%4!)mqG48$9`EB&BvW7FaInwt_T`_qGuD0-OiH%12z)9`O@M;H zLrD`3!rvM|iR{Ihd&XWOkwEd2h6kZ`%( zCZPB;aalk*okM~E>)K{_jq35LHEm?+Wj%UmfKKJu+O=m25UgD?^1P1tW%aTO5Hs2EbA#3jm;qG*%SR1YJ?v9Oz5kwz7JzFaOBg z<56lTg7EV*SR(NMdF_$1e5I1H*EJF7o78a^F zt=vELZYbeGlI>KQu1tJpXeWpJi}#L<)Z76Imc8q&dx{xN=N-EW1_hz1b1Kv8 zNUOC+#i3n@FNQO#l!JU!D;9Qj9=3C_401V%(<+(YW0>q{dtzf{3r4^NntAi7%$G-5 zJxNFEn4z_5-!ouHqFe~+(8Ajk`z74hbAu}0Xa^G$%Gqov{8TQd%o2|-5F8w2i^tt> zSzH&N<1fh9+M=p2-e*(;3Hho^bN^jeUZ%97RIkCZ?`@?ey3%enPo+j9a==JiTMHK# z$HfJ30AYQ0>|BrI6 zI~uNb-4kIXT1e5k5fOsXjV?M-644E2qSpvQlus93gczM@(Ty@h9YX~9GMEIx=q1`< zbVfh(ot%^JoOSOX=dN}CxaZz?@3r>3*52>){`RwzeE#4n&E*%p$nx??oe}ekp+sVWMgYP6%5wE@l+Zd3=@UCi|LE{egVEQ?BezLgE1~{ewf-{>nLulV$-2Zw5qagzQj8#F81LY5hX1r^&WI68DQ(k z&AN7MY>YChODzXiHzy7a>FNxp|F%4zyea=6@X4y9%L&21Kl5h2rybKouPSts#M=ZfAsgb<&DMVKQyibFgf`nTmTTl8q zP~nFI^@l?_u&xc6o7ltttdF0*qZAZUpINWOMB3J6tK!qr9Fh-E_1 zXntmD9#4?2w}ixCPAlL0;hiFWQ1V+&?`l4@dUN9E025zzU>a=acef(O&d%mL@z(#&pcpt|K2l+XD;^f^NpCB{I-`hb>DEr@Y{YmAsB1BUXPYq-LoX67B|? zK)_D-=CiWK7Dfe?**iL>oqeA_n9sCiV+nV)6Wu2f1=VqGT5a$2XPCKgThm*qNkd;U z=>vX$U*0cxKOlF3v7Mz#(CGMG8Xs9@LKN*vgEUD+k_lc25NNKFpF z@Cxwm9A*`iMqj^5K0TeQGy}NLe|@R{-B}l%BGF1hNEF45%ku~HDvX67s30_i)~B@E z;OUyNodfDBxOL9Z&{qHH_PQCBZ<{>;(AuSOkbnD36O;_E-#&^udmpF$}0dViQzE6N~jkBsRM;s|tspCXGp` zjWJU0j*sJChA@rVBKQ3)cbGu%?1xir{#9WGVUfj41)OPx677bNH8$Zo%3)XyPZv8o zPZOhpZ?5;;hj0vUgLw`v`}9!gY`{w>U5^?{q%HZt+m6uRl6y1WKdM79yPj->{m$en zbY~TECkW-GA){l_K;gH-UQLd4Abl@*l~O{Y1q!(e&-XL*8qbU7}z*EY7(F= zUCX=O*4vDF;BIRV7nh3I*oU0BJvw4hA9V^9@bcS(2Rp`7^n5$h2ww(dfqiHPVyWU5Fg-$G#Cl+4 z=Zu?m(zQ6FmDesuEic!s^z8M-s{N)?y`SG>!e2&DUIC(m-JE5wA#oUz$S@q}c$Acy zhNb=jaKKE`6ZGW9&o*pwljzy}zj!=XB;C5GeYvTmZ{@($F|#>wLf(9Ziz-?Gt#)ax zA&dgn;+yd%9-6!=?qmZV)>?a!=`mQ#>^5FDWM7VS%KY6_=sFmjaN8&uszm;S#n92L z0QhO@8Z;lRYYc2%Z$MD>irjSiTJ-8z&LL8IS$-XOA&ioDpkw=cben`gMa+?{3Oq!& zPMA-alKPbry~&bs-ota&0?aBS)I(nU?5&LH3iAF z7-Lj<0O?=dS?kr_yHlt~im?;SMD1c<)IRRu`7>-lvDN(1>q&-Tqf+nHAqlJMP5$26 z?N7|?Y$8S%@)lx=H;dV-d(qpI%f}-Do(;{r{f9V+KTn{yd3-+7{V=I+rN#{7P*Ugj z3-uV?bN5H?mb#Wj_jeLz+LPX-yg`a&EthncNJ_5F#<*{8zg#VYoaW7KSle_Poy=|> z#?omy@Ckx+VD7oN;}sh<$LI6od$5Ujx4B##Ue3X1q&5mwhxe@fTyk=wQ{AyCTi+L} zypO3+axGlJyI~0#s(ar~7CAX&5qJ%-O=@u)YI#<%nl(l6rzHTz^#L;yEaxS}!2tssEd*wgzX`c)OINHMwDg4_J-$#_^W* zk$jISK;*LqZ)tT`)f)}MTD-R;Zl-!S)_+JDY0d%Knbu6qaTlCFl8y3r_sfQVHq_Oy z*?k{=&yeb^q0^OhhwT4ox$8kZ&w(@(IsNQ`ei>S>48Nj2_9R&oeJwOH8`c|RBWu_& z#L#7El1|<63FbQoP#7f1T7d&?OfWZE(+l13lzUlNG#(V-JH-!fXqHJtpZWWoCnRUa zpZ1f^W+APDRu|+MvN>>WAfcR#LF?F)|1zF*()GL5I>6oi=pxZFv;;dH zo(JClwesjHtNv!c4_8YN{EI1e_T+K;@`<8EYYs4UB|iuYLxhX9zXcsI@8$$9J@0Ru zU7_T9;&eS`<-_7G{vOI`($uSJVRXi_+1w&Q@kJ zetAtdSg!hFZq&H=Q)Dd*3B}(G=QqXrBhoryCQDU%{Nx6}(ArZhHXbElcIKjm0YAdeb5X zOv>tGtY1|gDOWuZV5{FFS~)iEv4eqjz?nA}PUHjRBu|-xK}t~t%~LWt-cnV~!Jn8w z`7oXqX}!YDRjZk2gn7FA3uO%_v5G{2&H?sgy<@kc;*TvM+X}iIo`MG1#&}Y;+6TyU zm|Gg{`RZWk^-mt<^$`ix?VmYRm1BI*@NNwn(^ZOo18dutBcdV)OtzIf%h@5Q(-E_? zj6p1JWzT)lm{X?z2$a3=@G$Etx+fiEB%vz!u!T%`8AI6hT!3xQ1)4jltmXBKIO1pa zqvFmly&~t+BX0F~DR&%SwNBZbHV*!9l301027h|za>jNo%{~Huq2D$=*G`&b!IP?e zFMXdAci`d2m|>MTD)}7D!SMMiWth(GDvChYCoHT_$>VPd8+SlHUG-IuT)2S<$3nv< zPdLS-a>LudG9D|Ww>QO;risjoMhY#8QizL-*9#Sr{z*3c-^eNbFDb6RJ*4qeM;^Bo zfj>~2uTB96oGYR)Yw3wJPUOi!-M1T_i(UL`uhcp_JEfbYJ+?h6|3S)Z49Rr6P3y!0 z2U$~jC2pw~gzX#NNk0%VN+~a`S@}2vbe*V8fYp*G2s*kd*-){7zmA3V+}cwGe`P3B z#V2ZVw^#&7^UKEd>j;Ww2#DT)^0u^=*3|6JMNQFhNJ`MFs3@bNq}J5avVR4*g4qS8 z#r?`EBZHF2@pS;xDhlekwA1zIZlYGu6fWKw`As`+^< z|7a=%)3y1JmG<=1DnAOM=uH;u08R_-32~Gj%rPlVS0VX2l<+Gi;7?b$YMSh439=4i zK?sFY0w(zMMTZQOy@u8laEg+deRrV@~H95UMzj3rgnpC?*>rT?_I4IXR(`*0*sY!7A|?$CNlrf>cGYR?*?p1fCJ@CrYvb_c^&`(-xe75UBXM^U-u<+K;Fl7B~Y$T=JA{iV(#$Q-Bu927_p z`vW2g#UJzAhAeX~b(wUnD~kyvbgfPJ}xVyW1fH1gga0%{i!2=8)AUF&b+}&+R(BSUw?yhs^J*Vo_ zt^4n*@B4A;+^?%^rn{$i_ugx*y`Ht6wI@PFNg55A5E%gh0Zmp$LJa}ojWz80}#5BHT9IqHy>6s&hUAV^IZD-iU*IVnF@bXD7C~&DynG+B&Pg)Oz z+o|tLl!+C6sYbv3=j{hhv(2P$RM$$5p?HGC;-QpDaud19r7V&cdHD^$k{9y}@m@Yd zfDDgn;TS$PAd{=-we)R8dDejK@X*($A{ORyepO-5kE6Fn{aD2-JmXW5XtCNfe|5;n{825>{s;!q9 zTu2se0}>a*miUjooCgs{Qb%8>@q;3?3?KXnV<&=MS;C8Q5KA>He0CIT0v3~K4GTF&t4_B$5M`;H8IDr+#V{qHwA5h@stAP(wQ(XO zC{Tr6C4YTKelJF%OPX?HC}s5I+h{#dN?Js}qq}et$rjCScMA?@nEwuI;(;ZyIEhocI@YUo8C9I=czTr4rQT+jBW?f)Q-!x!|x7jrD(4X1*?R?t4ZX`moYa{?&qEPB|eA2 zw#|l>nmdKNgDAFkYPP|v8JecGrmDM=p1=F|>2nU)$RVBn7FLT~v7(sgPa0odcrp)s zUTg%p*kF0z*hB(04)x|b(`5#t8cb`n;a$6^91V;W^}BoV_v%PHXg!%gIupf4-o1S2 z?WOTD*!e=%)tK34sQAh689Mra zC2-9Nfa`S2KiWB#hPpt7GBOc6 z$>G|R$;N%+)nn<^z6mB`&=`>JzohA7J(PUPh^bF&rj`j%!!)M^TOEG*N!- z%K@>1V#L%R3a}zrcOlilFE~lOtSOx5{`SgNYW0qqp@TyMB*N~jTy)Cv>VDme=YQ>q zBpJJ^ugi&ZH!W$q98jbR3@BV)D4D;h>Tf1RrKkfzp2(4l&7YW}Hd555OxX-*ORs}k zA%}r4Li2W`FHaxaKN&a^#|nBEHa7ZuY5#D)>ce)>oB!D01G3rn%yt#MR`8zw6B@Fpv%^&W4redVEIb5UsZMO9p-! zISbd~{Etx8up`uTs4EtTzRPFU%Cs&txsXeTZ`0KgO&mPFb@|hI?qk2v}s*_mr7{$IrF#iw)orC(((|(SL-qh4*BHx zm4M)INJidrZ@0gP&cn?uT*9hnn2mW>Mcn|0P+wc$M0B#Xpy1{@M4q&AblA96xy<$> zsYsuRYpQqa)w6FsH;*>6lAX!riIC@)q@E_ncLu2=3ZKR+d^ea!i*5>2B8=<<AaIxCI;S5z75wWGU)!US6cQM?2E0Y8W>UL{Ldu(-asa@IAVGqE~RGOQe z)PCFviooi_m^%n@^s`tZfIPbhh}?Q;e$N{+BN8G^Dy{tc>!(caEHEv%@E5)0pL})& zMKR~*+v<)K*6lBeLlXrjsEVc9XfPtzjG?`%%w5Y7?&WkRilTPA=sN`_;lgHUNabpl z{N7=@z($sc8RvtQw;Wp8hNjm5w1C4(zY5Lqk;bW*;&GrHdJb%H-1po(P0s{=5D-OrIw4%=o-q@Dql%c>v2jl9D&p0r zrW`C<6rH$vIDw+BZuQ(`8lSp~bFZvyttB$~hxSmqg77qFrb%K%@(N2g1y@zCW#2qE zx8I6OE5k3pN4z)A3}<5znf+{ZcE6y_TVx$`RzD|Aj5l^SHpKRcDE&LI^xO6Q`i2$K zQ`~N0A0Wq;k5j$Uk{q0$UrYtXf33dca8~KGGOGz#gds(ZP+$g2C`uwyxV@Uh&j)Q5 zmsSd6V0lu~o>J+a2S-+m(_a(t+zPD;Y#ME}X#*(|<1*##&_kLO7{P$cw2AY|<>92~G)qq!;vLBIOYUP@#iW6R@%{Geq)bRr6kZkuI~)9nTyPg#Hf z8f;VBTW+=c5{tk(_9#1=GxE6bxSX{1`m{o=5D^OE=>s1}fcxe|K@7}zWQFac_Un+k)Ng_s>=pS#K+=!Y| z=0p$D7T_~?Gof-;*oQUwCx*IF_|`|JY`5gR1da>O(^dJg!CeLK$95RahqB5>=FF{AC=QMc7!+Yp@!hCoZmuDLf z|NapUl<&OCbQKXY?SEbu(+1|Lw9~ak2wDm*;)h)Bz8V?TL#>8JTY`a%3@m)y<3oSj zS+F-HC24Z6)Jt-CheD_WM9&&9h7yzT7X=}?795^eri1zxG+Pdwx9t;c< zru{Pu&Xe!@PZ4#gF-w+ggq00p?W))LUDZ(5m60ngE_GpjXJnD4 zEy~G}a`QEnw$E~7!L}~GZFWu@E`Qr9qoz3KJI!{< z?e+EB990+XEwc334xjwE+uG~f5-O@nl@jGal(H5G2>Tz>salKR8jH==qyi@<;zu(# zN@O~e+GaCwVDn6C935ttF*22um0{92cJ=(!F}%1va37RIC1bmTBYCCevf9rSBeI$x zdICbJg_!fKV_f%5J8LqNryH5;Qu9A>gaLvq`a&zW`VC~;1i-k<)x7$jOj?cY?`I8s zM0xQ1RWKqA@Nb{SG`)w*LLMX>5K;+<`sfUzm0K78nsgQ=VHOsK!iWDR@N1;yXLw8^ z+{VXs;~vo^HpvRa7WT*9Tz?e^?g>?EdO>{R`>_Td1Heb$q0fy~gWzC-wqFOm(bzKn=Xk*12u zD<(hV?t7J6M9Wo)uf2?HecUVS21Uw~rKS_!6=g;k#nOwWYfeS?MvLt1R^n}IXoZSGx0FCh<|IqH_aZcE* zA`98#S65B}5OU&ZY? za`C`d>}40SWfHQTz-v24461s45mvpAuk9o|6?Nlg{$}jqAXb%o_$>C+ekv*`qkH)F zNs|a^C@uuY+_CgR_?hWqzMUiP80Sh!MyfAQcq86 z{QAd=MtiJ_%V_mK%}!5mZt~h1em}b$C%3j1EGlU!FYoeCbiclEZSx=tf8?5+bh)1# z575$@yZJQMT$AU&`Xs)Z+4YmgHbVXeJz5SY(t-;m{9Sw(J966c>}#RB45nC~nk>Ni z;aS8MC`OSW^d9Q{0YQYXSc8!j8~WgtTi$a&_q;I2<*?G?GnVVR@>rFLWf^{Hc%HG% zIq1vLjbLWq&SiKH~X<)Ct(98 z_Xy+QlOyg15(;M;GaK97@-k<*c{LCSge7r|jafc7bMVI`$mB0ScXdw``S98pS@xy` zqD7Z)Sw1~arj5~wY^T@;1Hu%*@Fu{ju#9qMan-uv!y_#4(N! z28edyQ@nfku1AzxS65F@_vr~Ot)hZ0TyZ@i^f`wO@Xx>71p{I@Py#^t4kHL41||mq zDgJLceSIqtjzI*cixAGC_}2Cjz(FQ@O3d8xiCH&~YH2`$<&MUeIZW$)3}}UPxbb}H z_*Yb)5~m-aG=UM0v2ZFh9bb0JTH?(J+~0Ccv{X0unC4!&v3;am5i;Xspm*}vR@M_wVWo5-L*vsb zB3YW1mzBkcps;|O`W!}14=DnIV^`lGNZlZMo=BSk6t0xF5OW`-K${>#?W(@T;lWFd z8A1R2*)8BbCC9ts68dxkB1|9gU`S+b*wOtuqN|{wpl0P#yUU72;Aiqv!XUsCP1mW4 zhDxfC>tl@Kni6Ck9?lVEyYYw|9O?xaud1(fYrQ)$*O$s+=pfzH$D&j z=J04-k#s~ORJ17#D{Idnj>D&3$uvX%3l*7WskNDh?2$u370w*aewe@17u_u*z#&( zYkF|91GT<_VMKTaNl-4#YwvDvV|{=th>$;~3br9lTIB~U*!-`Qy6^pC+CodeQZ}6& z^?iWH=%>mOCi~xew0xfdI@<5zNI>8JQc~jLIpImxM1Ix7Zg8kbb}oC-v8|Z$5L7C2 zmlN_3Tx^Y!iDN7VAZy@?(F1A$Z!mreQ~whWBwxBi*^t7HobflPKf8LJSaKZ|CN}9x zxMTKAMS+FK;8dt zRTOqn+1W`J0j7C&dUjD`%x2TZ!N4WGNY+@41}?UmcNB#!LEM-2M$>Rx4sObi+X<%V zu9iZWv>b0Qw<~pCN>k?MlV=;J>&vOuvL?_&M;a|T_Yp%pfuN~3v=!QoHR#>d_vHjketyVDnxA~@O?DeYX<>%+m&xIV8p|I%`Ujo!TpP6>9HKTn@ z`CWzVLHC_~Rr=e;S;tOTtUE>(E_RaH&Mw#fb+{IY-wr8IMZ>jobb9`NsJq{-VTrH8 z7B4)5_yo0Nx;-fOUS2Cnjt2C1VE|g3|HYzICzR42427^|01ypekch(^+C)4_&E7Df|YWrVE4lm_CKw6`vV8 z(^1bMGXMp$(n39N*G$?79zZEW*l2BBroC7>tc^&TIga#`TYgIe8pZVd^yNh$n{nN6 zon7*Tl(>4`Y!HAVM2#Rjwf<}^Y!fR1TW)7d5h*S+)5vJ8SgoXzwg?X|C4~9I;>B$` zzY;V)@o?CK|9k<-j?M=>UYQw?F6t=d?ChoM&D+0lQC1xA6+hXhtU4!0wnEcLQHhPI zjGNa2PSfP5(7%vSU8xo}@@fJoa1)H}?OT|coAc`_cNWoXZHL%iU*d}J_yl(Pp{vkn z$8!A+n}y$`jE*C%&KoC~e0+P#cPAD?3r4bXSjZBNcHz~Hjoi5eYV_Dd=^Siq$Qq1E zc&xOZ9v)~y?DlmyLn)l8*YYV<9BDs1J*7r7I70AK7ZMquB?mek!hSjOc;nY_2rQ7DXU>TkFnCR%8zD^%Rz7qG(JL%ptGme#tkVJpgSXlO`D z*2;=*3kT|63}T`$ZRq=&cuCG&R`=Q=`N*SORrjL!xBBgEw|t`w#;A45s@KEKP6Y#7 zU07JEeuaZ_@as~k<1PH+6ex-6Qu$-Hu$NPN>+2dKBb1AaO9>WF);ZvJ98nq`Vamry z1}M`eEc4rmGky_rVe@qG)>N9jxla2>y}2^O_2L7=0l_~BMwhqvW%fXJYZHItixx6W zI0dZ5te5-rM0=7f*>CV`JyA10N>mu64>e_pkpg$&&}J=(?bWhzSlrp-x#j0 zbU6F8qYez980ZZdu@Lfo8TkMnf0(Db`A9fdzQmev^X#;7xWENZ9Qn3H!(wO*6x$#f zS;<+^z{CAxT^tMxd;7GXshh&1D`_Xi9do_C5&Q1==>E?9kH;SYIefel>;%_5M~!$m zDF+9tO4;{}X3pamST!#w-?9u0;tvlOPxScq4^&r|>+6b}QM;?h?#?nrPBzpeR85~|f*R#%OmnipF=wk9^GSqCIrw`!# z$WlmTDIp);tu~($XtJT=%&+(-(~lok=AKLfcG3lEI=y9*fD4-=y@wOG$FWN6EI~XY zy)|~brkOiichmD*VtLwxn2hk#lOraEvisw_yKwaJSRH}6$GO-;B1rrc=U-~fXbXJy zhk^;*w@=^UrX`(jy3SA9N-xv4COtdl%DLOFTTw_ffjgWj>2~WjuNx}{*xAOzL=2$J z;=TA@HT1=DkuC4g76H4Ny2c)V@CV$kl6`PF(Y~$@vQEU>o1nVB2~z-tzUzI zM&!R4Af35((oc^_(Jn0+R=FS4u}qO;Itek$hjJl$OK@x~>lSZe9bM%5$`U-8M;BV0 zceU3_^65PmZk;^y!O2<(off@BZdhkt_`TnWT{)%Uhl!Km8G9#ta?ZNGLJMJGEsi5{{77Cf$eZ~PVD-4DPFBu1~B8I0Q9X}Hi zStprFg$p5E5q4|Sxss$yq zs7R|VV7RyUz+zMxKUCm`jTJpQau5;$UG0y_E(`djW9YHLPe8;~uu}W^JebbEx!P$KHBA;@e}vsAR`7Fb0-g#lhv3Osqi7e0LjZEZyE*V6i9F+|hPrvX72245{DQNAGC69yRwX zLW{nCC)C(@T_I25M)WKGMsKg)3tdEYy! ze;bg3+h=k5x;!Jq)eorn`kL1-KiX37xRQVADr22IG`1AmG^dggQBka+C=hxih6NjMd<)ttn2c z+dmV;Gj{>vzMht5c6KITlKQyyn#!9R8ZNJ$T-~a1(C-krcvzU8XL?}|mkFt^cn5Ba zhhK&W3H7=R7uLB})fZXHip!+{nNf-W2%l?r>&{TOIBLoJ#gBa|i%W>2eC#9TfTfM~ zz>WpJtKi)cvzpX7^?;M8w+L*Qq82+bykrd~3z&Yw9ifHERk2yeo>{sTY9B?Yat_D( zHZd!?n;L6Kjv33m+84bmqpsF<-9=mVrfnKJDtOWqDqD>Beocy@L500Mx=YXR8aqRb zwPn2|rIfOuS+DOL#|)NM4^K|Y{Kh|@8CCqexi(uKPRC*I{V5k6q1^0GW!pC`%k`F4 zOJio=rRNWxcpJ&5(5%(fV#gSztbJ3CL1v1B#o_OP6|TY3{tN;qH|N!{o@Z9pTUSen zt(P{2C#7?slK1b?6i52U`h-1FvDDaN(*^Q zG*zUy+bY1v-5A~*f48<&%iyB*u;Oztw*?h+(`ajXPr-fsTTrmqdd|dg_j!BU%+c6^ z7FV8?mYVE&lO41_<=3{NpNYq!vl74;86`Y9K3?zsWVqRj@Vyfko(TtSbtrp-dk@d6 z;W!PNiDB$MW0A1D1e z-Y4C*sx;Q>MfHR`^Vw+erTSSbHvHE;}uto(iruHbMHM=Uu*Y-8 z?zgGq?@1WOds}Qq&EIBvzzr}XpZ1QGJwz7AttKqbJdF2!CLB|hy`+z47kT|A!@~;T zu9zIt_Xz7LT%)GPhvzDO!osNC_ir|G9F=3*3uxepO`wX~t?wJvbENZm{4Q}L^wj5g z-HJZ;@?XW<->&amLQL+3kaBR0y)DpH&tZLM4^H;Ljk@sjJIe{sNZz8MQCr2mk{2wO zn`w7AU}RV!f6_r*oH5k6HRQJurXYsD=QXqHdxYOrK|xy%(kQ{gf zE8z1~K_K{^iZHs@EL>2~-^)RoFZbs9R=Dx*rX|V}NRg)G(^|Boldjho@h%qoALS2e z3jXK67Nv^mOl|qgh(KLg$XJVYz9NN|{el?MUN#A~h2EHR=Q{7ST8@5a^|PAYz`Kk%n1V84YwAOP35&+Goj z)wkgwII3qI?g`C|dBQD%y1~W(Y5pemlF6 zyD%h+QD}oX0&d+Lm01)1G^c4fF$myLZ2xhmISjMh2ogxAnwu51YIiRipIDt;T3VSN zHhYJmR`PzMiX}!UU}1TAdSu3{7*J8pyf=)_@4ox#zo=Ac+#D#>@P0Cd?(v5@eG+Cw zBK>Qym!ahTSIa9nCjiGA=MS>PbVx8+tdQK8kia^%Nv;Um?yW9owX&JAIlH6%ed>gP zIdv}StW-GH5KNT;7I)CkzD8AeAs zed6NFwgON-n^P{=dzf#|9HppF0zpkt^5()Fr22D-*TY~Y28jgYdtVq5mR|=4s*o2m z<4OPV=H{in-mK$~Wga%C$Du!gNa+3vacS}egv75FoeHyc8zXRHM`TMF0~8WMh!Ouc zpTx0K!0{9{NzR?=?Dlo6^Ykzt=x5tCpW0&jBt=H{5$;~ms!o6JttGB?@Oh5b|5dCi zdPxt`9028L`iin)k*d==ua|p}u~f*b0_S zF*Q{*yv%4B#ys9h!#xzkoI`VK?b=!gB88c~{X=i3=;ie$ZPD}m+)~p;bW)iX3)O#& z?v&vFX?DGtvUh_=75MqON*PvnmS6yT?r&44eJa#%b3XBY50X(B)>WX zt{-kRMvjm6oA%>00!~{BQTl7v)$r zZSC9#GVtT$w(h`9QzwV%BX&$3)kGkzKVvgiE%m?9uftrJlw`qF4b95(U^+jc963mv zZS(+-uON@;(}RjjN|Hbm&sa_dnKL#wL`0O2Q5gSQvYG4nZ|`tcCIE1THNfujjxyXy zb$r=c{n=p`M1PA2O zQW&jiDj4JMGd?hJYKT)+dMFZVY|6|MPMELp$*qwP%`F$j@2zkMXkn6*-IU!aM^khX z@CJ@W0;nfmV&(y>wU+(6u^)XOEL}HT8>RNUJlYd8yg7HD3$``z8n@V4vT)#ev6hjJ zzM9Kim&x?f(ki|-Iq})V{B*A377$KDO*?P(-5TY}`isC<=fDe;NPkCX7vY^T0bQ1D z5ZxWW9KVKJVv$8f4iX|Gih4XRhmnyzpKk?o?6Ja)j{YPW;|A_M#+d#y!oO+@SbIKQ z!$A)5@I*BOk7Z$KYF^c==XGx9_ppV@@!X#WljO$4{AD@ogsmp`vW>N6LDEu;wh#U& zw)h8I6-4-DA4kT#{^>H&*q=m9y0anW=5A>buw?|=IO5U&A31>YRD!JH5ORR~MF8}f zdUsh;FtgEnrZ%)Mxmt@C_;0u1pyQg1L8~t-D?9c~Lr3F}9sN=W0G9R=EYHbe4Eehsa9#Cqhr8U zG#bX;>4iu86$XddzowHqyzEQdpLcr_z1VaYE6jH9`Zal1`R*H^=-mZPyH5|S<8M3k zF{!hof%eK4B4h{!4#m5KTy_TJe?K1I zC`7(ee4M*=+TKpah5m&L-}1-Zt<_eOsD&7K{BJCxT8Rb;NoEgBnCI7L6>@qY_B|zo z)47+}CJb1P@mk8$wU&@yc7TT!9|8LpcnuXkgGHITm}E<0li;TaY^3>nF4O-Wox|S! z7dZWoFZ*TVVQlumVFLl-S@Xx8i!=ZSHw6 zaI3zh^o<9=;iPg@N#m_wE&_`oKEG#ZfUH;VGQlf6CBy6;i>cwb3NQ*Ftfda8$A2FH zOMwbKx8w!0sIq^`lS=b%b-a5=rkuOZM}Yco-PRR5PeE~a6ji%z6X!o87CjHYVio%O z5(dGKCMl3DFa`ZhnboaGa~=38eraxq0jvO+V!pqPHaj1Vdr05^7d&< zhoqgK&S9B%uODskSbBUuzKf9fBH@CM+{RC5bZm5*K8{SBxMe zp>#eYBUPP|D0!Jpet~;s2tBqtGipXse3mS?mj|3b4aTk9-^a#6>~<0qeD${3#iDEI zkG)&B^{lQf7|*IEUVc=I2f2?siR{KFLX!;1oZcSXI5BztaCk6v|Y~EV6J3G ztyUBI849CAY>(?_NZvj^(a~u_jgHqB7rzMcr_T@3eP0#f3GL(KBkXCH>*TA*s#G3rp7sf9(-m^v7B=F#_hYblq{9e>!RG4*;F?!4LtJ7zxpGT4UQtwsSLx)fk zth!1m!U-S^1~RS&oK$!}lX(YrrbaGJ4dn+|nJRRoG|VU&B2`qr|3TG~lpyB-Zj++E z?S4XkBIp;l3dYwHtnNI!3On-}6=*+uhEwiWSzOJ(Lss>_HIMBdY91?mgSkxMfMoo{ zx5}2*x-8Nr;FX^~WwewATxu{ob9%hD-B2YsaoQAhXp%yZoqhdy{&ur=d>v&*)IUAb zvuWCA>~uuEaGsEWKtNE*0GDvM_IRUe5)L8>c^w74W}v^VMVcX1Ugg=wF@@#;gLgwI zEV%p&SRi;kQ-FUy4gad%mCTD@V`1rOq^TvKwjsjr)*3xb98gnRpGxcW6E6t^bbM^L zH+tcYfvh&Aq?Ba`wYT-1Hyz^Qbg>C&ucv2Up9mBGK;b+l9m;H|qUOTOb@W6~*(L1g zu37+U*2u0wuvBPZZ%cV*l5fx_#dwnC40rOnB3aSn191&{oc zD}9tIG}D#1bGZIqn*VW6Ih+Ic(m=o9**XNl*LPgD+5VLk6?ru^4-06@9SwXJ3HjZ$w0#RY3{yoySfCh^ zu}@i9NohC26!~x#dZz4kbN%bw?4pum?uQ2N^?@RjbO@x=N%84=TMY9}#(wT%reSVKbt1C%(p8WWQp{ezq55TsL*m-jNulD@if*O&VnVI*qj z1J*uCrK)F%p-@L@sb)zH;iR%=_@U_Sp=t|dnq?2Z>JV}Z3tw+9k`6yVEf|fTA0vbc zv!*yVx3oywt3h)9XsEH%zbWPZEOR1m<4s_95)%s=nj*I!iQl!9xF`T_5iE;WK@dm1 zMm@j1Y<3=JPfb^JaZaOUVr;81#eb)S&IOqsX}98k;1y;hUDF^4ZlyW*Nrnxr(voq$^-@bHFYocJG!DDopnaM775GFzkPc9HpT;Gc;sQO z5DjEmlw!2tRdZUTbIK($-+5%$`@ploQ6Hc!^6JFa{~fE*MObke^Zonx78VJut*v3m zaP#WpZo2AkknAFO*txuDr+n@(*-uVLcYUn)^|CroF*-gwJj~*bs8TCI_f1t03hSMA z+Z;|~l^rme=&8unEE5tGv_^qHO&^?VVZ;;FB!vsE6d8Vh34i42Xk|v46yp+ zT~SuSW-7O_)t<8}WNY}p(!OWC!H6LTji6^<%_QxWN#nZ-3kwgvMH0QAb# z4g6r;^9>~!KmiH|{tx^jW}@7lgi8-$Jr;DlBL;{|Nt^=H9v3NH+$CUw;Kaot5ur69 zQ&$|^QL%c8OYo;WMRm1=hBBRgjEK_d+Q%~!rv3LQef?4+R|%t6 z3GjmjgBP%5&wTQXg-`}^#)T}oxocPV0&x7EVtE~eaZX^VREhJJ$ z(0uUFY4SHN=B1U2Uk5_N+Bi9Nzb_7Wn3&k6ef_uRQSmHc0-j9`p3G>_I|)s65>9VI zRz4P;*4n(fC|bAkiJZhA>H<`_4ZS9Dax+Gn{xP(0$-}T$->qIvU?ki>$HsRKGyPmr ztci||_I4eLBE)fSflod+a*1!Yl)kjj5z|`))^wa7C?sii23JKUn47S41f-!NVqyEC zV|*{t!-5g>Q`2rHvIh%ycLDmUs^&I=7vq24d8wwQFI`)|3Hwr(*W?%lqdqt<8jywy zlnbK_Z?v<2c2<{_&DP%5(;cT$mxN&b3=gY=ck|2{p4x<=({AtLjJkNbJEzSqPd?s4 z-_mi_mH>puGD2&eN&{j|Aq@7hXyAqa`wZnDo8Mn0Oa5Yhps$oRw|=Wxp^lh>9%*Y(+_0z`JHxug|D~v5wn9^q zk+r|3vKL}gpj$0dM#+z?(PfzYxhoeS$wF=xd}p`|p6l26Fwsc*Zttmb&+7DPEd>rS z{XTcAVFDl&SMYLGdK04n;s*-uZi)UL`-K)dLE0FL)MUu4BKa>5J3T%D>SpaPkkrKI zc3Ab_@aPV20UbTPww9YLV$5Oo;k3F7!sx!0k%FhX6#zvP47btg&oM0|M%YvAkRgrJ ztG#C>1h~0AJ~K1ZGQ`!mJg>tg?&kfn(_=d(aHIdQiW!*;pom$?KB00}9Q#WF<`)t| z{OgPK@etM>lHcyTGd&)`1cOS@*FUnJni#Rgo@D#)?<|DDQVVA_{~QLeX0!V%Xlkw& zfXiMU<)}oLWK4Tc!$?eI&_$H98n#37Ufpvp88;Y<p58tpav!kJ32k+dtim@^Vl|KU|X>HDj=mO61gyyI0@{?q4ztBVgQ zn3b3yo1@c_kLeqShsW#WjWspUZwHYFy6WE;`K{b!2cktVo4zA-VqJ1Ac^p%LH8eHZ zd`&&pprnY1z0c|7fS`KyWdon|*SU_YQBSvDZk&J+P0gxzoeBVF*8`UN+FIY2Il-4F z9}E!d`5g-ut5Ke{_wVmeVsObEmrnAItzv~9A5u}4@U~Ir%)vGI=Tg&|h1oX5;7zHD z8Bw&9lEf6Gm~=%E3)~&Xj+&5}u%-`^8**?#j+8K<#%zK>7SB(}($IljwSBLvhR*}c zIQa~*Sk4(P0`g)@DPyu6HGtZz<)Tn*7kF!r+{5K>PO3N|AF>)Zpj!7$4#n*n~ParpyF1h?W z#)i)>@~cjAZt-t~PTVVIY?);P;ez8e3fBxfvVfNh$?jCr78b}+@W50(SHcr_L%?^rTHVwA!%=Gj~CfAoLK5AN;tNsx)pL?iqTzV{N zq?Oh9{L)f`{;F_28ktCHZt?ZC9aldf0`_|OJZBN=Xq1wgNa^#(5v+*IvuN2BjFy-qCY3Qpwl`mdDdm(a%Ly?laD z^R%^?9jOV_tuvuS^Js!J(Th9Dv}8h%%yt&MluJ)0t_d-%>R-JgM@#wah?Xp$Cu;P@<-1;`( z0Q+BF~+9g8zIioYR+ARLsW2d>%OnhBr27Tjb;AB^CCF7oE2_K9*Qr&ALpm zd_cc4)-koWCxIQRqG%`c2$fdU9o)R{cvbCW3nKq(`mxFAXF!NvUcl+B)ze-WitNq~ zPGF#aOw8D7>Ae8W7vqPGTzxLW=(x6z@DjzA5b&MYPjtf1_dtLmlUrgbsNj%7@=m&J zhU8@v8-@&@h6l|UZl|%aq5p2TdxZb#Ro;L;0|5U}{QoC#8TblP{D-IgZ!Z%ePOwy7 z9E>Umj&*M3&;R86^MOMPX`fgrUvd89TH?GX1_6ZdK`WM!0v0B%=suFUDx6^lp2e2D z@PnHz;1X=gO^Bu#J;USq5F?GYb37dd@A>=xfmb0#>F22LJ#7 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/branch_list-light.png b/testdata/snapshots/darwin/branch_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..3019690cf2195674f8bc392a75e2affef3fc2869 GIT binary patch literal 17219 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%0AM4MR7IAXd?#fZ3zTZZAr-&S$`NGeGC=)*( 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 o58;$H7h>CF?*EC2NkGHy)>oqW}N^ literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/branch_selector-light.png b/testdata/snapshots/darwin/branch_selector-light.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8ae7c2e5aea4b24a83a7ff6dd6bcedd71867d6 GIT binary patch literal 15585 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/changes_list-dark.png b/testdata/snapshots/darwin/changes_list-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4225ab63fc4aa37eb27bbf41a474d6b7ec1fe575 GIT binary patch literal 16290 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/changes_list-light.png b/testdata/snapshots/darwin/changes_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..e7964854735dd08a6f1d9a8d0c5fbeabafd3aee9 GIT binary patch literal 15959 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 J1kexs-vCcNx_bZs literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/command_block-dark.png b/testdata/snapshots/darwin/command_block-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..892e54a68c5a4afd2352db68aeeb3729e6591e10 GIT binary patch literal 22032 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 j+Vz)suiyFA@N5Vgvfu@lOJ literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/command_block-light.png b/testdata/snapshots/darwin/command_block-light.png new file mode 100644 index 0000000000000000000000000000000000000000..028584bfe1f912f88944ce432e7c7d8bd7820f6a GIT binary patch literal 21418 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 al@2s literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/commit_graph-dark.png b/testdata/snapshots/darwin/commit_graph-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..902eb327a7da0adb69d26e4fcd59641e59aa13ff GIT binary patch literal 26659 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 TQYwHt@_~}Px?Hi$yU+g%q!b#< literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/commit_graph-light.png b/testdata/snapshots/darwin/commit_graph-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6344bcc45036203e653b30841655b8244f3afc6a GIT binary patch literal 25685 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/commit_input-dark.png b/testdata/snapshots/darwin/commit_input-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a83bb5474fcb4a25d9e2347ee54c8a5aebec0774 GIT binary patch literal 14947 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 Ppe80HEm+B~>-RqZ(y}wQ literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/commit_input-light.png b/testdata/snapshots/darwin/commit_input-light.png new file mode 100644 index 0000000000000000000000000000000000000000..99b1d49d366eeedb76bccfc1d004abbc2120d7f9 GIT binary patch literal 14411 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%0DW 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/commit_list-light.png b/testdata/snapshots/darwin/commit_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..78f01a3f3dafe217d460d7b4fe4e66afc9a257e2 GIT binary patch literal 25597 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�xDGHo@z3oXzlK~mtnjZ=KVS8aC0Zn8WuFFXq%bkXOexPqM@Mtnu6h+W z{X8a=zr8^~$oXa`Kr;k7GBd-To&UA?gBS1S8zS4_#9aBQZ35?`1Pm+_eB+g4n-g6- zhZLoQZM}OVnl=Z!k%F`)aGBo>tnkFM+~jah;Zuu{*++IOeZ;Zl6;Cu~$nHp0o3$SE@<7!joAR{p{*A$ts|- zVvEUXnX^ZWkTI^R z>IM~eS6NDR#Y0F#9No^=THObJNGOYGmW-B@Zdqq%6$lHA_V(qS@+s&7lWziTttOM$ zqh7EK>Z!61^^RZ4ID zHg13F3kMC2<@N6M@GxXN{3mF20ToB0+|vs`dS*qCnu;5k`mbsLev=`B2meXlp|@?_ zg))8qGXbhm!@sMamY(c2@WKi+`f0EtWJg`^tANFydlExBu?8%4g8I} zdItOGK0~#tyB`M}y!TR3)JT1IneK%P+;3Dc<-t8GFfcN-v}%0?1rx@>FmRD_a$sqG z1VJwPoA5I^wzM^qzxOt_@Fi=5ig6s)zqsDxnb;p;^Y_kiUmiAa>J!W6#tr(X-*jwr zLXmTLsF&4=Q#v}HoGbnIsa5p2S-ii~h_P4AHKcQNEKg0bpvt9b&hBe;%4(%+&`Y9r zbv{T-i>RqI&EjR7_dEVQ_ynJ)J;IG+US!DQljJ28tDx^A7W~^<30w3Xv(2pD?F_N- z1KNSHtA$Tfy2O5O&q1%9f{mhVw@Xv)^Dg&(=V`X5o~q{ZfFe#pTwE|?0D4aXIt36y zq^xO@4lrFQA%%0DRHQ!yf#)+D)tBz(rs39Mlep|(@gpm#r154aY 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%0A&D~8|S9z{f`=)dtSr;UL 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�f7aQ-Ks&55R=2{S#^p}^q7bd zwts0~{Z%`ue^x3_jD4@Gtpe3LUE9`8c_T$&VxQevrO(~Gw>ByKD5#AY(a*q3O!3d( zFC&CX9~gxdBo@@8r~J;o;`$bVnIc1{T-^A#1}G(_X(#pn0c&)-Zh#5%SorGfrAi$M z9!QEp?tLut2(Zf~^o2$J1_Mvn34_S~-*5k8<-mu2221|n^fz73_u~kpS&EQ10*f6M z=fB&3i3Du5I|;G>5B@*CcU3=qtG}{FX2MipC&mp<~3M1lwoBsc_buS9u(|5p|3>6SJCFW(r z306OvA%a}zf4Bb{36K(;y%M}R(D*z3KPGoL;p_Z=&-c;uC4n(HnlaCSE5ZHS&(D$y K66Ipw{Qd_=R+(l1 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/diff_stat-dark.png b/testdata/snapshots/darwin/diff_stat-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0b399844a27f70bdaa4a313ad1bc535c69efd78a GIT binary patch literal 3007 zcmc&$X*e6$8jjMjlqjld#9C_C8MUO1+G=mBNbP%rYAvDmop2dLgQlo0sUfw5lxvAt z!dQ~3+8QEFQHnNdE!C1(u6FMIdH>CG@AE#-dA{@GocG(_@0?5$xdI&gQXi-|W+dL&wW1%LR zc~8(N*9a+cpvhxf9e=i~`NoIKA7*?@me0kg`Oeqv67@(ZQp*7|4&$Lwe<4k&?>4Ul z)XmK_Z9!#w2zj(-SXhI?hiHu({aJE$0M|*5C>rL@;+xfH5sMb&UV)ia%;nmjRI= zdZ=C{1ewch7+)7=oDW0697!E1ANyf31~X8hMTlZ(;yPLcG8Kfw;oaNxYuM;pb?z>X z_9chCZ!-uR0+~SQFh5omB+&OuO_m6$+gWUTMB?6MMTb|J=ua!=JkDYwy0bG0F|iD| z=HYt-hr`v1?PWel;~pVs=BHm1p(iq8X=VaLo}7IqT($m!Apm5C7;xgsKXPN{XfST|5g%xMz()ql6dJG?l?>D+`CFWBa{s_s#G_t5$2+Lwb`BK z`3G8hQg1L!K^I^jde`}CDt$JI$wVN&;#UWN zMbn8bFAH=zv+*knuWniX>{HeqZCM{9=HkQvuQ6%P(3@0ri5k-jdn2jp@af8xuZdv= zNRIE~NEbwEK&x!w4W(a&@Kk@zPXc8}D{fS{mDhCEt);bL66>OXtchC0&FRkCIh%E2 zUyL1*{kyKCxx&C=Vtnt2RRC4uVNg1d(WC`)9L4N9dmp}={OG5oxEjAcAYJ@((+Ii| zh;n>in9f#4QQyHYony*<*Cb{0Pg^X>2}`oz;eDdtxa*VBx+`4Pi1~G4DYL|}plq*| znT0;uPcYsWPbcO={WYHiyW_gu>~^**`ez5hW!Jh7&tNn36dtT&nsSyOlI4OT1}BH+ z6JM&`Nm(dj#&n}4iGJTSZXVo>B_4!;DD+PGRv>Vvu4sXd87{uOj@Jj8hk{u)Qb>jt zArz*U&sS6k={tQ3+Y7A;ImH?=sGhzkf-H;6M5TEy{eMF?-gX%o(~y=po6FK0M= z6>I&hYoG6>%#z2ag9BW3AX}5WSdIsyiqEV|)}?K1qq^AhOF3DEAbrou6(-O24hC#( z2Tf}rn!Z=?zZ5?w%^U3 zDv*CD%r^`wbhJgY-gtD4x5e$Se(RBmpDy*y27|}O#-ygnz^#M-=`2k>l|d-!$i4VudS^R< zOMhy^=Wq?9n|-L%<%@w`+Z`4gHOf~Pi$zTS7yT#m-#zBPAz=KXpsGN-wN<}0VyJb&{P6U*MJ}S)@v*~|Cg7CX z_vfO*033Lq;_~&Bx5_AB1JM@~J~t~Tl66-_G5!hLH(_Wk>9&VfM8v>NfeI84BKv8> zx42Xfbxq|D?A|SDiC~I8MkXZmSs&6&BTthb>Kv7@6^%)i(AjdLK~*YH;DsJ>?h&xm z;w2>MJ|&i$y_craU?8ezp2T` z#)TdvCj`kILm796(5iK(Ya|0!e{pG*$UKFAeD7!Y^n1uQuk4Au+@+nE?ezx@T?Sb^7aSAr;J~1j;2RX^ASWCODlCd(r9u^XWl>~yd?G2=nlU&w8QFz#{;uZ?Nigfabl1NA&{o|5 z(;OS<&K|@;juNmVABqpDuV?YJ`+p!1f;FQ9*1X$~UXoN)%TbYbuK1RiLT_kSgp;4` zpg{h#&0u}ERj^JAY@^v$bLw5vKFbr65C*vDdq9cxsrT4W$iKW52I4{RJDR!iT9EC4 zw0g^`fNPhX9;cdKrh7JkRyXx(`5nN>j#;`z92eYv)8QoCUMiiS;_u%b$i5gCCCIof zeKMr&o=Y)d@2PTv&|4KQ^#enkhJ6QD<;GkOh&epNU1+6v>{mF<-*x|0KP7F}VH4tI2hZUjL3hN;Z}gr>TQ`gnk0MFd9)! z)IF@AsiA<0ur#$c!5e!a{sq%9ds+Yh literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/diff_stat-light.png b/testdata/snapshots/darwin/diff_stat-light.png new file mode 100644 index 0000000000000000000000000000000000000000..93e0b93f150c0abfa1045ab4094cde4d3b81cc14 GIT binary patch literal 2949 zcmc&$X*3&H8;)YAC8(+f5r*1}X+{O5MbuW*Qv0q-Cx|9?L2LbJh1Q@bYK>i6QMClE zlD2B!fugJdM<-Vfn+i+eMZS`{*tpJgS%>Dpi zI};4RM*cr+h&%#7wm#vdCjr||a>*)JdriG^Z+V#HwyV*WwP9&-P&*ozcB&tiEnq=*<Y7vW8R)8w&2opTOPB%IqCC#0!hP8fav_sV3 zpr{`o7CW08_O>lK3k}9TX-0JBDPa$Hw=NNnS68fjN!xuqDwor8^?8Wb__u5SY%5lD z3AV^Amv7NC3lM8$fJOEk;UCIVq!N zwIZb$H5tpReLgU5SCjC)@E39Td3eVblE&o^z)A~Z@k7!^m0STgzf^E*MAltf+y!xU z^sBhnk4LIq)>5#Q*hoE+!MG=C&){z@Ref7~FHv$Xg)b%nXt96s^1ZM^0-p$`|Hb`m z*0WFGS7b0;^64lkd2x8Db+X+L^zOr>^+#H|g&)3NTG(XKsvs9}XjNhH5FpYXwhu5pGEw@RwJbarqp$A5cO@9LtS^1+i+|49ZImcu8fI^7hF7ghkaV@K zBJ^72*jQmU1KRjHF!+MlRPskqu`H&Da4?%}-WHaacPh$FQIV|O#!OV*S@C%Fxq=N4 zsHxH@&fV?6v5BFTxq&iuY(AKNHc~7*7o&5%(f`}rlR2qMPgAQWj#5QDO@`Wg=7`SV z5^nLk{`0Ulk^%LYa?`K3H-bA}h+Zi9RPgx)!Ao`yJ7Ife%(EV}Gd~BRXos8{YLLzm zw-FTU)^csZDDFeIrK#!^)l_f1RJXkHoFEJLmP9NGw*N&_Lr_}s2zF({`|72rSBFE7 zy`JSoJ=Izf;!$d}TGaFE6<@;udRE_+Q689Yb(RQb6n}~sVXAY_$@olXCdxtEA}K`; zpu||wGe3v%gepZmdzIG&y||WER^Bu74FA*~eV9Gm)+Pd0)%0;6I`g?XYD|1}jbEyc zYi`m^pc;&mSMX-WlHsZj+l5xdQ>|<5&P`+y zHftOgM44taTJNh5L;>^Wz)!P(`%Z0}K3K!)%C`ACHS9+8`iOIVzaC-qF*~lxDlBm7 zEwb<4puRzr37NCp;it!}7*Z)TceuGiZMAi{EMZ|i2<$Ixj<>c7-7AwsnKi|V8KmIG z$nEXzAsDvF9tPY0(lKeyFrm$nmfRvJi}s%5HTBS%bXwB7YB58tB`8g2G;3zPE<;$c z7BgvYcX|DQR8sryFk&O2h#J-$s=kZJQ968n!RM^<%C=TYlL?s zaT~T_LBghehsQy$&JbT)lm`tQw8z493?e85+{CiV44UB7{O0j#4xp-lKEh*X_Rb>G z@0P>vXo7K+KKppHkMI1D{Z7i;E4JkUq~WuBmE+MdweL_vA^UkQK9W-bX?fr26X{L? zC|zmQ02HD!EytKaO6ces_o^{Inl+nTumCwBkX7k-GBbSNSX(7VD=Y4fkTdV~gHL*Y zd(WNIz&Oi!rShhREj~t1gQPzWeCx%4iE6hT{xX!wGE+fz5WrNfOJXXcAFX*4k4eqJ zW2Jk_59g?{n-OS4n6|eJ`%-^_ZURRj{o9OK5Fec;1^Z8#9h{HNYth0xbLnLfnH7BA zS3byG7M$c>)eq0cvrZPlUR+wB4RUElhLmnoGA~2&WL^9pGK-J_Y_N7F;J+DSW4MT2 zqu+L{p-09V)~DD`p_8U$n$%Pef6y_!zj)|&*qG)YDoqL~X$)ekt809aZza;@GvpFd zN>JZt{T~!lX1x(atx(nDZ*%+Ok4M5YYiesoL|ZU?Nc9oy)INCs(DHNjJ^KbSKwpUb z^QeRUwa|l)1$ome7>a@C>f)eI%K&!d6eixp$m&{1HP;boyuA0;Wre68qh&;4y6q`Q zu|YoQaD-}-;$MUfD7#|5x@B%wl8ZO-k5fqDJ-T;4(D&;!I|r-LRH$32qfD0)-lP5$ z{1dO4BM#$^(KgajP`7sn3qv=ME(e8{bX&oM#~qyyTotj!APC5*Ji-}KHI^gHKKB45;IJgPWlT S&YXO&0fu^}@ERT0=)VDF2wgb< literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/diff_viewer-dark.png b/testdata/snapshots/darwin/diff_viewer-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..96b226d254f09411b0a7a9b2aa6d41535f8e9329 GIT binary patch literal 30001 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 Z*B{`$bkGay`cP@1A?_ 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/file_history-dark.png b/testdata/snapshots/darwin/file_history-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad872e62ea7e99afd9a61774582426121c4e4e6 GIT binary patch literal 24432 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/file_history-light.png b/testdata/snapshots/darwin/file_history-light.png new file mode 100644 index 0000000000000000000000000000000000000000..733704f3ef2a616095b5bb7a2203cbf378cd66b8 GIT binary patch literal 23448 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 M&0AW9FuSmS0x}J*LI3~& literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/git_status_badge-dark.png b/testdata/snapshots/darwin/git_status_badge-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef1ce6376832c9832dc4be49e53ae29b70c83cf GIT binary patch literal 5894 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 ULwnoe@oo;aCtAwy6|Exv2h{|&fB*mh literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/inline_diff-dark.png b/testdata/snapshots/darwin/inline_diff-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..da868df0061df61b6eb7fef24c6c551a0fb1abba GIT binary patch literal 14515 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 T%oLBbzs8UjR}iZL7zF$$#;Hb} literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/inline_diff-light.png b/testdata/snapshots/darwin/inline_diff-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6f3a2fed15623a956def0a8cc34d426017369b GIT binary patch literal 13783 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

q$QHuDYR?Nip?&V|o4>XMWm+z#eaW4m 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/pull_request_card-dark.png b/testdata/snapshots/darwin/pull_request_card-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..353a57b29041813b8efe7893eb61fa31afd5580f GIT binary patch literal 28452 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 Iiy8#}H}KQ%od5s; literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/pull_request_card-light.png b/testdata/snapshots/darwin/pull_request_card-light.png new file mode 100644 index 0000000000000000000000000000000000000000..987ba2360e15d567f148c9b46740d48743bd3826 GIT binary patch literal 28065 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tR34JGRP+c98QLq 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 Ww8MHkARK@7w7j&6RHdY8@c#j?{1U_f literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/review_comment-dark.png b/testdata/snapshots/darwin/review_comment-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..508238e331eb39b43bcdee35a8f674b68360d0f9 GIT binary patch literal 27660 zcmdSBWmH_v+9=oofHnB z$pCl-OU_DGTyT+3w1>XR&o5>Z_Io&5yJM~(zy4cEZrDhd`l`lsETZ56(cjHY&oZ&g zn&ry0BP$nIbIs53ZbZ1O62hXQUEST+k8VTuI+EHI1-Gh-UqVOzv%?%UR04c(UwNgB z^f)mZnOSmh8ho%w)K-g!2Un3X=Ea4mRh*UeSGk47@NR5L@~svQTdm3RQZHMfK6@|4 z9R)^3PBggV>nF)rNxiNIG7+=czBZEKfZs{Ovg8S#H0B);UvAvI4A8tp18k-KBEfZ& zL^sk?S2=sJ2Bv;4INw>KrD^R6$yZc z`&KxsM$(08Zc$pJe+)d`o0(m8r@wwE8i%X@A}H+nc42jtDCGdeiS6M>>D#|%6qg(s z9c507%4kVAo~$E}Kj>aT<#H@;OAL&@lw7+p_{TzI(0*L){QbTBfOV*>ZWf^f+sHtW zrmn8`eLi%5Z4E@XC@j6R=6Tnzr0Qw~X&Tz6zv1;a$EEr)$V*iH0ges`>Q&b`JBi5) zr0-e=%7!ZASqJ*~U$y6fY#m5{5xFkK6Y#JO1UW6 z*&P>U9vh?R+}-P=@4YZ1>bu{6r?#F+%p)~5u{UHNRsFRShgDTyCPYN$$8lGXRq>uk zWv&-|#ly?!C!0Dtz+mHS36ji2isc$FFC`^3YTZcYuF}3;-LK4CdBS^eL7*}-k2@?h z6U1^pe8}ohp;UZb+dkHmb{{CarKi96Q7$u5mpe9gijKNHo%*Z(S69ki*ZxxwT)Hg2 zwau2y)D*o&mqlA>N91`IV{?Ot=DOX{i|p;u)SaEa%!VTr0o;2CcQmRu$)%=r+c=u1 zGdqvS$c)g{Q@nST^+g`lySlhIH^_@CThI36e8tgZt}T1!}v`zJjr8bU~oA#uJXJYD7A2SHrEU zk`fTeiq)moPC>q9($Eo0uoa17;QGktmMUE`AEqrGxVf45suJ;OAN`vu`*R5fDS!RM zWK?>(w(((@2Ho?TZw6cBcg^QpnnXd$#8HwwD#l@Qv@WmKf(CWTW7==3i*BHK?uLnQ zTuJK3VJB>Y`8tn`y%mZ1p!Ospyemdm!|YN;lr zf-7H1(867wF81v_DlAX)r?Y;ZDALmylLYP6Y+0C_SGc|7Hu4dEC>^0=nR>F$1F=KI zGkIe7TQ%qu8_{A6@~TR+z*DGKqtKU>yy0`PgQQM*u!}1EY^NR zP7+Db37dt2P2PEmz2j}fNuz(yqh}i*SZl;fx$*hv=LjuXZ;c<420=lPw4~6Yz-}kA zR@UD#}b#KKIZoPl-)>X?AFumUMPEQh~W@M;y>A7$G z32=v`U0z!Hc=w!U+U2S)WaEf^f=-s?`w}fdZ>s9R)m3l&!dgCuKKDr6>dDyD-kz)h zS)~O$Ixsuyx~IKOdjLz+%e(vLMyAE3C3tRJCkl>PhnW3{q%G(uMVBWVQWL|vS;V9 zk8T481tE)|5{W|zo7ei30hW8el+2eBb-?!wpsiMWlL`JAHcvL{$>ODMO*EBNRl^1> z%cx^>3SVXy@ud520@1?7z7QI@RcolJFPHKQJG%aPSUhW1S6@Cl#G=e^V?fVD%r~U*u#PT}xkI<3+^wuo=%B(@a`qZ_;6~9g!0W z9xNKyAqac`HE1NAEqO^4q6X*76_pua7Z(&zpulQttr-;|hWz?betNEXM0hFN*12ry z;oi>9(If}bP}jFTjg=Ne2gV<^_1#;3SVzm#M_O%y5E!NH?bAX#WGyW-(s4Hj+_YR2 z{40Op@~YWy6ZZUm0cLPk9f83okJPUw1iQGfz|FhreR-IjrP8`#4VNb8qo%B-)^^JR#U53U9|(9|Ng> z*r7X!zni0qKf?5-Bw&!e0IqZ6w&Yzw*MQCuIv#mPMRl0jWLS5 zC`KBu;X(ZsuIK|ugBD=~#)Zey#KMWPQ_vkWtav7@1g!P_YEpV~IEswI`{0ttyZ>9q z!Qp5(@8gE7G+DNB7+N(&8ZK)}2X~}c{zhj$oEGkzc_Z)7j+YWy6p_a(JzL8c>+GaP z3X=O@CLR(?*JQ%p-rj@LV@6dl^`#ZId_Lr1Vx&dI#zRBfaou0*?v&ujBYn4Vrpw)W z53h}0lIvGmKHQ9+^1MA?)6=ygB4BP-xj$2pOcg9`EYU&S`zcRaeo2?^}~L#$O1{p{`g z9C$nBd6XG7?I`d*_6M8wTk5;Jm~>3`50|opE%;O#X*k=?%#tU+a<6ivD^LnFN-bmim8AbClb7wu+v|lo z67+nI%aviB2F#;1BW;b&wchsr`4(nzZ%*enuiFPY?2}Be&V2R#+b~d*&cyDoSwmaN zM+^}L2FAjOWst^3By!ogPSK!6*P5GmP|DgbixGX@TgJD+PjB8}qV?|j$;`izQh^lB z?tGt94I*}&ns*5mEsLx9I3M3-7lD1=D!YxIm*&a}`Y`jmX((*d>^fb(>bY^qmiy++ zh0p79nWryo)8aYO1B19Ua?2OCxMZa|ukB4D-J(VCm-hP%iEtNV{ymK>Jj>uOcJz z2|@F46e3F(iC6z>X`eiNG_&?5~Vs4nY7)kJ4-CxIvLl;kK+#9(WIfL&J^lWeJ3MJhQR#VUdw04YnNac_h8|_Orsm@If;n z)4tBHfn4#& zF(qoGw>iEKOU9t`w*y4zK*H88MEA%4I=> zFQ%-9S~3qCPROC6C<70hgQnBEe@Cbi8NAJvTE7kK+7a@)w?F+HWlBU9L1;KCB3IaR zV2)gDc9&Fgw&s6(fb273F`Z6l_FRf0D=LZj@?Le7h-gRGW59&{jL?9-Z>UMPv^Z4E z*bTNk*HJ~z1blL)k7pZZd@JdkxL{uM$mL_k(>S&1(13R#7vi30)ojE;M#`i0>R&^H zLx_W_x6Pg{#*qVO#jbW~2va)98L1xXB-7-In^juu&!)aQua8WB{Wlu|xBP={p=@A; zZQZ|J$4ly`CkiVq9QB9t$PX`ppmoG#Wf>?+;7*JPGDB zm#+hv2M!&UD}D5f;JLkv4K_i72PURRMy5fb6^Ih^ZH`##-tD~xb#snyWQj6gO(r*W zy=u>2gO6FVb$@r{)|aQ-wcTKuG-y`#vFAueN4t@@3XASX%R1ltQc}D&`s&a z)j2P_T75+r{*2dhe!c+YPegG*gM9yfzyd_zMi`q?C8Xg`N_sv|=*)~&^9DmX<&_O) z|0hw+o4#1yvfjk_c-lvYy!LQNMLo-W3)rhapDW_$W_Pd}0Bzf{q_^v9-g#ZVa-aG3 zm>-xTfCb$aQz&6~#b7U&jlmx>N6eJ7MrhHJSq=NPYUu**A1+6BnrSr>*^E@E49G)y zEjGNr%H!%#zvWHy(^4k3fjDVPG#DjDobPltzkh9Ou;Nd?T}Y z#Rf=sS8r8^6|(CzDvdF*xbS1-D0}UD$@U8(z9co8^C)D}^f+92h6_03`kQ= z{Z3KWYvjdWk9hET7+emr3=4((?A1MK^5HglyjCs1ha%!1!_Ea~&y1ObRZ(tf+gSRA zh$agkD-Z?ke#@?7!>+2TtDsGFbECYNI%2C|g*jHiF8;vv<%_Ee(B)#45e=RwBI;*@ zhSEOiyT@H?dzEgLxuDa5#>9Xmlvg$iR!|hq6h>ntvnF8T3A!herAlN?yw0uqTYe6(zErM;?oeZE^bNKS4p8c)uU+vLdb zzD>@*s<4br$xgdA8Ur;E4Gs@JUF|30(Vq(XXfL=9#>QT7JURgpQGeyZ<{haye`JOZ zi9@AFq2Lk}GGRws!f&I)T`zG=61kqcbi92Gql$P0UbpCb$=lu=|5j!`sDn2B5m$ez zOwV7H6!}XzT!VaoCgR)32QVm<)ERnTA35o_y58M-h3-1g$zzRDrDb)&nh>+F^M`A& zT^mRj>p`HkG;W-6QTO=}Cg(0Dul!UCIuMoBzV9SAH*H=S`8R%7Rm10h>!Ws8;?FW4 zaogJvqfptH9ctp&e#}u8qI5K&3Nm8V9(z&g#5xBP=g2xAK-XvfLhb08L z@5AYNKfo_ggvKmVS~5KM5^)R@u5r*2cxA*80%z}~Y<0H<>AUD;mNPEp+wpTWqHmF; zw;&0=&6Gn#m#0h1@s_Z_7J`7*Nv`(l()xnHAb!R*-Bq82;U^O|_|lhGi-(>2m$aTu zgVy|3UeWf}{QTYB-Hi6gxw|j3xY8nf3Tuu$nJ1A{TFSeVE#&a+M*>c0Vh@vK7(%-f zm|u&3P5mzc;}dW|DGePdj?~GyxKJ(aPN((fP?O*xR78~m(-f!<>ib!@(f^YySGszw{CS;k)sj(OV><&xG8_(>RSA)8 z{dQN>xiP0=Y~1yQ#x3P>&>(*6=iNpbI)XRW>l-C6oZ^(K>c`uY^z`7Gf%jvUF^Qo> z2_=<+yuzJcrD7%n<2M1Jo?bsF9yN=Ik4p)a7L5hh`^PPzc|5r_h0Qf2efOqPTQjdl zyH_xyc?q**cuK%*dM)UYe#P~SeY&_bfX|z_(^M#FxVu|5H7WK`&tr<(w=O{uK`y!N z5qK3N{d#yf;p;woOXOAW@}vm;AF=!HC&mRw87hzLlwa7%Cx&yU_a1p#J>`rP~;`C@xAlle2rozm_aBuuQ)gmeZUaETUQIs9o-9ZSF4qpI{N*ELvl9r#Qyx!>2{ zNh~fA)MCjCDPK%2Q^I-YDScO6QI}e&>-liC){rA0^#_V)X=k%Zx7{AqyIVpcXq6zw zrr~+F)E<3E(p}i0V-rfa7G?`|(FLfilHjIOy}27VUT6?6wSLHLAf|EBElRP)8&^gn z&5$zwlMPI{SO<(cExQ$#@{ryXX}m zA}OO7Qo%PZ1O`SG$4gN=XyT47TJ6Pdq17JsmoNA0qfp|7%P=rvY{GP|yQWOVlE>j_ zx^B&?${H60+ai@~h@|lRTs}B$Iyfv~!jzt!&E56tg((t7J{o13&GLAcSyP^!oJpM& zR>PrJ^7!|M^TlCh8*ug3Bn6*0p4GOw*Q|Z5LVbu;5zhW~d~*An(cFaTyh2jWRg$W{ zYfP~fW|E6Cm$=&M((AePbthyoWjW65q)OY)WV!V@rLCt7e7<&-)?gGZ&{`^?ACzGJ z5n2`u$UBd&^FmDGtx!}e`1Gx*yo?Z&8o$Z&wz#z0pWW=Ips45@AwS|L0Ha=~9(Gs6 zrh76z9{x`=GdrMzgSWTn!Cg3Y#GB7wF%z{Zln&u8&qpV_+SOJdmO7T_el|boj@kY1 z-*8Q$#HFR?ecw!q`V=)mS;vpvEei`LPAX4Dbt*;mlD)b5^mb6dp7JmWharS_72QPQ zm4Mq5x%_Cx_!w<;J6=c>{9l|?;R0n}elPqhEt-Um2L8y!sO>LMfH>{s$|Q9)oRhO? zCU+h1H01?E`60YRW=j_a z3LDs)^7RzV-HRd%HdBT4O<_6`S`LR5v-+7T(>8DD_`wMT(t_4TFTWyjySSX#7ML_K z(A&xAP_fCPCBo;=_p0R`)js0ZizV_8csLJn3Mv-Wf#(g8x8d}v#+8P-{XcKC*NoE0 zX@f+HEm+cj_?)-I$CCv1mX^8=@7jg4sSX;ke8+f;f-I6#m+YwO(&a13-(X8a#Eo8> z8A*`&@Eo7}u1=OnLyvZbAtw8m27_NW3ncNi_@_^d7%32V%Ene-_%#^sGV-$yV)Bw%7I zJWwLa%e8>yN%EbD=i7~n>29zv%yZQYG!aV+G>(-*#9&$ady|AyX|9!z zFy-;NDVTGp56^Hny6*4LitpZ##>O|?GcM}b@=+9|VHy<8Xo*E5yYG79WSM|a^c_10 zd<8$+3_xfk?oNKlwC2LheJ(B{eRV}2M@&K7h`*3UQ~Up!J_};>;R9xRkDUejJ9ZtBL!gmx z+069I;@^P~dBTDJT)9L4cg6o%`~TEz0gjxXKPzv`X1+KE@ALv3P>Y5%pZVjX?W?sq zU&?!3J^eeut4~C-TCXi^1yqlLO4x1%gfKY!h_&6>q8fz+ z`}xO?R9N+%?er43yV2pQSmp#v{!b4Uy18-ccDwu=b5R#raD1^s=(&4N!l@1e@T;qf zt2?q;|i`e!#QE9j?Z4|Hw)Wc+iOeSgayk18!xexHrfSdOI>ldng`8Jt6R4fQD2 zfF0hxvl;&jwdA9L_a1pz2nfg!?Ju?DXaWql(GRk(Alj6eOSu)h>y2G+&t@jJh43sC zsed}WA2^P-RH@gu>yY9_gvVwvc9R+{l1J<^smzjA`4`(vKjkwtqB@1tYf3R#iajyI+_vj%o26<|y7ji(9s6Y}_sol`1&H2{JDSpN=psp4XfVj4bl#ata zYGU_MY~rG|7WowPhL6li=VWxy2!}e~JxDf4ACYaz>h`CSTeeU_@Mt>Y==jX~XKqSb znrPlg?-ppq*u#V8;(`GDG%NH~*Srs3a90GmR&qor1!c#z(D8;3BSap=<&eQy_FonT znYX8tb^E>oJ_#{I6*V>E``7sA*2siB?src)+jL?0%oF`HGsI+M9eMG_=H>$Q4kUm- zOG6$@QKQYxkQJ5|w%hJ*JCA~4H$}n3BX?!{!_Y8JS6fx(?GLZPXTF(Sp(#Zb6_X|{ z?d>ZFPyy?%L^hkvFkiB$T5J>)To8J)j7?1DHYU0qk9RM-LMh1hnXz%HVlGBUCN8&o zY>DRe68o^&>eIhUPCMJzm3$wWp4Y!zxz-jXtLVt<^?$SPcqCNlcGmx0QgCsa6q)kT z%FI~v-R516Qj`NdUoN+z!u#N7Kzn<7O38T9t)yBdNLsqUcfs(?FvZ-`a&eI}3j1j4 z@P?4zhp@$)D70U7PiS;VhR;PpDPs)ez95xz_0En5s3kSoofrw9Hf7~Pe}btUn^+n$VUbS zQbzy}aX-JnJ;Y($#g&&^W~|Z|NPxUp1;Idr5{{GfEqZJJDCJT(d$KQRaJ+HQ>$0yU z>io6I0uTZNuVj+8{}6ZtuPg zZk6wd9WHM!+ubHMHZcR)k1Q-KPOgrPOq^X__sKCa57XM}l0l(`g?!XB^pCgq*?i2{ zIbI+ipcj0w*9FLWyxYWned(_0BoL<5+0hxBt@fkp_rh}9v(jzxWH!!}^LXR=c)rE*fA4p-ils;#b>it#XCx!AroRqv0#8Ch zLN;Ed$;E6a#nSxxceh&IvBc}jPuK7`ua-D#G1%L`5wfzd+}$`m5bQc1Ulv4+mDk4Q zvR8bibhNBYLUW7bp`}hf`uZBUC_Cybhoqbcr!nCh`Bkl`a3p#xv2z4Jj^*s zFCp4F3C#%!TyP(e0f+T^y~Wgd7xwSQyyOo@hga>p_ z0hFBBsjQyLy1KIVcAL?BcV1T_o-`+6U0wS7%eHRsNip@Z-8|#Nq=q9p;K@#AkKO(O zktZZ%=+%}ZHo))KN+Zs;s(K{pqK!sRXJx0u(fJ?&L8ho=f&$eARiYTHBbe|lEX}9V z8_3TFX>p@H`0Uj+Mn=Gx55EzdS#QC_PEE zVWEypD8bACj;_6Sdgq+9=asuWRNBePHau_unGRah(lW-5wuc*AHso$@;5!H}w|ZAw zK2Cmz)%NuzboEf~Z4$RdSGNx*4_kR9Crgu(ytvrH{UvHPzh#ucr(V@y9{(sRl{bFN z{5$RsW)6tg(9Kr&tIIA)fFG42YshmH`Xa#Z{f(Y>TlH$qF?IZKOV+!xsz`c4!RW}O zcuGN(L039Pw}k-k_wQ^&8Y|^}L%o@e2`~3rc88t!elZl_&ps6ptipk;eYZw)?t9;v z>_z@|l&7aPV6`+gfr%$m8f4uU#Jp^?5f7q!%4u$1x*o_H8j|=&ZaLN^J3r?TDeqpJ1fc`=#R5A~GY%yxkw#WSh zuqi48f!vV3{~All%d@fC*azzaH>(?0Rrb}@wm|3yvWK4K_4ikA)@>bmwykG?)%vny~N{uQdEpul=%k{Gxk{#xEvT}{Hu zIy@`PrfIObtxSy}F_{sfn0#_#hKGFuRwPe93x3}qL`+V|f%V75Z2xy{Z6}L@*>(?q zFcrEXA;8P5t*s#;-eD|W?BpdjIp3ouit=w{WeZHU`s`nxZFuDeJ$j@kgL8`jK&v1D zfz{*1>YS#iQc9_BPj>`EV`PMk@huVioTLq<0Wl5Bs)YKiA)VT71KTW?C^1U$hWpNe zk*T?Hd{R=ui2vS@@>X%Z4<-EXn&H@-&?ux%_ltpfQ=G>uL4~$kzZJ-V?k@ZNYBNZ` z1MNq9tti4n1b~#Z^q{%@kgp5y}coG}4fbTBPdl|T_Vvbc0T=kPE6?R~XYH2hB zYiL+tZSR?=pi4gY57xkVgMb6${~C;jEg9)(#ixs7`ihMWd>Acl=jcCy9EGf4=>6FSC6JnxVAC<{KzA`mA+T7e4<@=j{ zcY==A+TyN|(hsj^MikgoIcR(QnK=WOcNiyj+z5lc{ti7ajR*}T#}Y6;z>dJ!#6($z zWi8>%A8^btXtUkIrf7s2dyHT_hg8~`DSMSjJ z+nMR%TBotP+7c}h5#twEDlok=8@^(B;fbC@VZe(&@KW}XCw)un5%T+mEm73@ful@q z1Y~3)0&4?Uk%U(|15uR1ym)7@N+bOQf9k7&0Sx-^bN6f;8XmOS$h6ztLjnkSdJd1D z>u_>P`Uf^z=u$!f)YOIk_e-vd+%do}Mou@^BFT0AUnYPRZ+VIV&B8meP}|oSNmd z2KD*|$2YI83oDqWmdI-B+bs-kULgCCmi6oA~Eq~Pjm7wwMM+1lNH{+08kTqPAH z3}>fWIKq9!^XH&;u&tAJ&&=(!xA6`+JUJ<+fWLiq#rfl_ltGs}+3A3h(GfnM7g|nH z3!zz3j(%k^B}7u|*-z<8hvbZpDczp&$sp>3F17{1dTLGaSZ7YQ6U*6>+ENU_&K9?@ z#`o{_PWB6u1f>QUW9cCwxYsvbAuC97(-YlJ6luLPQepbXdwgQrvJGjQ5Ijj4RHt^H z9<4k3)nE;tmnR%9IepMY0|97l<1sRdXwMTphn@%Cab|@-5oK&@sjAYxLsXQ_f?xbA zX3|(aQcIx<*45@qB-M8&vne2%RgzOq#WW1gh|av+v&GSkdbyr zK_$c`YI&H|Hz$LXJUO-4?|029&lr6qEm4e$)%Fy;53h*q%BgvL-;Tk=?4fvYrD5>d z&eqL9|3cB&+zhTvbJ>Ghdqx#;x!U;cbedmGX((|p5HWTNmw1Fa?44U)j!P?h>+V<# z_JEHjB8U?Nt87-e-8)=u#>U2^dAvtE9lJ|fpQ;jc!17C0X6#5(etzb=uevHL1>eF# z<8oox=ip$9$@8x{sM*fWNcaq{poQx!TNucyDx+KV-{DUSbc84kuC-~X+}E$qXM18a zDw~G9&BK&g-9{!Rd&g&4+1K@DWt!qJVda7Pk#JCO-DyhO`V2@8bX{~-Tg~OEVVjj>XJW{_S+U_%5QM^FIF+}mFg@cMmpwr^}?qesM;76~u(ic(`+gIR=ab5ASZ{{sx0g_#ikTr^fQe1XjpF|+Rfre^7K)qOy<*8q zmr2k8Y-V@~e2mUVEn2oXPl+36@w>9S$^E&x>M1KL8y}}#xaurZW6251>Nz_-MI<@` zyQ4Zf$`5>R#`*{<`3$-uv(@?6%L&dx%!t#b%h{s1xVZ1{qFr4&N*Hgq=Zk@%iG?wr z0fqd&%+4SYTU&KV$gaD)luz&de?L2b^;pI7JD;G%+8l)vY=DvJadmh!8S*Jwgn=8- z^MN8gEo~x=o+oijuKW0y7h{lVwO%Yqf?3=d9kv#1wNNSIb{OBnV~Ags2yFT8aM_zJ z1LD6^W0;N{7kotMwf)+>F;^K@qW&Esv2@D54v!$NJLi1XQlr~t1U5nhh`f`NfxDMM zzg7}Ufc4L`qhfP0gfEW53wO3y6C;!K-xp5G-4FraH8t<6%Uytb)QJ7rB|TA^b<)oN zLb_l|N)NB^ZhKAaa(xj3x&OfawR+8JGuYLMNWJ=7mUWNkDis6Dr*3ERSPZ!zr;^8) zEmF3yI7@k}{iHv5d(nr9x6Bv|`=#Lf$RLF=*!IEz^FcfcBDyaQGAs5e7({&hnP5c~ zL!PYwcBq;Ybfd%aMe@F%%bCr*mmo2-oL>v~4Il7~2y}4i@7fg2EiNuCFIQApf=w87 zb0Snx(X80~1kux{`?B_Q+>Rnui#^FXGdA2T1xs`Dq#kYKc&V`DWHoTvPX6|5c~a!W zq})XBi=c>srFTJr=-6|_O-e@iZ>2H}Rg0nlLzst;2_u%i60d@y!2u@!1rHcZ zf~Q%IBo-*)5u^GIPF8GOA?hE>q*)3jankj+x${7Bw1Ar6c-r_6_B3Sz`8KeNqOSZ2 z{L0!KD;uZM3ea`;gLiQQLk8?%P8mp+NqCXnzkX6SmDb#Mj#vSC!9n#EQyM$_fY`{$ zxprPx1L^6j($nP#V^iGj?j!{Rbi7Yz@;BPO8~f^qcI^fqgTm#hF~+)VzW?sokSmnK z#4S5vZfl_Y#`9N2x3Ca_R9sARUxpz$E-v8Uk@7~c3%@>4)WvS3+H&ObtXZ3; z%-A^T@-hYlYQOqsnawB9$UsBpBJwuL;|xNJmPu-W1c#zNUZDN&t{|ivb?AFeazsQ(=OW*A*zhK(J&0x6+Ss8a7t8*@7 zJ>}R!X*X$EzecELX1I12%RH;^UooJgK2uk&4}4#@R-S$TS!m!?N;db&Dtp3o;~k6RbsT(aou@u|Q2xNZEi?EB%Z zC!x2H6frpp8Z2B8ln4Zgf875cFE77}u*75K{2YrMPE3IfARaMgNm4kfeI-Up<0POI%&@BaUV6V9T}6 zRnA9IKduwc{L;Q%yh0u?3MW0A`FC33uaovc6ZVGUPZSbUCb9h_@->+^GnI^(7;byl zV&p7B67>h;tR*$RHdX5v?RM8J+$lU?Cw$Lck+caCo|0?aH`i2YEy`=0pFBNgIK=?f38Mi&4RI)0n4}cEqGs5#_ML)2eFp=zqadjkSKsvFEMywW z@$0AB90F4odwi_K!zcvFr^f$6(<#GJib1##iOg{G~*Ju6dOt2auYmoTO|AGvfdb>ScM0PO1 z=(FEAJ&YW`%8;6Oa<$!2?|8U_R_+O-9e!SjFgEP^eC@Wkkk*3CN$?RiiY%?8($LuY z_m)lGcVDLh-i{}(s!#0=qgWY^xM)Wf9i$WD>2wxf_Ft1x3_lvIi zXIHz^2P*&)>%1_HckLG3OsKI~|kv4gpU zwapI5H_>-Cg&|e{7Ns8#0YAL1RyH;=7qAW+@IWsrGw6u-Ns8$jaaZQ%<{dRwukB40 zlycO@n#D~`-j=#=hpyVAMP&t*RvSY|f+m_SMnwm5|>z>CBtY{2XejHj(qP z7}5np9ii3zltG!i*=npUt+YEQjCy6rocl|f4jKVFFSS(kgNNEP9I%j-RQ-V|%fv(ZF)F=W!YK0hwfhT@DY zO+yXEs^g(^4G*!1Qt5{X!3~^ASI?-CR+rax+Yy2#EK>I@ANQH`H{Jj^W!zdjZJ?k!Dk+$LwpHwkuoIt9f17rwrWMe}+pl6-d*g1Pc>J zGZ|^1#`Lk*l@3ULKHk^ag&9#^Votgo*Ys$lW5VeXDq(aXXA4|YoWp+>i5%K!?b)Ab z>Em>>pebCtc;%H>?_hB*$X^-}A>Fg}j1beI>e03JnsS=WNW*aVobKIiqF&ulI>T!c z#cTM>{Njt+*8|VfW=^y8?zfaCgq&3ExGNm|C^a>O&AV4eeRng;vFFcJuU~+UH&`%g7~Nx4|97WEN-;@{Bx7K zg!I-|`X99&1>@VZhtq(p%11_e25^=3b*yCnTYSs3zE?|;^H3vvME-d|74f#=Aw7op zv#nR_9Ulmna5o>gA-(&Cur*y%|TzqlX*;jf>BF^nXY z29U&*gvBw$#RorE{m^&a&}s@;l38rWtm0KY4N*0+|Aawb>NiqMTrWy|9v8>|$V;LV zluEqT?bGe@9((L|HL;OK)zAHGY?94;%N`YH=hk`PU2s`mUW1-zHq!`1FR%C*n>4pd z(pwV_78$i{U>P*3pVDuwcZ=Wt`^%+2bTyAUJt+yx9VnrEgN|8$vuMdIM|rjpOe;ou zZL>iEFK!&yW`0bbmwtLp=DE12`q7zWw{xst2l6m$thimExfIE>QyIxNoz`E`_)^!< zuxHnL3lRYJ_F6(JAF{XyeJ`U13aM7m=VW{`*Kp3Og&Lb1M?C2XbIdI*0Dv*tiUAzJ zZ`B`2Y#a&d8j`Z;;!0GW8Mc963#ikx9#1!})aycf#jabW0kW*etP~`Lf+K z=I7Ry=GKa{8;2AY{iTOlIeou5})S<^39Z$DF0&@(@elE>B! z#{?$FZLXtoX?BQF9(je%o?j+F0?F1^`rXRRiW2ie1EwI`uU~b&-VQdXFF# zvwGx|NM4@ZChs1i+U+}fYy{|Z~F!%lg15qk6YZmwjBNof{U~C?YJn!l@%_}q9&|H(`UM8s-U4g42Pr4tgU%5uh9u( zOXhLFCjq^>|0#PuwI>sOqe^gbjcc zstyJC(Gc!mSXUxTW?Elr93}*je=oz3UcpN$pW~MjE@w)l2oYO|Ugv(U85G5#m)EW! z0RWa!6&R)z_Fw=~&u6Pi8O$1=`4^Uk7G^y-;iL=7*<2ejnM{l8>y;&Oxn9q3+!-)a z)bP1Hltm%~^7nc>Cg~>RIv}M@-tZY7Ps$t{iWSqYj#cDqPTF6kcr->+<}eq$njq z*rRydgU|5N0RUb56)ypzSS%PivCUQj=ly;qU=#>?8MPlnnjAT$qPke7=sWiP-V*24 zMkFR`MtwrQT*}=&2#JL?2>?E`d;RPMLHN-NO2WV#H98cfnv&YkYaso86Ms=zmHc@E zPSE4V+PtmgrL{g{>@|RszRH@WY&tN7e&M@%;xRpyiN=CZ&7DkE;R>D=nck0YNW*_hx5%8-5}K)L0`BQssDRa{^4ik2{iZ{owRA`C5*$1nGmFw#dwUy07QBq~mlOJp zvQL)_09Ok?UiR0`ELQg zwJa)Go_6!gYj4+*wOr5U4^1E{PEJ-$O-E#6=3rrGFE1~4Y}5IcsM}v|qc`gU3oq{^DADn|>hBH`-m;dDC}z*45L>^px5I_h2v!i-)SOs=R7Fd{6XZ$|NodM79(O=cDzy zEpGIhqGUx;Q&sWNCVc4AXE|{+!dTNff!gO8Nt|#oWo6~pmvKCcayB(j&*gL(#t`DL z_VjPD!6#wiuv9V*{BX!A{ zCt!f%lbt_CM7O(w0|G!d>7D0}h!nlXfPBarrhN=Vw+?OMOLi=x@qk<@N3=BB}NvK&KqaGOz zUP`96G&Ss?9{q)NbPM9<>%%Afg&fQDAt#v%30U#c8z$UB%DG`;Gn>g3evv_XY{Lus zS3%N@5zc=X{h#Ik&&=j}2&KRwsODxh<>6+nF9cR5CQ+MjhBrC9hWntTl}$;@1K45j zU)r&6XysK^nD(!dIXH=RnIG<&n#dsgD-M2L0=nG>8Tsgkq}d7c^u!ya3(iq zw^g`cGJuaVire*QW-r)Bqi=iep~}+BQ~}ruh5R5o98C~@=#^>qV=OPnH5z|+Wo}J^ zl!l9E4Y3(J%-AOr?<4l+;b!Ie&Exzs3-q|0wIiUVD~crhRH>}|;4=LI0CMw1wrXv}weeVAe?qAp*qYA`*dsqIt!$Qz z4=jWU5#tLuc$__WV`8c%mP`r$bsRW$-M3B8s#;taMX&8(6kohstA0OUR`dja&%@(Q zpop|Jg)HJ`8mCa6N2^1C9$w_ITg#tdJqJmkz)Pl?3;oh>MNc_6|J7Xtv&tew-Qqec@NM%C%`cR1HQd;1nq zdoFwMoo{1lTfpg$(!9K(e~OB#6m#0}9gp9W<7}<1LcrYI`P%3G65G_$BHI?9q3)-O z2>xTK0;RK4yrEcv(ZieU!eSy=!QNdvR4BOAE8a=Z{Fs=pT_LF6te20noaBccoUZSC zsvq2}eEh@U;>GDn+E#3LdUpCiIkj%5>lLt-DGHsDmW~WQugK-I_X;{cisS9F&)b#6xc&6&`NJfpf}m z5HlE_G4HHXrtMVG5|bWjSoSvtdfiW6bW~L9w(6g8@$i}(8!0IT1Uz1?9{1m+$P)?$ zH7g$$du0ItZP9MsPCJ)Bd+ZvhTp|JB$S!y&{CJ0j1H|34TuC@p26o*SBW*uT-GTEz z(cL&DH8q|mJ2sXXByg^Y?mAmzxqjjZrjenzg!^hxpJ#wkk@3sFM`d0ft(RwK`z%gL zkVElu;>b~8f$ULFL4_dbYtFLfb1nn!F?R>2-7{0d?ja#)@Zbp$ z2=4BI;IM-`1b26Lc3>kxH_n;7cJ7~Bx4v6noge3%>ZzWYsy%ypR`=@ewfb34Pf)P4 zN4bKZm{`j)C7cRRMoRR9EFlNuQ&Zu+HuO$H1V628&(2xR&;De&i0Y94sutg z>-Rnw8PhuIo>nzNj5Hi0=TK%A7NJLo7aMUo%Gzyxql&ydD+j}r_s@-C4T0Ud&tlI^ z-+)ID%giAQ63`B~_MH1t@)lG~uFDlCpLS|5}AO!VQKwkvf;;4o|H z^OQ=URFeYRoKOC~Qw7d(9TEMS2At=*l}mwNe-7oQTPuSN3^AJB?<%t@k``a$dO7MF zU>Mf9XsDuF-3+OsqpLFXh0w|gnnpL@Xk8=2z+{c-;|R`=jC>gRiQVQlAN6xV%p&v| zjF%TYbw-ehJbHkUabfOD-`G@_+mYS#;4)mXzQjarbBC)}j;4|$S$DvFA0r(j{V>I~ z6qV#3>A~|8U`dGj?li252$+V4b8s*t!k|@gNo(-h+&p*Yhbb-PRaJH8HV`^`wh|akMA75Q7I|nSx%-r1MJ{ms03#UVs{?USKTS;xXrW7sA zOIzF9i+2e)mYiaK$v3|&4jy{&$`g%&$3%S|pTkh$vnPCMI@={Lb(;f_+C$yANi^jJd8dX2@|MA`1qx-RQ$CB49>9_+9H|gz{&*x zgp6$V20AulIbkusbYjAs#HRzTv8K?!twpkz&tVdi!vpwIl5{*OS(#Xn;JPX~Z^uya z9$5Lr-tP-LabkiuF*?f#5ZO}sIH?*-!=rW1pE)-fAL9J_zWumU_Zk2GBi!?69>`r+ zv4xib(3~>q|?g<{sZJHlw$^!lRE6Sqz|wNbaXD(TFUI46@HxDvjH|3FldNRismBm7jwjJ#IB6B{lk8)Q;jiRDP_?&R0 z#HlR`fnZ?9#xUZ?rSdhR5Q*eWo3Wi)rg|2BY3?}3AX|AO##dLh zmerHcbj%|T$z^{I9*Wmw*CN1ZQ*)mT)b#Grt}`=>Fo1{}oYWc+vZkAUf)c4p+~7I!#;ePflZ}fQ8gvvx&yIl60eu0;xar}sHSHzSN|VUSOpi_P*~k0)F7Unq zJ^e0gAORCAtIo6?cr?r6b-@X^qZ)c_h$EPyKnH*+o}K$GFE6TVPP2!mQa;f0va$*s z46)M~Eij!%QO>#ck$)v?p7=;cFdIy#eO`;nJ+L4{sk1#e$F zt>K`+2zqS!ddbdC(LZJgR4R>sV8+P{gr>v7kO_J09n=w#k`9wEKk_&p4%p3~WQvp0 z;~;C)PPcL7(8u&M(pg*Ys+|!*wx_L(;0|k$mX;R*peYdAX5mwhg%rHOw+xIjoT(D7 z%gM8Nr9;stSA_UU7i%U}&SB^Ge(fgs3rj=5!m^nTzSz+_IeFgj#rE$NpCaxl#Fe51 z@x$;DH6IK#G|2sUDg&PUD<| zG4Oqoqlv>)L@|+$0%k8DKr=0-GDET@XHDejaISqnx!JBS-NMBU4#CK-gTQ_QYO?nQ zU!}4|PDojFWSQ_3M^#ITV>RM_20d=PM@mw%<~CT>tMSIhV0(Xtt{d=?&~{?2CWmt3zW+(llGYZckt%DB}!3f|L9O_;$B9POp#ALICp#h4&Am z47cTOtLU&aYZwu zl*t*Yq-$asDy(d=01ZQ3X4;cse*TPv6r*2-#c;~klmscmWtEkq10NRU@1=tfj?C0Z=po~%xyO)`+WVK4&bHI=P!_*4@@G-qt=lWgn)WqT#@jAamIi;)6@5|p!0OoSV6 z8X6lL1x3OIbx8NyBnttG>K z8O;G#C*-6HKM?r8$4T-}efamt{{N`R2jYUZrYgg_Ggg^6I>ib@W&)H`FQ%RIgjuE5 zTcP}XpX2p5zgumdwd;<(m9)88)|4&$KU)AZIu&~@ST7|7Lroq1WqPSRVVfkshP>XL~B({dn=F zZJo<$1{0lRkMT`328X{4D-GIYRvqe-SWVwJyK=%ugh8(!NS0(`#zQhnXu#(KcQb@#lJyW3rIidp+BS)?Y- zfWd0>yICK~LtGTQu^d*x=riAJx~rwfKY?MzM>?6&<{byxt8$f2DW6GebusA05ShYn{$ES1E1{a{0*7T}LVK z`1A2_g>hbDmjkJ3=~YTB*82S;pKvq^GCmFqowh=8?AJmmnqV8Z+x#X=iWo*blxU?M z^3^uSm?A2P7}lhM_>JJkg;Z(g!ErHH!~E$0J}wy~MX|(c363$FYP2$WWa?6lqt!=A zsR1adX(baY`SgD1Z2Hs|<67gH2}O*&M7UjygvVi0#4JTj!_k-oaYzZMjS4%W%ilnZ zkG`qexN7IT&hzrxcNlvfO|8tkUGoRH!4rz|IdIsW@66YLsNoyEY^N+ z>oF+C-`P#?uGPD3qt;JOD9Iidm!q1t4omK8+O#z z>|w$QH{YeNdDpZa?#I0#Hwj`wL{Lw}8$7p`E{&7Au>zu4bTH7SBtOE%!r;7ouAqSs z@8KJ0y(n5jN6$RC?=ngpdGKO2tSDPWNhMa1o+K+R9iHa?SxkaT!8KmSfAZ}GakVh$~^fMoU-_Lq+b%Wk7T$pNJ*WG#G~wK_D-{I zh1|JcP@CqH7vUmzb6r^PAi=LBr%vyB_=wtZ8YAStn>^0lHZEh+n=$bPt|!#hKn`Y# zKL-l?M9n>_-)u;JY!3o#6Y+rQC&q5BhoE&PCFQIBUV@!r!{y@%?7syuiKzK1cgW@Q zE2itiy_8@qkmoz^HpKDcvr7DNgvIG#InZiEDI8v6DSJvN(#z|G&2Bj26n_Ae*l5!{4u2SEvwqBX)(^P zo6c3vf8LE6FINqk>gI>rgF^zcNC)<(BTn#r%;Gg$`rAZmtm@N?%?+p1Z6R z(+}HqAv*=Zm=cdQy|(#ITTAOkP8sZTdUmA&zuNTNa1%%&_Pin1(jpCJuIBpm2}-6N z_oXsywrzfl9}Y9DQz!V6V7rY=g3pk4v4?0A<(XpYIbs?qA&L^2a%Lw?jFgmMqnwVrUjkpT;3PdvJg&iQTzVdQeooNU>bn!t;p)7O zy$v(ew(wZ`^|L|<`Rg)1gJk#S6^krLM{r`?m7!k+6VG8n_S6EcEC$w!FdJ4{;8+`Jo8&=|3}}{-bvmPig+F_$>1TrzhC1s9>!iO>B2ss zfe#Iwa5TAlDw9`SDVqO| z$AP?pLnL+Z#Tb#*2o^)|L|^I}xneAVyQ_{#p=TeFRkXhp5~xh?yjhX(N;Ln%a{OE{ zOKfG`G;&z$9SDwWpGvo&tmz!h< zfpiN0p9gObRn+YRxS|em(bH*tWz{&x2hR^GKeTr)SMtp5HNhQm%8_d*%%7pml$JDsL>+gXM`@ZhGUn;KwIM;(=#0Gy}{? zIF4VQql9lr_O$4f)fraQ)sJ7bxt}gn&ej)~0b!b##dVdAWy^JSj&^o>l9S;L5s1%S z5{Qmti3TJ`RJm(7gC!L|KmYpmv0Y+~=P7_80enqC8Ss?$`rpJY_n&NRF9L(RI~xPI z00Vo8FmzkOfyHT_&@6#Yada`H*Af8{QIl3%Pj7vJsYtFZ_RFsgSyb@h?H0uQ)Wr5! zHms%$mE7qenuc=rpRKc=a3Uj- z9{TliG-;KSl2J7EzFiV1uK~-iUW%dZPd5f|VbR;PACPT7m;Uso;G2(%%obkDwos3H zRa12{cVn*@^(FnMEf?B3@j=o2!L6Xe_t%KZ9)Dz*2GupT+GB*31}$mn5H=s^gU{ep zQc2m=qtCsY4bxlcCEJ5ELIF3jn4H8N?twbFSBd~mFv@cO+jfVE+BnN7GnFDY2mPt! zSMx!P~s1S{wUpYL(n{F@%|Vr1^r9hmiV(+%}pI{_D<->%_UpE6n%$M^h|Rk~3%PfcUaX*z4T@YMb~$&UOct!(*>lj4MVIMn5whqfTH6crO~GS;fDDMC;F9|Ss;E0}9 z&mP)>yLDPlClGW)lKPpCsnyTWnB7bp|tfX5AgvD4dzY&Qx`Daf|A zH+B|gia-8MzUVzfj-wd=DD4Y9S#3USuE@#XzCJ}B8+%YM$frMxgNmhb#~1OB|}5r{Bl6w0wv=mLL=m`hI$@^VtKnCD_?H4 zC?{9W*wk`xj7g9$N_ZYeCZvIjJzs)3jc0A$2XS%Kt+PGd-NV9BByN?PV;aE48dVZx zHU z0xG9fM5mq=zjB5}F79GKe+*i*PtI94|18zyw~R2%CIu%MQfnNOl9k1CzB^c?PSNg9 z3*G8HtO0Wv@n2nvUqP55E}6!atw}~)3>I`z9#3;3!dZ_iH)Xh9VQd7hU5#)g=);0( z_#{J;NWFdUp~qFm`kRM`!B{BB7`_Ko4_7%C*NTc`l^l9J)%F{C+ZTy9obr+3P3hUP zqwYjS&mL&ELK;M6RJpA^_TY!jre{CPF!3@>aW791y;xLPS*yI1>KD;TmcYW%nR$GVj>s&jgoiEw8EQ&CbkAHZt?W= zpKM#U8e>gQi#$gOU=^$HM5FAXU!tcK11C!PlG(9r{a#i9Axschp3^%YOeMQsxwg*X z0Iuli7ieXE!KfU64NTs+1^fx+%khggyStor@hQ|Lwl{vPHThYs3~Um0^;o{MXCv%)P8jTY%^l+0 z{ke;!W>KXr=$qr-jxs3;xRsloLD=O9H9h4W zww*#U4dm=!->Y`YADb8yv!!HLElb?h;*=ERxL*Ib_08_oc@n5c0N7AkQMTT^YlUWE z=I{Q)oa^@HmX~)x8#x6_m_}2gisA=rGW`K)0d~% z4dz;|1H*@g(mhkyEo%&bP6ITavkM0EICc7{miq96{8*||6TRX{R%47=aPbl~^EqVo z^$D;jdNxCJl8}M10G1|DUX?;mW2B*`VH*u~x_Aa0U2mF5#LE^bm(NEU^+_X-Awkjb z?K0;a3JYwP5bWxzk_$?)&|eL^{n=E0&r(lq9d`<7Wnh?9NhJ~$?P9$R43jacrbwKT zNaVzw7X6rcI@(Fgkg&g9TLBT*Z$A!_FdF-zH~-*pjuB4>Jrw)7@gqHv+fk)Up~?6L z

m!HKFd{!=I)yQ))7|CF^>A9wBpy0~uP&(Ue%JJq1M&vSEL?nA@|}qlD2G!|kvEZ5Y+M@l6%6dJ6 z^!(FBSh=^|*cGgNiN-ogREUs}P|0jMzjnC<28O*%JV`~RL*E%Ia(Cvf&{b}S1vjyW zhX?eyq$JE#hhe$Qbv6O_ajrlUwC zo3YWleZ>%&b;$jDgFbOdyuN~u&gSX{$8NYP{1T$OCesYfkse~jXNZYDJ{dUP@>Gzn zOG=|kWO4T|iB10=HBfw6|CYzb4b7r{yvX=@DuBmDgzj8MFxcjet8i`iIE(U;J2a@t3wOog#lMnrO?4EY7Woa zzoPvuJJJ1%2YI59IQ3jw92MB83I^%CVeG3N5$%6Rm&L!`591v?0~6W!VM}(5bm_P76lK+9Dy7T={{#A{ Beq{gv literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/review_comment-light.png b/testdata/snapshots/darwin/review_comment-light.png new file mode 100644 index 0000000000000000000000000000000000000000..67db2b53e740b737356068ef88201235bb0077b8 GIT binary patch literal 26334 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/stash_list-light.png b/testdata/snapshots/darwin/stash_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb21d644734c4967450f91b55a99b1307f5a79f GIT binary patch literal 13563 zcmd_Rb!^;l`{g^KCTXZ)P8v?b%+N4X!_3UgnKamN!_3Ug)G#wMb3+aD`n`Lvbfvvo zUF{#MpR{9Z#+Jro&y4+j&N-jQVT$q+NT2aOgFql8DM`^EAP}TKup9{o2|OGBi=hO8 z*m|Wzg;YE;{%&+zDH{?D?KBtOO9skeN)P7|zCz`xe=P~r3y4Q<({RshFm|2YXgkh{ zPtFm6vCk<~MjL4BSNklrEjc;jAiA@`gOescd*cI^@o@!T(PgJ@PBHe3kB<+wpFBeS z0excfhd?v{LE-$DT2%P_hxK}>o8jEG-Mc-oLmxxThn1C;_N1t&D28IFycmo2X5rC| z3*`Rbb|!;;C{Nc9%gS2MQZ4D7NxT+i2to9We*5)uF1hQrkkR)KUj0`@&6+BLSYlQHJv*;p;x!!GF1lid^CtI5@e*1Ipeb0-PXcDEY}onf4+J1U=YTRngLVs-bNpE&ffvF!+2 zKX=)z=zLBrx;D(7P^EECzEsB!LJt1Fr!h1hosX;Qo9E&$y+)O8Z--Hje7lW!6Pa!= zJEQS)GUmc?Tiv$Z8osMmY>awc7#|}uFdo*%H`ev8mpx8C%jVVkRkpS^daZ8k0+B}D zE4(Nr)Kv`8-7C6og?$V%iKLyseqfx4(cuVv|04AlDeqUwGNy`+sF2ckV=1=m!B3y) zsA+j}7|JZr+pkQd_I(>bY*bFS~eIFKZWcG?g_K3+!wI zxV=hB^U}!aMA0w@2}){DBHLjV7CPuSQqN~sevg@PsxO3(NkKtdy8Fjbaic_MkkF3A z=r{f%Ck<-6(6`~h7y80SwDqJ#%aJbk^~)FN6V+T_sL-MO6=yoE@;%)IIN`58VS)$V zWep8olFFiwDg)Mx| zS9*`c%X-P9&iX+LY4``&7##1#2m(LH)$r6H_4p*m+7nH>y=vnehmOA;c^O@4B=N+oPiN8Z%wb^cq`>nfv zd2?v#XTY<#ims;T{eEfMsnz&(tBTqWJXAC-O}%&SOS)^i!z^a4{;eQeCidp#PiKRzW< z;(HEU%DTEtL$JT3tj8j|b}$+~J0k{rbfmcUOnNWU;GVH+S#So%6l6p;X$my&F=}Zu zR#wsFSB77J{#fMdt`MAdct>RgPDEv*I%@Y}WgtO;;1J2AtV@P1%A4lrjo*-|oe}1? z`EzY;U4(iJLH?mq)L!v%M4D?FkRZKoKV?-_TRXdO)yvuY9C|ISG$f>`ZzH8WJ-Os) zmWwtD6<6h!Aww<*GORE#p5qWOFzo$t!~#C{CS1r5o>WSv6os+5xu3(sZ@~9{TO5}p zL@^J??@-t=xJ~F(9bQj$&KEDhdOG~Qh?tj)-WU{>KGB`lPQ;VfuzhXvMt_*T_47+G zsG>BV-+CvYds1KHsvi6BEEhdiqR4x4etu?<;O*Dux|6ZF=*}CPlo+?nWp)FV1_;FP z2(7k{4FT#UJR}1h^RC=5YbInkQr$Kut$N96D{F6g_F{zn^xFO)C*pe|KjjeFm3r$S-uiyR?`hFYf^Eg#GaF`mcDyElG(+8fv%Tu6RbvsbXK>viYZDm zy${;*5pmAVZ44DZz#lTLcor4ERBFRdA?V@YwJFPo0&O3R z|r+sOLjNLvwciXL4Wy1<4VK zA4()?X67a$5}28ZbZ<%M6&LIIcvV|bQ7kDtCy?Q}Q#>97A_nRj z*tS|MqjGY-g0?+-B64#0pPpb$>I%}^%afOSb2CN0`*KSAU2Ti`L3BpxJ-)VXmMEF2 zC1J~F=QcK_X=}?lyF-Bzk`r|ww^Hlk(4;;O4D{)$>vtEndTvGQrUx{c78GJ03YyoY z1V6#7l1cEiw*Dw6sEG~@>5}nDMh_Dm=Z6;lVlo$f-YE~e7KR@3yUVw-q()H*R~L%m z8-tpv`p~+*vOXy^66mY)um_)>u8fSXOnGfB^NpkU;a=q6pm-N-%uxI{lM1_!Q7&+0 zYuzI4;gX|s(a>eM32O?-AKp4icB2gvw2jra!cX^Sny^#aDW&2#k=K>5f*;wo((CuOHrWY z$?Wp$1S`#yH`~uNblx@~LiH*2_V&It{H5dwopYz)Vlo(dx>1ss7o@wno}3tY(5lNI zb}B6`jf(1gK9n1=0_)4sM+F+j9von5KG%ti@tpM(lBdJUwyPHkInVfT{AtF%P(gD=yBpJ*2Yj@>t;no2GoihRfB^qoy?OQbM9=~PG?jH= zA~2%2(=4l?z{&E@Lb%so2I_-vOtaaoJ}XOpdok+YzqDh_ zS;tfT-k!a^2Js(aU_5TX2pu}#`WTxpRTdUO-o$-G&wby^Yo1}9BaUIi>0CC~^pl^= zrc&^lOlRG2KFoYfUr1C1`5)IGeN!pBY-?QgYBTqH$sF2qZ0!hX<6(%Au+JBiQc$0p z);O+jD9ht}dWWi5dccesYA3*aYihV1n{JNpSw7^=5HXDSqB!;Eh9MhM*LeqxPv}|HH5>9n^MVX-E;bK^3+=0T>9xX4qn<`9^#Ov16>h7wX@UYcl2}+~mX_51 zK-s~?i{@a$ppkJ|8VvbHFZk zY4UqZIz6?bNo=z_FI!!0(>q$L)OJ61dA>#uEi9P6%=RCW5GNY={Ik9N3@DZ7>3=L& zQS2@ltgMcOK}z4he*OAO-W(A>WK+e!f{TaT1ts9CaxstWo8j|7N%yTpZuuP~WRUR? z84OG)H!p8AbJO_fcotI+@>zRmfoZ{17O$y|&9AS&GBX=bxYowUZA?uI{bIxxY0;?UOVyo3Jb$YWT9}96j=Zz-l2{0FbW?hexR)$F{fE4~n-l(D zrx|s)0F|Ulb>c?}|EXcQG;)CSfq(5UJ8{GwIsFbp3I;y-@;D+oJ=>lf14A{5mFa*v( z7|>cH2rNmF$Ayigymmk~K!B{Q$^y>&*dc%Bl$YynP5ZkpYR}Hjr=_hLOMty^iW*8w z;Xy>1^2Em)DYBHnXb}H9B`a%2;8+L>(bMzk@UTdHFhslgqQmtiIx#Uge-8uB0B&0d zL`O=x>Zmk`9@5BYn3FG_2NIM_$cpo#z3@^M3kIR`n|tyx1h@<^Qjk;dPAapch7H^c zNCI+BfQSecH=G3rboF$co)|k*%kyIC+J*9FZT5#$rS9dYf79S$aWZ<94Kl8w6*Z;I zz-OTcIzU1##mMViML#80R9x*F>A3wpe>lxehnEUZ=AV$@B=4^?vOC=L$+3-LL1g^? zm6rDS&ESQG0=*oe|G>0`;G)+VR?M^jPntHRfrGiV%8vG5L<5zU;({vEkiVIo;iy?X zIy&+G;r{tDDjcY$scyN2nTeZQRY%8WU$WD06%a*@4nbv~kwXEAqNYmtvz1rWUf+*0 zwoRUdG*)tGvEb?U91ef`(z5C+72xYx!J4atzA;v$-D?Ge6KRR*oO z`})2uu+K+EA4%bdw*n&Xe7-A|Io&Iqn`(hDC%EQ#w3R!%3*zSAs!bTR7 z8WxhvrOHE*kw~>!IXRo^h&*q9N0h5r`3E(%rq@;>mn!;%bF#iUGPdAF69(EMYaDsA_qLZK#$J1@$55ZDtltNc8}3|}V?{Et|3QFr31J8( zA8>>gUexE5;8y5Iz2f4_lFEl7Lh0FA#YaQf<4WxCdV+b3ZG{0#)XASFF%70 zK@I*!2qo+CE{bv7@wI`&iVS9 z!;TdN z#Mj;X@aTVSY-b)xLi;MKs*>XJYF2D`GA|AfcP}oq)YUKfY{gw%=%AUPuOvVz14h># zeBUf-AY!_`Z?F!DjIMEgxNbq9ZPuA){THJg3K^yTHSDqB9|?Zp-Nv8@DanSWhQWb; z8fqG&F66|-1YkA1^9)zRm@kvTem(i!oK8w*`SeILkA=|E4;pR8ZlI&xkgD1i37^yb zc|S@9Q{2*eC7n2{P4T-!N>Zn%uH%XU|JMzcv|1!hLRWETYr9t{U07>)m{ep&vtEpm z)85_DS5hf4&Agf~N|Mu_OKHnd-qp4U=y4d?zD6iXbQ2|v->S#GOKmD**nLCk=q6&` zy?O^0!UQ|MprSIfut+LQrEp%75zkUmh%vLXuQc9Z_Zaq(lT-8}i~fp;NKKFF8x>Uj zp>kX8u=hOiO__3FXiHwkn{U$PFYl^Bll2kfzyQTiw1ffjJV9oWsMuShN!U~hvv^^l zDO}Z!{al|Ud0tA2g_YH_hj)8jUEPJD73j}hOZqd}-8j9hu~F6gjlxBpz{l&w`uqt3ytb%zsY!0WqW|z_QAeM4Drj`^IiJG#a2amrL&96%|9(J z^9u!FShZkF8-+8iK*gAcl@wK(ciRox+lhrk=3E?i`Qvqt&1_P$>y8sEsnhDn-}Imv z^tEO1*?m2AWqz8P;oFKrPw~p)Hh(9_J1r2?{)Ym)J{l9{`tABwq?U) z+Q!HECe-X^U-{BNwLYdZ*ZM`gH{?%;TMZ9kVI#Nu`s+R0Tk%t`$&9s!IaKJCCSRF9 zN$1L7heE~SxeP*u_xJ9}&o@U?0$>szF0KUGq+9*HrBus>PFVlj^@0BCdXJF+z*st) zG4}2`Mqo`$4G#d3+ulrJaRPH8)bQ-4{$+!$etVL~YS1mfEVYho7(eb<6VaA=Sr}#L> z_&8Tt${t>1LXb8`Y7z|Y*?6BZBx&v&OULE3f_J+FI&+ zm(XTa-s+OA9Xcn$Wvqiu$v57r*0%hi14I_3kNV_T5d$VHTb^WdL%4xG7S`6l5clZM zVc|g3sAoM6c=HTiVs`H)D#1?AOU4(4Y=PwWM-svIvSh#<+S(GP(yer&^Xu*r@I_E7pYG{wY!~OE$ruU~B z5h`?XQK_A!_1fi^r#bz;X5z`02bBg1L+`Cw#7F(I3z_Z@EBFS4HGHGk)!_5a z>gP;n+HbV{UI|Wj(iyq2LL=$3K=36Xu=zHdEJ%Dlo_t{)h|yUb77=mhhGf<6X6UUO zFfzsT$;Nu#h-*e~?-rIJ*L)N?5^=AhYqTVD1n-*-vC9M;D|2 zoW>zc_V*WUR&Ez?Un$J~L?Iy+M-$~YHW@|xk(1N$ZLP`Z2tzvmU;FVrYIEn^+39=% zfyyEy&->w1ynm@azKWT8wtgf{NYjjh{5h*5MBFcEeBOoC!Q^TOFECevD+&>M7z~dq z_|CWa@!dpkR4=8$QS670!d6ukrF7IknmKw1_~%uW0zah zyWy6QfO7VwCIiXLho%4Rsne5&!5Lma3>ekc067pGoI$!sMNm-x^Yb$VO3&kBN`aPXZk)mIek z(~O9Bmp@!hRZr46PqoqzKjl{ysVPg~)1FkWo}MNhVktS+hO~L9BDs!7;U$kvcs{F` z?@L1N$mqlis@TiO%qjmUZfz%l3wR3o{$NMduNV14kpLO=s}lzXgroJz+|;CiU%INQ z3=2(s>W%mMS_9sSvsyQz)ghKfj=h$NlZj(+eM=V&D`repNtGSPm~S{Hyo@GhY(UG$ z|5%P*9qJyCUd}!#qs|DI!5=@*T}$~M#2yP;mHdPZ_rPu2=)*RJh7{WafejtnQupQ9 zw7Bk(SvV7wOOPmkr_*nrFX<|bEX7rkWxj-GW27E|OO-(}u-Jyt_mYSM|MoU>--YP$Z?4 zY9>h3O!gr-(xc9iI-?1=?Kn3FJt9dCJs5!@bE_R351voNRBd-ZXJ=t~^wEdJm@h8h zcV$i$-U)r6v%5B! z)9YLU}wR0W=AVBcL969CzT_<=p%K!q@vW>10s}Bu= zb5Dr@FV(m75$|!eA765Yfhoq@{WNMUk$8j^ zKK3Iq@{XI1LrQemjhhGa0-7me5_;nutkO-_q`^05l62!|J=OJL`vrO^k9G5=J1ROF zkWMHTmD=sC4Gn+6#R^~Gf{vyTlHWUw-a;1QDdike{_>em#ynh50rAWH^n8jSxGAu& z{~l}mbm8o1N(>XLi;aclO7opnu(#Fxp=)rE67*-I{ejb7^I_N1P*wGA)3-e?UKy$h zn*QdR$LqGaXs`$d;V>mV{nMulkDDS<85w8&VLO0Tfc}gni|vF)zrMLYU+sJbf|{%> zRuJg5$&c1In((c%uFh&4Cx62`fSkOaYFUAvvHDk=#|hx_mB9qcKYoaU=|Nf89gj~( zm{bacs%mOREUEI*7g<>s2v~Vrr_qExw;az^8*52)*Vp%Y;qW2 zmU8g@-LEf{)_|VJ<>_BzNdy=ZqhoquE{lK6d6)cU(%$1b?x{QTQAAn!?J73#Xi6gU zeQPB=d=!;Tg~LXN)hrTq5n^6l(aUL6ADe*%C$jR4gYH^WO-<_`U$w#HZtxHpY3b}N zAi7cz#Wk)rrIf);IL5O1Gc=oBgt@uz3T9ZLW8ChiG2^#GEKW{y>lGMw)bf2PCSaGzOKXJ8L_f)VSUvqtsP%bl)#(0 z>~Vn>Q?(Jd9vqkVqjoane~jk8Tk|^hewl5q#>B*;p`pz`3mh0IJ3W1ye`FAu27y?D zBZu}D8XM*t8}RV)S&7X}1STy2{p)?@!IvsLczRzQd9##8Yu#z&N62aJ^;#v#5eN@T zsWBUwucQTm>~hmL`XCWEX4r+1<1ss(imL(}hjJ@br}X*5+5{v~K>nivdC#+-o2Ms8 zf5g2yxb&?_OHtgS;Wiq1Kd;alvHWOw7Js*CXQSohJuK=yuBz=Vu|$_OYxlqZVDp9A z>65TN8r)*^dySlVW&VlGcp1F1GUfO21_t@(oVS;%l)|GA=70Q@mJSRQ84wi%&U{8X z^5br=zWU-15Qs=XRQ)%*6pmUNEl_@vm)21jcrC#z~x4tvI}wzg*^{I|?Z z!l~@`$2EJf&u;Rx?!zTTrEa}cI8CGDoYv>yj&<{exqCrrgFn$XNBJ2Uej0~+nd$MD zjV7MeCF(}IZ+B-+!=s}%s|{+Rq9zBUt}(=dC$9s@5=74K?su;H?T6FLGZF;E z&zZqvt`k*55>;_=6%`DSqRwsj*a5?hKD&<8$$qs&J5>n>2b*X%zo6mheqs6Rs)a2l zgT4?IitR0M<&YtXGu~?^Wyjwfjl=^#lI%l>QNyT)VtP*p6Pus^z z)J$%w^ATM-sobv3&N7N@$$v6VzjQ!O6btza6k+<|ktoEKn5V8fIQ@%!feD;SHZ}ar z73sNbvuZ)4Okxm-nhXO5IurtA0^k4-pLUe(Fi2}<1`@8Inbjgw`}bYFvV|!@qI~Os6UO8Ks!LLIf z(GTg%m>3uaCN{^rEazrEy+L7n$@C&nn2Zs68v?2j&AagnzWVLV7%8o#Wx1#>H8P?w`z=E3njs?8|Jg z5rbbXZEQTY|1iP@w6t*j2XB=eCzh3s7RuEA{E2TqaSshjNloRFb@RKWHk~b~GKru2 z;59d5p#)e1$RMpgzkMyn{G(%--nh6pQBtKYb4d{?u@$e5jqL91veGKOMo0dS0>7tMG4tI-z{4GNv;t06O6)*W zZSgEG4|O?6R!7)K--HX#(zs3>AOFBa@ch_0=(C`Ns+_WjmbkbwekPPoSeJ^n^2Yr9 zvUq;$c*ai=2RlK}PZfH~>e@0zK7Uq`0=_059H5fq3cSC+CX`IcZB>)HwLjvgTz116 z7^9;bqsP0eoRY}7Ja5y0E}=|OGV3LB$2wVD}Fi-3DQs-pIA>vX*i!j zpw{#MuBJBq(sQpm`cm`=^pjXBG~|?(8$|b*@YvZ@vm4xsTzdcw73=FhO3cjTp?G2Q zu13ElMLz|O>|L*}9`70%nK(&oyN86PH#M0J89}jZJ3+BHD0zqLq~~ncObSfU%f57~ zhx>ycJ}3|n>N9!$Jm1Q=sHmo9NB=qw#_#W|P)3-Vaa?5P7GLCt{`@0y>ZZ;AoO!F` zTU~9Ra&anEJO>~x%>4uXZW^L8Mu_&LJEgi`zmDt2D^}C+!V@qe zMrgkI&2dB7m0U`X+f>;9?tjo2n{w9C3^yNuywY|7f0ek14}C9Qxx4C_bX(nOW&_YjQ*~v|t{F2tFe0ttbLw zLjVf!`=tE6xM;J#gwWQe1*l*2M}F#x^N|}LFD36wYEsgtfUm1OT7Y=2(C=>Bh+=qi zGoKxjl2E4wDovRxp}DcOHEq;l2&Ug3+lg1ripa>@oxY)Y_W2T(vcyC&(f(==0>68k zsZG_jsDZ!5@j?lSiBYxze=E$jvh_|bqgzkK zUzlG`@i=QL%sk&hA!g@bqmDVo%V9l64Dbi3YPA)%Qm~(p)UHk2epUXVRMglcAlqSX zW_$N{s}`va8}A>!ZUl1n7@>o_+WIz;~IXykE_Xg0bDH-n0&vRV)~k zlq55&vv}C(>33ZDOA0!&Hr6ub%k5b|*$3xJsk!%(nJ3M$>}#GqlS(30V3DOn+c9r0 zLNeEFneOg4jX|JbrB$FAA+(qQF`G|8S`Pke;Jv@gn8hFmpi*!rDqF8nu0$aK=y7oi z1Ao@p)By+us z=!9#5gya6SRM|W{Tu-;dVPw=v*yokLVnAYaa4@`Yr|Np^5h$qOk4%A$yCFbd-j>Wr zkcm?ZdZqj$C#z=+0j~aPy{LLCl##U5C~r*-6~(KL%b*{6LVDl7Z_gGk>)p)vobU7{ zT!~10{+As}%mdJmQ>MZpyh;qrH$i8Bwk%bLgZZ6E>CdmH{onx=(QLo*bTDOd+;N|GZ?0n;>K{ii72yP+5{&=wm=OCdFdIGB9 zblz_kCYqSn(#{Mh9f1H_#-2iW+G16MyF)tJO=bNwC{8v%pRuvA+2M7^#eR1XQ3YcF z`r|-R2(HVn(rw~v# zUYNc|tOl02xJ#)-mLnqyto6@98jb)5-F(uQ6PH;yt0s%Y!jsaddC~oTyt<605J8cp zgIw%f$IEYmULGa?HTDYuiw8x z4Yom?E>Z?doh&sG)m;6XZ)#?8$)2@$Q(c*R4f?&u!eiB@Y~zK2Sh3N5Z~z&oTVWuB|A_sq#BvTls!o!;t)`6! zv#BS?sSDq%tQ))jp|aA_`$uEVlz~^*fjZw!N(KfFtNG!!Hm~;y`HdG0OiaxNkIeyu z{r&>Y%)#;RHUpK&Z~xCv2S9S) z-#1mVty1~HZyYesRkjr!-kvzWJP@N{VqQP!8yZ^&Z<1lxg3r_By1L3!Ws{<#7iWx7 z=O^1mS5d4MD^eTT8@u1`B^(?|GBW-G;6|B{@cG>c0c(<;j!x^jo;b8GHX&iT)!BM$ zEj6dBW-u*1iv4n!xS^KV-Z*Bn;Oa)YJNjeL$f#!r76K%JOfZjM7}Ew~s&8Vc7ymGB zn6c=ChIs;;3JLWDQcXWWfeaRkkZjrTESGC0Bgd}esiLyiW9#b-ESKI|GQZ9&5aYI( zV@HXj_w&4(75+~FPz0~N9yV<$^#ct6g8oMUgthiExuB&zWmpTVMe`mGB&tBCqrpBvxT9rn#SxelH%es%OYmbi5hl@@hJ+A3dvViS*wgq}y+fWnonFn^n4fcj= zlVNWk1u<`oCRm8q5zxC?CHkKfsL!8I*Hn#t15<(?e}94L`gNtOC%UXF^8TYY26Tn} zSx5w5OS^thK_9%&d5a(v_{r7)Jvrgge^pV020&{ITVBu*ueuN^AJ7s2s-Z3cS38Jo zQT%sQ^XXjo|2$UnS`B^mu~KcU8f-`%-6z-DJW-%{{L-Dgy-nGY@LkB|*VhbwxbWFa z&I1e{@azB1+f%NRK^Z@`T-h0<;#9J^x^TBYn5#|0Wa0{<)R*cIjic)uyFD73vJY=g z9J+O_8w1Y`c$blz0?)TAFSiq(4aeIpqfsggowx_JU1PB&f2bbUp8Qg=*Kn5RVaJL_jFt|Gm z1b26xcmDs~cXvPShyC={?%qDtb#GVKt?qM9Kj(Q)b(p5Q^3x~OPaZsY@bukV1@MCh z4|TEgNWeqv`Hi4#`hy2d-tQFTw7+KTq7CgoSUdw@kuf-(5C?Ug zS(_;&HwVPKpMT+*Glj(K9~DxV3rjzV4u`+VnGsS&s4enHzOHF)7*pE=5Ch(SRco$h z&|ag+L6QXJ%R)1MI|MNmKZr3_p^JQa!IEX=#n-{B;gbiIgiM1pR1v!5wy z&E9x-R!lo}b{ks9uq=m}gZ(LhnIr%;*0DpY_J`>;jYY>OsT=;({&QFp6xg6&Xmg)D zS#tO_0~Fd&#}kRdkUg!PvqIYXp077d5im|7eO4kM5~~vO${#1z>x@POF~fw6Oe5{H zjluhwMpyR$pW~6W7i-d2Dzw&8w+qTy<2;7VR+utHaKA3sbu(P_%XPo2)u{3?`sjUS zM|y)pK#^2id`wnP z!^T1bbC0j~A_phoA>_}?>L|U(2P&Kw~!yvx^wvu0X6;v~kdaGZgB)EVU zP}Mx#kE8GY0M}t&pD#mRE{`9XNT!o)pp3mVo!|^HvRq?dPIj-7>E>_b*{#hWLJryt zpiPzYfwWog(YrbvlTYVr+>a(=s8( zObwP@U`_^V%y*e*=H^md#FS$!h-lV#_tw-K>1`a`L_wR2#`|i0qUjkf#|qmQ4xPc? zU+a&quFOM;rFM6ppAS+eqqyq_+N>ZJHumQA8~>OqLbuYeSms zd{CXP$w*6!MHUGgg@O^Xq(2P}L=an>nE=s-%0^bx&w#1ltFmBzkhR+{Orb31jmI8L zoNpRE@yMimre{gcq$liy)s8kMs><^HO9B3GN_iHGtvLwylyr!0)vlaLSX<0S+zM5L z*VP@{mu^eco0JuCx3{Wx`i6eY+X8IRV9{CSAPv{*I*7f)y8+R7%r79Lp!;b3-(RxK z%pO|rX4-R55_BF#L+%Hy48w~BRaHBiVISb}D6!d@Pg9cz3!dd_r6=D`v&xk+bA=H}>3*H0hWLUfZ`Q}_F>$JJ)+yEMpsVr`~DLu2(zPkSTddhWF zARv>D-??L&0hhI^Ja;!FcQpiNxSIG~b|@;v+j|k|pNJ?cQ_k5ltifS)tE%3Nh)2+p zH#OEY6e96Ec_H2#COb|QfA{yZG+q+A}Xc2t>cZ}}yrPL81cT46FXW2m7XvG@SH z?2wDzSY9MN4g?pi-sgr6>!jLY_(8Xndm`}Pm_g14cXq}jG|7G_JI*w&=zUolyS&DWUP&Tf-yX=0`Jma?fsJBotw&HCoN;UC zwTWU)&X2vw@}9SO<>fum#Iu)~0uJ=FUFHeSc6uHwZT%A^xu{aCd%4H zd@dZuVH3CvhLMFD1NXjIrKeAWboU#TC(+*n1ZepRWH|2ea}@I6|mn zN%!rFX;qLWa{`<7)f<)TdUS8!C-tln^ex+NQ=h*Sw{)-+_mbq3Co@|)%28hE zA5c|M^Q2n79BpQY#ty>WjDBU+S)KNmXBhaac;{!;DQmB~!Qu?j%L#7Tn||8`Ct`J1 zwUf;=OYjXIL-dV&_79j^H}uPKuk5dlcTz4_(PM0b>*)R6xZUpeb8)Fjaq05rPyP~9h$&BX&m)Bmd__H$#=sGXYD1O*faz_TEL5 z>!0PIZPfOwiYGy)cljifj@Pnq%@U($#gOBRquq(UM|}W7JjIi2rVe?w;*+-fUQt&b z)6bzz#V1j7zN1sBR)a?Ky4%N!Z0ayYK+lWtHD|(Z-BWpRczNaL4ZPmh#la*r*DG=3J0h-O z{Evo4=lc_Ol~bzXb8zAtZf<^{O^;e`0{P@{+{6b^V^SD7__YBVy_~GWWl6<5v7w^U zQ&@x$;uB7LL7tY9k+03!A~oON9e!FW;W-iDNgXBZxlTmXiBDaGd35dN0|-|wGhkb| zCD$2v=qnjRCo>}hhHE}gCdCw6bo2)2ubaq+0J9nszS=Y#8q@nBn;eKAN}Y5#OE&3# z={8qcJKoKHoJ-@ZYyaA85Lvaw%H?5yxT=#sbSt@+A}r)PuR^_D^f|4zKSCzW?@!-? zbA9REyB8|y60=xi#tqz7D2<89Fyu;ECo6X|Wsg#6;bh+glIio1N2W4-V2`%63d@sv zT>z!xPo;lF&+606a4sl2JN?c;QMIOKSektEK%T`3_W*2TYun(SF2g_UXy61) zR8a&Nws?F{YhUC#E21;hIM7N2$6V$zGd76Ex||$qV0^U%Dw4=Yqs;lKFbjUhLrWhg zYRK2~#TvZw4Txb%`n+sl*ft|{`})=IQV7%8>v}|9qKY3laA9;ZUws(+xo){FlUSKJ zc(j$jy$dPcH#D*)BkjW%XZzAC1P3F8+|w?%XRoChsw;Wz$ZCr1Ql!9JL9eF>3i7V* zI!r%GfG=vQd36pn_rAW}h5qbWH4Rhn;hJS^ZNH#vi;U;T9mO&Ih%h+f)gfA*kG*7V`QeO!OygMxqL={9fkRNH4iT#l#Je* ztY33pk@tZ0P+CILzn+Iwe2atl+UVN1B2q=pW!eZbGg~EYU?DX*X`)jw&@vReE;HWl(B+SeIpW${y zNi(>nC$MLUvaW`7y1Z(MR8LXQBCA_^dw0922=OZG3_J+AFM3sR7Nv&Wv&cvACF%&X zFJr(k{PzjUncqWpsc2Wz{cQryyE@{UFok?twPlMgAx3lzi|xUt3=U^vwl-%2t-6Jf z^NTwXGNHO^DjKR$YrzJCXp@xqABG>@A*#ipcG+T&lI3ZutHY=5aVy8Z@xNm0T61~+ zL=n}g4wH{tY8jtpEh=`rU3y!z-T+3Nm>rlg@rJEj#wdg1$JBl58Na1CIulWixTS@Wf>fa5uS^Gs3BpnWO~l1XX0cgNXOBKAfh2iR+d*ThoO*x%J=7ck zXQc&3Pz<00HmAAo4Mz*~H{KW|s^sMa-s0l=H8uW8E}Li2zwR9z^xjT5y1u^7%}Lh9 z@823@J^D%xgBd=J!t>r3N>}6(BJn%}Lkc;#UutL)vA5jiMXm@q>*H%`i2r-{V>3pK1q9RX9z`yj4 zIy|YZSyxmJ77`S$^W3}yTL#cb@&7YrSC6eptJNG99V$T}zDxKM)!th_Ni3YbkBmy< z37?5A&%h>jg>K+Vec6-~>krb+gOeT!$JyD#@V;Kfy_Zi6M%XCvypa};mPem|XMAJi z$uU4PKMcHlk+(fQ9Avf9Q3d~!A{4UIQB}b|;@f4xN12|zZY9+%lQk4DdY6mDXRJ0~ z*0v)S>HY)R<&9xV+)(%GX&zZ=*?kEs{o2Q>)>roIzR0b-ZDM?qEk74)GR)6?y{SyH znt`3=kpdeJ@BEf26i9*t73d~s+^>40I2c!epe-sH8;bMmIS~n&l_M?>|CWQf1Gndu zI>^unACAWILN^opj_9&;|K_!9m z2HHeS?1xJw(tN^NM>E#xfKTgK8f-2Ni<$8rY?7cYyC zQQmh%s4!P+rXHgW9^HgQgk zBW?1`p1I$PdB<1Pq5Sw-l|||uVvD;JLQz#&%GGb2Mv+%mpkt`tw$p?=TV;)z$UHq- z`N_Yu9ORlxq~s1kw|1g{pnszo1=66dk~bz@CInu#I6m5V@Hg%|)1PNOYj$FcD=2E- zRBT~<`s5IuQcl}ho;G_OZ{_cJ^Z@UgFwZZ}ZcirFhW?FiCAWVN7{OJDyuIjI0l;mf zaR|nk1dWLZUlCX0J#u8*R|b@(QmYq$>nw7K+*ZIcwsW8Bta4ePN(%URjL>7Kh0l-$ z6BG+`f1T?kl927ZC56cKv2hkiGDR0}X3z^SN%pAY(>9$?<9%nZ*H*t=%+9_Lq>dZJ z;+ZJrlOo9IZ@xKcHqJgf;~8J68{sXb;NabejcATU>)YJIeTSn3jKkU4kuRpRl!`6j zQ%w#`LYhv>`}YmKy=tFmlT-WdlnAob_tnkB)B;n|LrILR(4PUysPouK~oE+!w%?rj(<_k-&!e6*)-2OL+}O>=I0TX8pmqwdHlI z_7<+WDLDH#pn1Jht<12y(PL}-DXV;2vHpB9Io~Fn{dst6W~MIFRgma}hR7Gn{8lD$ zn0kA8yT%JV?^g2;)1`WFOV%36^GBUrYN8~6Od(?0cf6+5nuvtjjU}H(BYA_W6W0L7 z%{Px3kIvr9%X{irnOK~~Pdy4qXMY~q^X0T*PuhViNzSuQ*C(I=j8KpEID4uVfd3G) z4*sFpg2u;t_&qZ)lLi=gr`8`k@bmPo1^-OhJ^=$B@F4&PszC_VaE}7+9#|g6^I&ag zMWgZCy+gL-9$Db`e+?;B{QrLI1JDD;Z$MeV|0~NO9DvPgd)DjByr76GvS5?9uV_(N z`io^Il`sFN7dj{?ppvQ)7YnnRi__yHN19JTs)Q$ATBLKH`y6G3OgY%D!hbr>S59to zc~^UJ`t%;-CnpXdB!M+MOpLy4YQx-dnO6`Q7zDFB-|n|O#x@t+WPV0OjCISlRaSaO!b~s8clUU1=!kVS zx=H%vnBsa`B@?}` z2e~Why(PTi9CMo!cTFFMVk>ZVE@=*aMipiwoO_TE+(*pNdC1;k8kO0A(9=6>fh}C% zy$aBFV5-k-WL{4(Z|&@96ac9!qyLcQH&aV* z`1%{gyblIeuBWM=A9_h_JrLtuE}sU#CwyAL$-^u~yk|K9hd;wUtgyXD*g*2Z_bCI3 z!jqp?lpZlbk>-mfh*CCm01Xh^S{Vmx-chm;E-o}LEH2*Yx^%%i5!-kUlObr^5B?{N#hb{VRM7WaLfdwT<f(SH6-1Es#W|Wgw zVu*n9ufZ}YT;CS$knV-9&sbf(c!~qEMqygoyx-YdsBw>c z8;0Ds%s1b*!i-Z6NXY@=L_{e|@c4Ji#ugc3$~hzRhOisqSdaBxMOvN4riPR>7cTC8 z1H<5M^W&@`LupUx;?`CzPkLwu?H&-sq~)Wb5wjkjz^S`8)vI+@-P*c!M2TA9`+^-B zGm%e;*o(?C{C>JzdgwWKRENgNhuC~*j3NJxiX!1~EGctw9#N@ zwug{G78|V4MR~KIt?3C*+3rz6cjx8Sr3l2@B;+28ZqDs;+MF*K-OgqQqNCL-4ePwU za{-KvnRHvSZc^f)x1(cY5+#or<)uE7RqUy_|FU4Cq@}$Qx#nLwEvau=IKbs_1P?p6f;d-KMSD@H9GYy+RWlV2Bb)^Wv*K2us5^ir(tEvXcG2fZ4D`C;=H*fE}80j{pizE<$C7&$Y z`)TWBU-|_vmwLTql&vT-2ii*r0dV-IN#+d0R?*b(m9O=f?&B`}R0E@tanXrB$MEDu zbnh{h|9AZBYejcF3W|gIB5I-_@5guzL~}oV3yYOO1>j`0%*hGnp0c7)dU|X*!mCk` z{v|LyIUb29aO@QN19VxMVSr-UYa`1um$bIeSdWBpY^@5MUOdEl;x{kXN`HfFK-T4> zksojdP$9O(e4I%00o26^9To8R25lXu!?LilPoiz%V$UfV%7JudSG+$;fya zvUUR1btPp=8miv4V;V6};k%u&!9ipYp=DdE^V!<#nX=Y%X^?gQCTW?YLFod+2QcR? zX2^4)QEFQ6JJusvY)^tyX{hQvq!T!v=f?07r>p&8A0Y9$BO;gA7)pRl5A*!IAfDvF zhdFc$T5nq)%pGR**@fD9`14%t>OF#Qvsn_M4Pilv6Bs-*PVOc2nbZ=*wYovp5JbxV`COd=k~lm z--on;Rqh1@1a6L*vTOa&`&T)hYn2%%drF)C%W=7@1ONd8flvlKMu6P^b<;~d06p#l Z4thIV=B7`}*q>1zyi-(HK!Uym{s&ibeCq%J literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tag_list-light.png b/testdata/snapshots/darwin/tag_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..da5953d11a19f48a36d1a75b38c3ef1382cff4f1 GIT binary patch literal 8733 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 AM*si- literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/three_way_merge-dark.png b/testdata/snapshots/darwin/three_way_merge-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a18d9901a3c5d9357acde0095c124be1cd4da223 GIT binary patch literal 22445 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 literal 0 HcmV?d00001 diff --git a/three_way_merge.go b/three_way_merge.go new file mode 100644 index 0000000..7a7ab59 --- /dev/null +++ b/three_way_merge.go @@ -0,0 +1,327 @@ +package mujica + +import ( + "fmt" + "log/slog" + "slices" + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// MergeChoice is how a conflict is resolved. +type MergeChoice int + +const ( + MergeUnresolved MergeChoice = iota + // MergeOurs takes the local (current) side. + MergeOurs + // MergeTheirs takes the remote (incoming) side. + MergeTheirs + // MergeBoth takes ours, then theirs. + MergeBoth + // MergeBase keeps the common ancestor. + MergeBase +) + +// mergeChunk is a merge run; stable when all three agree. +type mergeChunk struct { + base, ours, theirs []string + conflict bool + // auto is the merged text of a non-conflicting change. + auto []string + stable bool +} + +// ThreeWayMergeState holds a merge's chunks and conflict choices. +type ThreeWayMergeState struct { + list ui.ListState + base, ours, theirs string + chunks []mergeChunk + choices []MergeChoice + built bool +} + +// Resolved returns chosen conflicts and all conflicts. +func (s *ThreeWayMergeState) Resolved() (done, total int) { + for i, ch := range s.chunks { + if ch.conflict { + total++ + if s.choices[i] != MergeUnresolved { + done++ + } + } + } + return done, total +} + +// Result is the merged text; unresolved conflicts keep conflict markers. +func (s *ThreeWayMergeState) Result() string { + var out []string + for i, ch := range s.chunks { + out = append(out, mergeChunkText(ch, s.choices[i])...) + } + return strings.Join(out, "\n") +} + +func mergeChunkText(ch mergeChunk, choice MergeChoice) []string { + switch { + case ch.stable: + return ch.base + case !ch.conflict: + return ch.auto + } + switch choice { + case MergeOurs: + return ch.ours + case MergeTheirs: + return ch.theirs + case MergeBoth: + return slices.Concat(ch.ours, ch.theirs) + case MergeBase: + return ch.base + } + return slices.Concat([]string{"<<<<<<< ours"}, ch.ours, []string{"======="}, ch.theirs, []string{">>>>>>> theirs"}) +} + +// ThreeWayMergeOptions configure a ThreeWayMerge. +type ThreeWayMergeOptions struct { + Disabled bool +} + +// ThreeWayMerge shows four columns per chunk; give it a height. +func ThreeWayMerge(c *ui.Context, s *ThreeWayMergeState, base, ours, theirs string, opts ThreeWayMergeOptions) ChoiceResult { + if !s.built || s.base != base || s.ours != ours || s.theirs != theirs { + s.chunks = mergeChunks(internal.SplitLines(base), internal.SplitLines(ours), internal.SplitLines(theirs)) + s.choices = make([]MergeChoice, len(s.chunks)) + s.base, s.ours, s.theirs, s.built = base, ours, theirs, true + _, total := s.Resolved() + slog.Debug("mujica: three way merge chunks", "chunks", len(s.chunks), "conflicts", total) + } + k := Tokens(c) + u := Density(c).Unit() + col := ui.Column(c).AlignItems(ui.Stretch).Disabled(opts.Disabled).Background(k.Surface). + Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius).Clip() + res := ChoiceResult{Element: col} + col.Children(func() { + done, total := s.Resolved() + ui.Row(c).AlignItems(ui.Center).Gap(u*3).Padding(u*2, u*3).Background(k.Background).Children(func() { + ui.Text(c, fmt.Sprintf(msg(c, "three_way_merge.resolved"), done, total)).FontWeight(600).Role(ui.RoleStatus) + }) + ui.Grid(c).ColumnTracks(ui.Fr(1), ui.Fr(1), ui.Fr(1), ui.Fr(1)).Background(k.Background).Children(func() { + for _, key := range []string{"ours", "base", "theirs", "result"} { + ui.Text(c, msg(c, "three_way_merge."+key)).Font(theme.SerifFont).FontSize(FontSize(c, theme.CaptionSize)). + TextColor(k.Ornament.Mix(k.Text, 0.35)).Padding(u, u*3) + } + }) + ui.List(c, &s.list, len(s.chunks), func(i int) { + if threeWayMergeChunk(c, s, i) && !col.IsDisabled() { + res.changed = true + } + }).Grow(1) + }) + return res +} + +// threeWayMergeChunk builds chunk i and reports a new choice. +func threeWayMergeChunk(c *ui.Context, s *ThreeWayMergeState, i int) bool { + k := Tokens(c) + u := Density(c).Unit() + ch := s.chunks[i] + changed := false + ui.Column(c).AlignItems(ui.Stretch).Children(func() { + grid := ui.Grid(c).ColumnTracks(ui.Fr(1), ui.Fr(1), ui.Fr(1), ui.Fr(1)) + grid.Draw(func(p *ui.Painter, r ui.Rect) { p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W, H: 1}, k.Border, 0) }) + grid.Children(func() { + tint := func(lines []string, col ui.Color, on bool) { + cell := ui.Column(c).Padding(u, u*3).MinWidth(0).Clip() + if on { + cell.Background(col.Mix(k.Surface, 0.88)) + } + cell.Children(func() { mergeLines(c, lines, ch.stable) }) + } + if ch.stable { + tint(ch.base, k.Text, false) + tint(ch.base, k.Text, false) + tint(ch.base, k.Text, false) + tint(ch.base, k.Text, false) + return + } + choice := s.choices[i] + tint(ch.ours, k.Info, ch.conflict && (choice == MergeOurs || choice == MergeBoth) || !ch.conflict && slices.Equal(ch.auto, ch.ours)) + tint(ch.base, k.TextMuted, choice == MergeBase) + tint(ch.theirs, k.Warning, ch.conflict && (choice == MergeTheirs || choice == MergeBoth) || !ch.conflict && slices.Equal(ch.auto, ch.theirs)) + result := ui.Column(c).Padding(u, u*3).MinWidth(0).Clip() + result.Children(func() { + if ch.conflict && choice == MergeUnresolved { + ui.Row(c).Gap(u).AlignItems(ui.Center).TextColor(k.Danger).Children(func() { + ui.Icon(c, icons.Must("triangle-alert")).Size(14, 14) + ui.Text(c, msg(c, "three_way_merge.unresolved")).FontSize(FontSize(c, theme.CaptionSize)) + }) + return + } + mergeLines(c, mergeChunkText(ch, choice), false) + }) + }) + if !ch.conflict { + return + } + ui.Row(c).Gap(u*2).Padding(u, u*3, u*2, u*3).Wrap().Children(func() { + for _, opt := range []struct { + choice MergeChoice + key string + }{{MergeOurs, "take_ours"}, {MergeTheirs, "take_theirs"}, {MergeBoth, "take_both"}, {MergeBase, "take_base"}} { + if mergeChoiceButton(c, msg(c, "three_way_merge."+opt.key), s.choices[i] == opt.choice).Clicked() && s.choices[i] != opt.choice { + s.choices[i], changed = opt.choice, true + slog.Debug("mujica: three way merge choose", "chunk", i, "choice", opt.key) + } + } + }) + }) + return changed +} + +// mergeChoiceButton is a toggle marking the chosen side. +func mergeChoiceButton(c *ui.Context, label string, on bool) *ui.Element { + k := Tokens(c) + u := Density(c).Unit() + b := ui.ButtonBase(c).MinHeight(theme.MinHitSize).Padding(0, u*3).Gap(u*1.5).Radius(theme.ControlRadius). + Border(theme.BorderWidth, k.ControlBorder).Label(label).TextColor(k.Text) + internal.Ring(b, k.Focus, theme.ControlRadius) + switch { + case on: + b.Background(k.Selection).Border(theme.BorderWidth, k.AccentText).FontWeight(600) + case b.Pressed(): + b.Background(k.Selection) + case b.Hovered(): + b.Background(k.SurfaceHover) + } + b.Transition(colorFade) + b.Children(func() { + if on { + ui.Icon(c, icons.Must("check")).Size(14, 14).TextColor(k.AccentText) + } + ui.Text(c, label).FontSize(FontSize(c, theme.CaptionSize)).SingleLine() + }) + return b +} + +// mergeLines shows code lines, folding long stable runs. +func mergeLines(c *ui.Context, lines []string, fold bool) { + k := Tokens(c) + show := func(ls []string) { + for _, l := range ls { + if l == "" { + l = " " + } + t := ui.Text(c, l).Font(theme.MonoFont).NoWrap().FontSize(FontSize(c, theme.CaptionSize)) + if fold { + t.TextColor(k.TextMuted) + } + } + } + if len(lines) == 0 { + ui.Text(c, "∅").TextColor(k.TextMuted).Label(msg(c, "three_way_merge.empty")) + return + } + if !fold || len(lines) <= 5 { + show(lines) + return + } + show(lines[:2]) + ui.Text(c, fmt.Sprintf(msg(c, "diff_viewer.fold"), len(lines)-4)).Font(theme.SerifFont). + FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) + show(lines[len(lines)-2:]) +} + +// mergeHunk replaces base lines [from, to) with lines. +type mergeHunk struct { + from, to int + lines []string +} + +// mergeHunks lists the changes a diff makes to base. +func mergeHunks(d []internal.DiffLine) []mergeHunk { + var out []mergeHunk + at, open := 0, -1 + for _, l := range d { + if l.Op == internal.DiffEqual { + at = l.Old + open = -1 + continue + } + if open < 0 { + out = append(out, mergeHunk{from: at, to: at}) + open = len(out) - 1 + } + h := &out[open] + if l.Op == internal.DiffDelete { + h.to = l.Old + } else { + h.lines = append(h.lines, l.Text) + } + } + return out +} + +// mergeChunks splits a merge into stable, clean and conflicting runs. +func mergeChunks(base, ours, theirs []string) []mergeChunk { + type tagged struct { + mergeHunk + side int + } + var all []tagged + for side, other := range [][]string{ours, theirs} { + for _, h := range mergeHunks(internal.LineDiff(base, other)) { + all = append(all, tagged{h, side}) + } + } + slices.SortStableFunc(all, func(a, b tagged) int { return a.from - b.from }) + var chunks []mergeChunk + at := 0 + for i := 0; i < len(all); { + from, to := all[i].from, all[i].to + j := i + 1 + for j < len(all) && (all[j].from < to || all[j].from == to && (all[j].from == all[j].to || from == to)) { + to = max(to, all[j].to) + j++ + } + if from > at { + chunks = append(chunks, mergeChunk{base: base[at:from], stable: true}) + } + sides := [2][]string{} + touched := [2]bool{} + for s := range 2 { + cur := from + for _, h := range all[i:j] { + if h.side != s { + continue + } + touched[s] = true + sides[s] = append(sides[s], base[cur:h.from]...) + sides[s] = append(sides[s], h.lines...) + cur = h.to + } + sides[s] = append(sides[s], base[cur:to]...) + } + ch := mergeChunk{base: base[from:to], ours: sides[0], theirs: sides[1]} + switch { + case !touched[1]: + ch.auto = ch.ours + case !touched[0], slices.Equal(ch.ours, ch.theirs): + ch.auto = ch.theirs + default: + ch.conflict = true + } + chunks = append(chunks, ch) + at, i = to, j + } + if at < len(base) { + chunks = append(chunks, mergeChunk{base: base[at:], stable: true}) + } + return chunks +} diff --git a/three_way_merge_test.go b/three_way_merge_test.go new file mode 100644 index 0000000..87e7551 --- /dev/null +++ b/three_way_merge_test.go @@ -0,0 +1,80 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +const ( + mergeBase = "a\nb\nc\nd\ne\nf" + mergeOurs = "a\nB1\nc\nd\ne\nf\ng" + mergeTheirs = "a\nB2\nc\nD\ne\nf" +) + +func TestMergeChunks(t *testing.T) { + chunks := mergeChunks([]string{"a", "b", "c", "d", "e", "f"}, []string{"a", "B1", "c", "d", "e", "f", "g"}, []string{"a", "B2", "c", "D", "e", "f"}) + // a | b conflict | c | d→D clean | e f | +g clean + if len(chunks) != 6 { + t.Fatalf("%d chunks: %+v", len(chunks), chunks) + } + if !chunks[1].conflict || chunks[1].ours[0] != "B1" || chunks[1].theirs[0] != "B2" { + t.Errorf("conflict chunk %+v", chunks[1]) + } + if chunks[3].conflict || chunks[3].auto[0] != "D" { + t.Errorf("clean remote change %+v", chunks[3]) + } + if chunks[5].conflict || len(chunks[5].auto) != 1 || chunks[5].auto[0] != "g" { + t.Errorf("clean local append %+v", chunks[5]) + } + same := mergeChunks([]string{"x"}, []string{"y"}, []string{"y"}) + if len(same) != 1 || same[0].conflict { + t.Errorf("identical changes conflict: %+v", same) + } +} + +func TestThreeWayMergeTakeSides(t *testing.T) { + var s ThreeWayMergeState + changes := 0 + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ThreeWayMerge(c, &s, mergeBase, mergeOurs, mergeTheirs, ThreeWayMergeOptions{Disabled: disabled}) + r.Element.Height(560) + if r.Changed() { + changes++ + } + }, 900, 600) + if !tt.HasText("0 of 1 conflicts resolved") || !tt.HasText("Unresolved") { + t.Fatalf("start: %q", tt.Texts()) + } + if got := s.Result(); got != "a\n<<<<<<< ours\nB1\n=======\nB2\n>>>>>>> theirs\nc\nD\ne\nf\ng" { + t.Fatalf("unresolved result %q", got) + } + if err := tt.Click("Take remote"); err != nil { + t.Fatal(err) + } + if s.Result() != "a\nB2\nc\nD\ne\nf\ng" || changes != 1 || !tt.HasText("1 of 1 conflicts resolved") { + t.Fatalf("take remote: %q changes %d", s.Result(), changes) + } + tt.Key(0, ui.KeyTab) + _ = tt.Click("Take both") + if s.Result() != "a\nB1\nB2\nc\nD\ne\nf\ng" { + t.Fatalf("take both: %q", s.Result()) + } + disabled = true + tt.Frame() + _ = tt.Click("Keep base") + if s.Result() != "a\nB1\nB2\nc\nD\ne\nf\ng" || changes != 2 { + t.Fatalf("disabled merge changed: %q", s.Result()) + } +} + +func TestThreeWayMergeSnapshot(t *testing.T) { + snapshot(t, "three_way_merge", 860, 420, func(c *ui.Context) { + s := ui.Local(c.Root(), "m", func() *ThreeWayMergeState { return &ThreeWayMergeState{} }) + ui.Column(c).Padding(16).Children(func() { + ThreeWayMerge(c, *s, mergeBase, mergeOurs, mergeTheirs, ThreeWayMergeOptions{}).Element.Height(380) + }) + }) +}