From 87a064d44ffb5c0b63021b343e1a4860ffc10b56 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:08:29 -0400 Subject: [PATCH] WIP essentials 2 --- banner.go | 56 ++++++++++ banner_test.go | 75 +++++++++++++ copy_button.go | 64 +++++++++++ copy_button_test.go | 77 ++++++++++++++ messages_essentials.go | 5 + split_button.go | 86 +++++++++++++++ split_button_test.go | 99 ++++++++++++++++++ testdata/snapshots/darwin/banner-dark.png | Bin 0 -> 17577 bytes testdata/snapshots/darwin/banner-light.png | Bin 0 -> 17027 bytes .../snapshots/darwin/copy_button-dark.png | Bin 0 -> 3687 bytes .../snapshots/darwin/copy_button-light.png | Bin 0 -> 3651 bytes .../snapshots/darwin/split_button-dark.png | Bin 0 -> 4424 bytes .../snapshots/darwin/split_button-light.png | Bin 0 -> 4333 bytes 13 files changed, 462 insertions(+) create mode 100644 banner.go create mode 100644 banner_test.go create mode 100644 copy_button.go create mode 100644 copy_button_test.go create mode 100644 split_button.go create mode 100644 split_button_test.go create mode 100644 testdata/snapshots/darwin/banner-dark.png create mode 100644 testdata/snapshots/darwin/banner-light.png create mode 100644 testdata/snapshots/darwin/copy_button-dark.png create mode 100644 testdata/snapshots/darwin/copy_button-light.png create mode 100644 testdata/snapshots/darwin/split_button-dark.png create mode 100644 testdata/snapshots/darwin/split_button-light.png diff --git a/banner.go b/banner.go new file mode 100644 index 0000000..db5f1e1 --- /dev/null +++ b/banner.go @@ -0,0 +1,56 @@ +package mujica + +import ( + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// BannerOptions configure a Banner. +type BannerOptions struct { + Severity Severity + // Action labels a button after the message; empty shows none. + Action string +} + +// Banner is a full-width notice for the top of a page; a non-nil open adds a close button. +func Banner(c *ui.Context, open *bool, message string, opts BannerOptions) AlertResult { + if message == "" { + panic("mujica: Banner needs a message") + } + k := Tokens(c) + tone, icon := severityLook(k, opts.Severity) + if open != nil && !*open { + return AlertResult{} + } + u := Density(c).Unit() + name := msg(c, "alert."+opts.Severity.String()) + var res AlertResult + bar := ui.Row(c).FillWidth().MinHeight(Density(c).ControlHeight()+2*u).AlignItems(ui.Center).Gap(u*3).Padding(u*2, u*3, u*2, u*4). + Background(k.Surface.Mix(tone, 0.08)).Role(ui.RoleGroup).Label(name) + bar.Draw(func(p *ui.Painter, r ui.Rect) { + p.Fill(ui.Rect{X: r.X, Y: r.Y + r.H - 2, W: r.W, H: 2}, tone, 0) + }) + said := ui.Local(bar, "banner.said", func() string { return "" }) + if news := name + ": " + message; opts.Severity >= SeverityWarning && *said != news { + *said = news + c.Announce(news) + } + bar.Children(func() { + ui.Icon(c, icon).Size(20, 20).TextColor(tone) + ui.Text(c, message).TextColor(k.Text).Grow(1).Shrink(1).LineHeight(theme.LineHeight) + if opts.Action != "" && Button(c, opts.Action, ButtonOptions{Variant: Outline}).Clicked() { + slog.Debug("mujica: banner action", "severity", opts.Severity) + res.Action = true + } + if open != nil && iconAction(c, icons.Must("x"), msg(c, "alert.close")).Clicked() { + slog.Debug("mujica: banner closed", "severity", opts.Severity) + *open, res.Closed = false, true + } + }) + res.Element = bar + return res +} diff --git a/banner_test.go b/banner_test.go new file mode 100644 index 0000000..bba858e --- /dev/null +++ b/banner_test.go @@ -0,0 +1,75 @@ +package mujica + +import ( + "slices" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestBannerActionCloseAndAnnounce(t *testing.T) { + open := true + var last AlertResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if r := Banner(c, &open, "Maintenance tonight at 22:00", BannerOptions{Severity: SeverityWarning, Action: "Details"}); r.Action || r.Closed { + last = r + } + }, 700, 200) + if a := tt.Announcements(); !slices.Equal(a, []string{"Warning: Maintenance tonight at 22:00"}) { + t.Fatalf("announcements %q", a) + } + if err := tt.Click("Details"); err != nil { + t.Fatal(err) + } + if !last.Action || !open { + t.Fatalf("action: %+v open %v", last, open) + } + tt.Key(0, ui.KeyTab) // from Details to Dismiss + tt.Key(0, ui.KeyEnter) + if open || !last.Closed || tt.HasText("Maintenance") { + t.Fatalf("keyboard close: open %v %+v", open, last) + } +} + +func TestBannerDisabledAndFixed(t *testing.T) { + open := true + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(true).Children(func() { + Banner(c, &open, "Read only", BannerOptions{Severity: SeverityError}) + }) + Banner(c, nil, "Always here", BannerOptions{}) + }, 700, 200) + _ = tt.Click("Dismiss") + if !open { + t.Fatal("disabled banner closed") + } + if !tt.HasText("Always here") { + t.Fatal("banner without open missing") + } + for _, f := range []func(c *ui.Context){ + func(c *ui.Context) { Banner(c, nil, "", BannerOptions{}) }, + func(c *ui.Context) { Banner(c, nil, "x", BannerOptions{Severity: 7}) }, + } { + func() { + defer func() { + if recover() == nil { + t.Error("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); f(c) }, 300, 100) + }() + } +} + +func TestBannerSnapshot(t *testing.T) { + open := true + snapshot(t, "banner", 640, 200, func(c *ui.Context) { + ui.Column(c).Gap(8).Children(func() { + Banner(c, &open, "A new version is available.", BannerOptions{Action: "Update"}) + Banner(c, &open, "Your trial ends in 3 days.", BannerOptions{Severity: SeverityWarning}) + Banner(c, nil, "Sync is failing; changes stay on this device.", BannerOptions{Severity: SeverityError, Action: "Retry"}) + }) + }) +} diff --git a/copy_button.go b/copy_button.go new file mode 100644 index 0000000..2dd07c9 --- /dev/null +++ b/copy_button.go @@ -0,0 +1,64 @@ +package mujica + +import ( + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// copyButtonShown is how long the button says Copied. +const copyButtonShown = 2 * time.Second + +// CopyButtonOptions configure a CopyButton. +type CopyButtonOptions struct { + // Label shows beside the icon; empty makes a square icon button. + Label string + Disabled bool +} + +// CopyButton puts text on the clipboard, then shows and announces Copied for two seconds. +func CopyButton(c *ui.Context, text string, opts CopyButtonOptions) ChoiceResult { + copied := msg(c, "copy_button.copied") + name := msg(c, "copy_button.copy") + label, icon := opts.Label, icons.Must("copy") + var b *ui.Element + box := ui.Box(c) + at := ui.Local(box, "copy_button.at", func() time.Time { return time.Time{} }) + left := copyButtonShown - c.Now().Sub(*at) + done := !at.IsZero() && left > 0 + if done { + icon, name = icons.Must("check"), copied + if label != "" { + label = copied + } + c.After(left) + } + box.Children(func() { + bo := ButtonOptions{Variant: Secondary, Icon: icon, Disabled: opts.Disabled} + if opts.Label == "" { + bo.Label = name + } + b = Button(c, label, bo) + if opts.Label == "" { + b.Padding(0).Size(Density(c).ControlHeight(), Density(c).ControlHeight()).Tooltip(name) + } else { + // Room for the longer word, so the width holds. + w1, _ := c.MeasureText(0, ui.Span{Text: copied}) + w2, _ := c.MeasureText(0, ui.Span{Text: opts.Label}) + b.MinWidth(max(w1, w2) + buttonSpinnerSize + Density(c).Unit()*10 + 2*theme.BorderWidth) + } + }) + if b.Clicked() && !b.IsDisabled() { + c.WriteClipboard(text) + *at = c.Now() + c.Announce(copied) + c.Invalidate() + slog.Debug("mujica: copy_button copied", "bytes", len(text)) + return ChoiceResult{box, true} + } + return ChoiceResult{box, false} +} diff --git a/copy_button_test.go b/copy_button_test.go new file mode 100644 index 0000000..4e6d07b --- /dev/null +++ b/copy_button_test.go @@ -0,0 +1,77 @@ +package mujica + +import ( + "slices" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func TestCopyButtonCopiesAndAnnounces(t *testing.T) { + n := 0 + var w float32 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Children(func() { + r := CopyButton(c, "sk-live-123", CopyButtonOptions{Label: "Copy key"}) + if r.Changed() { + n++ + } + w = r.Element.Bounds().W + }) + }, 400, 200) + tt.Frame() + before := w + if err := tt.Click("Copy key"); err != nil { + t.Fatal(err) + } + if tt.Clipboard() != "sk-live-123" || n != 1 { + t.Fatalf("clipboard %q, copies %d", tt.Clipboard(), n) + } + if !tt.HasText("Copied") || !slices.Contains(tt.Announcements(), "Copied") { + t.Fatalf("texts %q", tt.Texts()) + } + tt.Frame() + if w != before { + t.Fatalf("width %v changed from %v", w, before) + } +} + +func TestCopyButtonKeyboardRevertAndDisabled(t *testing.T) { + dis := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Locale: ZhCN}) + CopyButton(c, "abc", CopyButtonOptions{Disabled: dis}) + }, 300, 200) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeySpace) + if tt.Clipboard() != "abc" { + t.Fatalf("Space copied %q", tt.Clipboard()) + } + if _, ok := tt.Find("已复制"); !ok { + t.Fatal("icon button lacks the copied name") + } + time.Sleep(copyButtonShown + 50*time.Millisecond) + tt.Frame() + if _, ok := tt.Find("复制"); !ok { + t.Fatal("did not revert to Copy") + } + tt.SetClipboard("") + dis = true + tt.Frame() + _ = tt.Click("复制") + if tt.Clipboard() != "" { + t.Fatal("disabled button copied") + } +} + +func TestCopyButtonSnapshot(t *testing.T) { + snapshot(t, "copy_button", 360, 80, func(c *ui.Context) { + ui.Row(c).Padding(16).Gap(12).Children(func() { + CopyButton(c, "x", CopyButtonOptions{}) + CopyButton(c, "x", CopyButtonOptions{Label: "Copy link"}) + CopyButton(c, "x", CopyButtonOptions{Label: "Copy", Disabled: true}) + }) + }) +} diff --git a/messages_essentials.go b/messages_essentials.go index 88cfc55..ca8dd7e 100644 --- a/messages_essentials.go +++ b/messages_essentials.go @@ -2,6 +2,11 @@ package mujica func init() { addMessages(map[string][2]string{ + "copy_button.copy": {"Copy", "复制"}, + "copy_button.copied": {"Copied", "已复制"}, + + "split_button.more": {"More options", "更多选项"}, + "qr_code.label": {"QR code", "二维码"}, "qr_code.too_long": {"Text too long for a QR code", "文字过长,无法生成二维码"}, }) diff --git a/split_button.go b/split_button.go new file mode 100644 index 0000000..200d60a --- /dev/null +++ b/split_button.go @@ -0,0 +1,86 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// SplitButtonOptions configure a SplitButton. +type SplitButtonOptions struct { + // Variant is Primary (the zero value) or Secondary. + Variant ButtonVariant + Icon *ui.SVG + // MenuLabel names the menu half; empty uses "More options". + MenuLabel string + Disabled bool +} + +// SplitButton runs its main action from the left half and opens build's menu from the right; each half takes focus. +func SplitButton(c *ui.Context, label string, opts SplitButtonOptions, build func(m *PopupMenu)) ChoiceResult { + if label == "" || build == nil { + panic("mujica: SplitButton needs a label and a menu") + } + if opts.Variant != Primary && opts.Variant != Secondary { + panic(fmt.Sprintf("mujica: SplitButton Variant %d must be Primary or Secondary", opts.Variant)) + } + k := Tokens(c) + d := Density(c) + menuName := opts.MenuLabel + if menuName == "" { + menuName = msg(c, "split_button.more") + } + group := ui.Row(c).AlignItems(ui.Stretch).Disabled(opts.Disabled) + disabled := group.IsDisabled() + open := ui.Local(group, "split_button.open", func() bool { return false }) + if disabled { + *open = false + } + var clicked bool + group.Children(func() { + main := ui.ButtonBase(c).MinHeight(d.ControlHeight()).Padding(0, d.Unit()*4).Gap(d.Unit()*2). + Radius(theme.ControlRadius, 0, 0, theme.ControlRadius) + splitButtonLook(c, k, main, opts.Variant, false) + main.Children(func() { + if opts.Icon != nil { + ui.Icon(c, opts.Icon).Size(16, 16) + } + ui.Text(c, label).SingleLine() + }) + clicked = main.Clicked() && !disabled + if opts.Variant == Primary { + ui.Box(c).Width(theme.BorderWidth).Background(k.OnAccent.Alpha(0.45)).Role(ui.RoleNone) + } + more := ui.ButtonBase(c).Role(ui.RoleMenuButton).Label(menuName).MinHeight(d.ControlHeight()).Width(theme.MinHitSize+d.Unit()). + Radius(0, theme.ControlRadius, theme.ControlRadius, 0).Tooltip(menuName) + splitButtonLook(c, k, more, opts.Variant, *open) + if opts.Variant == Secondary { + more.BorderWidth(theme.BorderWidth, theme.BorderWidth, theme.BorderWidth, 0) + } + more.Children(func() { ui.Icon(c, icons.Must("chevron-down")).Size(14, 14) }) + if !disabled && (more.Clicked() || more.Shortcut(0, ui.KeyDown)) { + *open = true + slog.Debug("mujica: split_button open") + } + popupMenuOpen(c, group, open, build) + }) + if clicked { + slog.Debug("mujica: split_button action", "label", label) + } + return ChoiceResult{group, clicked} +} + +// splitButtonLook colors one half as a Button of variant v would be. +func splitButtonLook(c *ui.Context, k theme.Tokens, b *ui.Element, v ButtonVariant, open bool) { + internal.Ring(b, k.Focus, theme.ControlRadius) + bg, fg, border := buttonColors(k, v, b.Hovered() && !b.IsDisabled(), b.Pressed() || open) + b.Background(bg).TextColor(fg).Transition(colorFade) + if border.A > 0 { + b.Border(theme.BorderWidth, border) + } +} diff --git a/split_button_test.go b/split_button_test.go new file mode 100644 index 0000000..166d2c1 --- /dev/null +++ b/split_button_test.go @@ -0,0 +1,99 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func splitButtonTester(dis *bool, runs *int, chosen *string) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Padding(20).Children(func() { + r := SplitButton(c, "Save", SplitButtonOptions{Disabled: *dis}, func(m *PopupMenu) { + for _, s := range []string{"Save as…", "Save all"} { + if m.Item(s, PopupMenuItemOptions{}) { + *chosen = s + } + } + }) + if r.Changed() { + *runs++ + } + }) + }, 500, 300) +} + +func TestSplitButtonMainAndMenu(t *testing.T) { + dis, runs, chosen := false, 0, "" + tt := splitButtonTester(&dis, &runs, &chosen) + if err := tt.Click("Save"); err != nil { + t.Fatal(err) + } + if runs != 1 || tt.HasText("Save all") { + t.Fatalf("main click: runs %d, menu open %v", runs, tt.HasText("Save all")) + } + if err := tt.Click("More options"); err != nil { + t.Fatal(err) + } + if err := tt.Click("Save all"); err != nil { + t.Fatal(err) + } + if chosen != "Save all" || runs != 1 || tt.HasText("Save as…") { + t.Fatalf("menu choice %q runs %d", chosen, runs) + } +} + +func TestSplitButtonKeyboardHalves(t *testing.T) { + dis, runs, chosen := false, 0, "" + tt := splitButtonTester(&dis, &runs, &chosen) + tt.Key(0, ui.KeyTab) + if !tt.Focused("Save") { + t.Fatal("first Tab misses the main half") + } + tt.Key(0, ui.KeyEnter) + tt.Key(0, ui.KeyTab) + if !tt.Focused("More options") { + t.Fatal("second Tab misses the menu half") + } + tt.Key(0, ui.KeyDown) + if runs != 1 || !tt.HasText("Save as…") { + t.Fatalf("runs %d, menu %v", runs, tt.HasText("Save as…")) + } + tt.Key(0, ui.KeyEnter) + if chosen != "Save as…" { + t.Fatalf("Enter chose %q", chosen) + } +} + +func TestSplitButtonDisabled(t *testing.T) { + dis, runs, chosen := true, 0, "" + tt := splitButtonTester(&dis, &runs, &chosen) + _ = tt.Click("Save") + _ = tt.Click("More options") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if runs != 0 || tt.HasText("Save all") { + t.Fatalf("disabled: runs %d menu %v", runs, tt.HasText("Save all")) + } + defer func() { + if recover() == nil { + t.Fatal("Danger variant accepted") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + SplitButton(c, "x", SplitButtonOptions{Variant: Danger}, func(*PopupMenu) {}) + }, 200, 100) +} + +func TestSplitButtonSnapshot(t *testing.T) { + snapshot(t, "split_button", 460, 80, func(c *ui.Context) { + ui.Row(c).Padding(16).Gap(12).Children(func() { + menu := func(m *PopupMenu) { m.Item("Other", PopupMenuItemOptions{}) } + SplitButton(c, "Publish", SplitButtonOptions{}, menu) + SplitButton(c, "Export", SplitButtonOptions{Variant: Secondary}, menu) + SplitButton(c, "Merge", SplitButtonOptions{Disabled: true}, menu) + }) + }) +} diff --git a/testdata/snapshots/darwin/banner-dark.png b/testdata/snapshots/darwin/banner-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec220a9b60e0bd9bfcc6c04e512562f32f7eecf GIT binary patch literal 17577 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/banner-light.png b/testdata/snapshots/darwin/banner-light.png new file mode 100644 index 0000000000000000000000000000000000000000..c465661c98354ba36203221a6a175d56b8737c17 GIT binary patch literal 17027 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/copy_button-dark.png b/testdata/snapshots/darwin/copy_button-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b059394ebc77b5d5b7a0fe6bb3bcd1450774431b GIT binary patch literal 3687 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 A0RR91 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/copy_button-light.png b/testdata/snapshots/darwin/copy_button-light.png new file mode 100644 index 0000000000000000000000000000000000000000..f5668c35644b09b5bd2e049b4dafc92e5547d10a GIT binary patch literal 3651 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 C0bct6 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/split_button-light.png b/testdata/snapshots/darwin/split_button-light.png new file mode 100644 index 0000000000000000000000000000000000000000..892ce9ef1f8f5bc8bd2e3fe45146d4aa57c61429 GIT binary patch literal 4333 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 OM1txX>)^B