From 7e4f275f0a4e8fcbfb47f087348b18fb305afcd7 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 15:51:57 -0400 Subject: [PATCH] WIP components (as built) --- alert_list.go | 8 +- alert_list_test.go | 10 + api_request_builder.go | 24 +- api_request_builder_test.go | 33 ++- dashboard_filter_bar.go | 13 +- dashboard_filter_bar_test.go | 34 +++ devtools_parts.go | 4 +- docs/components/442-stat-card.md | 39 ++++ docs/components/443-alert-list.md | 42 ++++ docs/components/444-incident-card.md | 36 +++ docs/components/445-uptime-bar.md | 42 ++++ docs/components/446-service-status.md | 36 +++ docs/components/447-log-stream.md | 39 ++++ docs/components/448-trace-waterfall.md | 38 +++ docs/components/449-resource-gauge.md | 38 +++ docs/components/450-system-monitor.md | 39 ++++ .../451-refresh-interval-selector.md | 42 ++++ docs/components/452-dashboard-filter-bar.md | 39 ++++ docs/components/453-json-viewer.md | 40 ++++ docs/components/454-json-editor.md | 39 ++++ docs/components/455-schema-tree.md | 40 ++++ docs/components/456-api-request-builder.md | 42 ++++ docs/components/457-response-viewer.md | 38 +++ docs/components/458-key-value-input.md | 38 +++ example_devtools_test.go | 218 ++++++++++++++++++ examples/gallery/pages_devtools.go | 22 +- examples/gallery/pages_devtools_code.go | 175 ++++++++++++++ examples/gallery/pages_devtools_editors.go | 133 +++++++++++ examples/gallery/pages_devtools_status.go | 173 ++++++++++++++ examples/gallery/pages_devtools_streams.go | 127 ++++++++++ examples/gallery/pages_devtools_test.go | 87 +++++++ incident_card.go | 10 +- incident_card_test.go | 11 + json_editor.go | 31 ++- json_editor_test.go | 60 +++++ json_viewer.go | 19 +- json_viewer_test.go | 45 ++++ key_value_input.go | 21 +- key_value_input_test.go | 26 +++ log_stream.go | 17 +- log_stream_test.go | 47 ++++ messages_devtools.go | 14 +- refresh_interval_selector.go | 10 +- refresh_interval_selector_test.go | 42 ++++ resource_gauge.go | 29 ++- resource_gauge_test.go | 47 ++++ response_viewer.go | 127 ++++++++++ response_viewer_test.go | 154 +++++++++++++ schema_tree.go | 31 ++- schema_tree_test.go | 58 +++++ service_status.go | 32 ++- service_status_test.go | 12 + stat_card.go | 22 +- stat_card_test.go | 43 +++- system_monitor.go | 33 +-- system_monitor_test.go | 45 +++- tabs.go | 7 +- tabs_test.go | 23 ++ .../snapshots/darwin/incident_card-dark.png | Bin 31767 -> 31594 bytes .../snapshots/darwin/incident_card-light.png | Bin 30898 -> 30812 bytes .../snapshots/darwin/key_value_input-dark.png | Bin 9219 -> 9056 bytes .../darwin/key_value_input-light.png | Bin 8880 -> 8736 bytes testdata/snapshots/darwin/log_stream-dark.png | Bin 25790 -> 25839 bytes .../snapshots/darwin/log_stream-light.png | Bin 24674 -> 24899 bytes .../snapshots/darwin/response_viewer-dark.png | Bin 0 -> 17213 bytes .../darwin/response_viewer-light.png | Bin 0 -> 16849 bytes .../snapshots/darwin/schema_tree-dark.png | Bin 16250 -> 16367 bytes .../snapshots/darwin/schema_tree-light.png | Bin 15825 -> 15981 bytes testdata/snapshots/darwin/stat_card-dark.png | Bin 17500 -> 17784 bytes testdata/snapshots/darwin/stat_card-light.png | Bin 17069 -> 17461 bytes .../snapshots/darwin/system_monitor-dark.png | Bin 29032 -> 35556 bytes .../snapshots/darwin/system_monitor-light.png | Bin 28012 -> 34224 bytes .../snapshots/darwin/trace_waterfall-dark.png | Bin 15132 -> 15239 bytes .../darwin/trace_waterfall-light.png | Bin 14635 -> 14743 bytes testdata/snapshots/darwin/uptime_bar-dark.png | Bin 5669 -> 5684 bytes .../snapshots/darwin/uptime_bar-light.png | Bin 5438 -> 5457 bytes trace_waterfall.go | 16 +- trace_waterfall_test.go | 21 ++ uptime_bar.go | 67 ++++-- uptime_bar_test.go | 38 +++ 80 files changed, 2754 insertions(+), 132 deletions(-) create mode 100644 docs/components/442-stat-card.md create mode 100644 docs/components/443-alert-list.md create mode 100644 docs/components/444-incident-card.md create mode 100644 docs/components/445-uptime-bar.md create mode 100644 docs/components/446-service-status.md create mode 100644 docs/components/447-log-stream.md create mode 100644 docs/components/448-trace-waterfall.md create mode 100644 docs/components/449-resource-gauge.md create mode 100644 docs/components/450-system-monitor.md create mode 100644 docs/components/451-refresh-interval-selector.md create mode 100644 docs/components/452-dashboard-filter-bar.md create mode 100644 docs/components/453-json-viewer.md create mode 100644 docs/components/454-json-editor.md create mode 100644 docs/components/455-schema-tree.md create mode 100644 docs/components/456-api-request-builder.md create mode 100644 docs/components/457-response-viewer.md create mode 100644 docs/components/458-key-value-input.md create mode 100644 example_devtools_test.go create mode 100644 examples/gallery/pages_devtools_code.go create mode 100644 examples/gallery/pages_devtools_editors.go create mode 100644 examples/gallery/pages_devtools_status.go create mode 100644 examples/gallery/pages_devtools_streams.go create mode 100644 examples/gallery/pages_devtools_test.go create mode 100644 response_viewer.go create mode 100644 response_viewer_test.go create mode 100644 testdata/snapshots/darwin/response_viewer-dark.png create mode 100644 testdata/snapshots/darwin/response_viewer-light.png diff --git a/alert_list.go b/alert_list.go index 97c92d6..5d97579 100644 --- a/alert_list.go +++ b/alert_list.go @@ -40,11 +40,11 @@ type AlertListOptions struct { // AlertListResult reports this frame's request. type AlertListResult struct { Element *ui.Element - // Ack and Silence are the IDs to acknowledge or silence for an hour, else "". + // Ack and Silence report requested alert IDs; empty means idle. Ack, Silence string } -// AlertList lists alerts by level, source and time with acknowledge and silence. +// AlertList shows alerts with acknowledge and silence actions. func AlertList(c *ui.Context, alerts []AlertItem, opts AlertListOptions) AlertListResult { if opts.MaxHeight < 0 { panic("mujica: AlertList MaxHeight is negative") @@ -86,7 +86,7 @@ func AlertList(c *ui.Context, alerts []AlertItem, opts AlertListOptions) AlertLi return r } -// alertRow shows one alert and reports its acknowledge and silence presses. +// alertRow shows an alert with acknowledge and silence buttons. func alertRow(c *ui.Context, a AlertItem, locked bool) (ack, silence bool) { k := Tokens(c) d := Density(c) @@ -94,7 +94,7 @@ func alertRow(c *ui.Context, a AlertItem, locked bool) (ack, silence bool) { sev := [...]Severity{SeverityInfo, SeverityWarning, SeverityError}[a.Level] word := msg(c, [...]string{"alert_list.info", "alert_list.warning", "alert_list.critical"}[a.Level]) silenced := a.Silence.After(c.Now()) - row := ui.Row(c).Key(a.ID).Gap(u * 3).AlignItems(ui.Center).MinHeight(d.ControlHeight() + u*2).Padding(u*2, u*3). + row := ui.Row(c).Key(a.ID).Gap(u*3).AlignItems(ui.Center).MinHeight(d.ControlHeight()+u*2).Padding(u*2, u*3). Label(word + ", " + a.Title) if tone, _ := severityLook(k, sev); a.Level == AlertCritical && !a.Acked { row.DrawOver(func(p *ui.Painter, r ui.Rect) { p.Fill(ui.Rect{X: r.X, Y: r.Y, W: 3, H: r.H}, tone, 0) }) diff --git a/alert_list_test.go b/alert_list_test.go index 156f7e0..c3d136f 100644 --- a/alert_list_test.go +++ b/alert_list_test.go @@ -81,3 +81,13 @@ func TestAlertListSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { AlertList(c, alerts, AlertListOptions{}) }) }) } + +func TestAlertListRejectsDuplicateIDs(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("duplicate alerts accepted") + } + }() + var results []AlertListResult + alertTester([]AlertItem{{ID: "a", Title: "One"}, {ID: "a", Title: "Two"}}, AlertListOptions{}, &results) +} diff --git a/api_request_builder.go b/api_request_builder.go index 8abceab..47452d8 100644 --- a/api_request_builder.go +++ b/api_request_builder.go @@ -12,7 +12,7 @@ import ( "mujicaui/theme" ) -// ApiRequest is an HTTP request being built; the caller sends it. +// ApiRequest holds request data sent by the caller. type ApiRequest struct { // Method is GET when empty. Method string @@ -41,13 +41,16 @@ type apiRequestState struct{ tab int } var apiMethods = []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"} -// ApiRequestBuilder edits method, URL, query parameters, headers and body, and reports a send. +// ApiRequestBuilder edits requests and reports send actions. func ApiRequestBuilder(c *ui.Context, req *ApiRequest, opts ApiRequestBuilderOptions) ApiRequestResult { if req == nil { panic("mujica: ApiRequestBuilder needs a request") } + original := req if req.Method == "" { - req.Method = "GET" + copy := *req + copy.Method = "GET" + req = © } if !slices.Contains(apiMethods, req.Method) { panic("mujica: ApiRequestBuilder method " + req.Method + " is not offered") @@ -57,6 +60,15 @@ func ApiRequestBuilder(c *ui.Context, req *ApiRequest, opts ApiRequestBuilderOpt r.Element = ui.Column(c).Shrink(0).Gap(u * 3).Disabled(opts.Disabled) st := ui.Local(r.Element, "mujica.apirequest", func() apiRequestState { return apiRequestState{} }) locked := r.Element.IsDisabled() + if locked { + copy := *req + copy.Params = slices.Clone(req.Params) + copy.Headers = slices.Clone(req.Headers) + req = © + } else { + *original = *req + req = original + } full, urlErr := apiRequestURL(*req) r.Element.Children(func() { ui.Row(c).Gap(u * 2).AlignItems(ui.Start).Children(func() { @@ -67,7 +79,7 @@ func ApiRequestBuilder(c *ui.Context, req *ApiRequest, opts ApiRequestBuilderOpt r.Changed = Select(c, &req.Method, methods, SelectOptions{Label: msg(c, "api_request_builder.method"), Disabled: locked}).Changed() shownErr := "" if req.URL != "" && urlErr != nil { - shownErr = urlErr.Error() + shownErr = msg(c, "api_request_builder.invalid_url") } in := TextInput(c, &req.URL, TextInputOptions{Placeholder: "https://", Label: msg(c, "api_request_builder.url"), Disabled: locked, Error: shownErr}) in.Element.Grow(1) @@ -98,12 +110,12 @@ func ApiRequestBuilder(c *ui.Context, req *ApiRequest, opts ApiRequestBuilderOpt Tabs(c, &st.tab, tabs, TabsOptions{Label: msg(c, "api_request_builder.parts")}) }) if r.Send { - slog.Debug("mujica: api_request_builder send", "method", req.Method) // never the URL: it may hold a token + slog.Debug("mujica: api_request_builder send", "method", req.Method) // Request URLs may contain secrets. } return r } -// apiRequestURL joins the URL with its enabled query parameters, or says why it is invalid. +// apiRequestURL joins enabled query parameters with a validated URL. func apiRequestURL(req ApiRequest) (string, error) { if req.URL == "" { return "", fmt.Errorf("empty URL") diff --git a/api_request_builder_test.go b/api_request_builder_test.go index 151a7c5..1013035 100644 --- a/api_request_builder_test.go +++ b/api_request_builder_test.go @@ -28,7 +28,7 @@ func TestApiRequestBuilderBuildAndSend(t *testing.T) { _ = tt.Click("Send") // disabled without a URL _ = tt.Click("Request URL") tt.Type("ftp://court") - if !tt.HasText("the URL needs http:// or https:// and a host") || sends != 0 { + if !tt.HasText("Enter a valid HTTP or HTTPS URL") || sends != 0 { t.Fatalf("invalid URL: %q", tt.Texts()) } req.URL = "" @@ -91,3 +91,34 @@ func TestApiRequestBuilderSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { ApiRequestBuilder(c, &req, ApiRequestBuilderOptions{}) }) }) } + +func TestApiRequestBuilderDisabledPreservesDefault(t *testing.T) { + var req ApiRequest + sends := 0 + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(true).Children(func() { ApiRequestBuilder(c, &req, ApiRequestBuilderOptions{}) }) + }, 600, 400) + if req.Method != "" || sends != 0 { + t.Fatal("disabled request changed") + } +} + +func TestApiRequestBuilderAncestorDisabledTabs(t *testing.T) { + disabled := false + request := ApiRequest{URL: "https://court.example", Params: []KeyValue{{Key: "page", Value: "1", Enabled: true}}, Headers: []KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + ApiRequestBuilder(c, &request, ApiRequestBuilderOptions{}) + }) + }, 760, 520) + if err := tt.Click("Params (1)"); err != nil { + t.Fatal(err) + } + disabled = true + tt.Key(0, ui.KeyRight) + if !tt.HasText("page") || tt.HasText("Accept") { + t.Fatal("disabled request switched tabs") + } +} diff --git a/dashboard_filter_bar.go b/dashboard_filter_bar.go index efd0686..b998da5 100644 --- a/dashboard_filter_bar.go +++ b/dashboard_filter_bar.go @@ -11,9 +11,9 @@ import ( "mujicaui/icons" ) -// DashboardFilters is what a dashboard is filtered by; the zero value filters nothing. +// DashboardFilters holds filters; zero uses caller defaults. type DashboardFilters struct { - // Range is how far back to look; zero means the caller's default. + // Range is the look-back; zero uses the caller's default. Range time.Duration Env string Tags []string @@ -21,7 +21,7 @@ type DashboardFilters struct { // DashboardFilterBarOptions configure a DashboardFilterBar. type DashboardFilterBarOptions struct { - // Ranges are the offered look-backs; nil uses 15 min, 1 h, 24 h and 7 d. + // Ranges defaults to 15m, 1h, 24h and 7d. Ranges []time.Duration // Envs and Tags are the offered environments and tags. Envs, Tags []string @@ -30,7 +30,7 @@ type DashboardFilterBarOptions struct { var dashboardRanges = []time.Duration{15 * time.Minute, time.Hour, 24 * time.Hour, 7 * 24 * time.Hour} -// DashboardFilterBar filters by time range, environment and tags, with a clear button. +// DashboardFilterBar edits time, environment and tags with clear. func DashboardFilterBar(c *ui.Context, f *DashboardFilters, opts DashboardFilterBarOptions) ChoiceResult { if f == nil { panic("mujica: DashboardFilterBar needs filters") @@ -42,6 +42,11 @@ func DashboardFilterBar(c *ui.Context, f *DashboardFilters, opts DashboardFilter if f.Env != "" && !slices.Contains(opts.Envs, f.Env) { panic("mujica: DashboardFilterBar Env is not offered") } + for _, tag := range f.Tags { + if !slices.Contains(opts.Tags, tag) { + panic("mujica: DashboardFilterBar tag is not offered") + } + } u := Density(c).Unit() var r ChoiceResult r.Element = ui.Row(c).Shrink(0).Wrap().Gap(u * 3).AlignItems(ui.Center).Disabled(opts.Disabled). diff --git a/dashboard_filter_bar_test.go b/dashboard_filter_bar_test.go index db17674..b87c7cd 100644 --- a/dashboard_filter_bar_test.go +++ b/dashboard_filter_bar_test.go @@ -71,3 +71,37 @@ func TestDashboardFilterBarSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { DashboardFilterBar(c, &f, filterOpts) }) }) } + +func TestDashboardFilterBarKeyboardAndAncestorDisabled(t *testing.T) { + var f DashboardFilters + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { DashboardFilterBar(c, &f, filterOpts) }) + }, 900, 420) + _ = tt.Click("Environment") + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + if f.Env != "production" { + t.Fatal("keyboard environment") + } + _ = tt.Click("Environment") + disabled = true + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + _ = tt.Click("Clear filters") + if f.Env != "production" || tt.HasText("staging") { + t.Fatal("disabled filter or popup changed") + } +} + +func TestDashboardFilterBarRejectsUnknownTags(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("unoffered tag accepted") + } + }() + f := DashboardFilters{Tags: []string{"unknown"}} + n := 0 + filterTester(&f, filterOpts, &n) +} diff --git a/devtools_parts.go b/devtools_parts.go index 845590d..47439c7 100644 --- a/devtools_parts.go +++ b/devtools_parts.go @@ -9,13 +9,13 @@ import ( "mujicaui/theme" ) -// devtoolsAgo formats how long before now t was, as "5 m ago". +// devtoolsAgo formats elapsed time using localized copy. func devtoolsAgo(c *ui.Context, t time.Time) string { d := max(c.Now().Sub(t), 0).Truncate(time.Second) return fmt.Sprintf(msg(c, "devtools.ago"), agentDuration(d)) } -// devtoolsSeverity shows a severity by icon and word, never color alone. +// devtoolsSeverity shows severity with an icon and word. func devtoolsSeverity(c *ui.Context, s Severity, word string) { tone, icon := severityLook(Tokens(c), s) ui.Row(c).Gap(Density(c).Unit()).AlignItems(ui.Center).Shrink(0).Children(func() { diff --git a/docs/components/442-stat-card.md b/docs/components/442-stat-card.md new file mode 100644 index 0000000..481ee55 --- /dev/null +++ b/docs/components/442-stat-card.md @@ -0,0 +1,39 @@ +# 442 StatCard · 统计卡片 + +## 用途 + +展示调用方统计值、变化率和迷你趋势图。 + +## 最小示例 + +```go +value := "12,480" +opts := mujica.StatCardOptions{Label: "Requests", Change: 0.12, HasChange: true, Trend: []float64{3, 5, 4, 8}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.StatCard(c, value, opts).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Label 必填;Change 是相对变化;HasChange 开启变化说明;LowerIsBetter 反转好坏;Trend 为趋势值;Status、Error 控制加载与错误。 + +## 状态 + +值与变化率、趋势、加载、失败、父级禁用。 + +## 事件 + +Changed() 表示重试。 + +## 键盘操作 + +Tab 聚焦趋势或重试;方向键读取数据;Enter 激活重试。 + +## 限制 + +卡片最小高度 116 DIP,随桌面文本缩放增长;统计值由调用方计算。 diff --git a/docs/components/443-alert-list.md b/docs/components/443-alert-list.md new file mode 100644 index 0000000..d8472d4 --- /dev/null +++ b/docs/components/443-alert-list.md @@ -0,0 +1,42 @@ +# 443 AlertList · 告警列表 + +## 用途 + +按级别、来源与发生时间展示告警;报告确认和静默请求。 + +## 最小示例 + +```go +alerts := []mujica.AlertItem{{ID: "cpu", Title: "CPU usage high", Level: mujica.AlertWarning, Source: "worker", At: time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC)}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.AlertList(c, alerts, mujica.AlertListOptions{}) + if r.Ack != "" { + fmt.Println("ack", r.Ack) + } + if r.Silence != "" { + fmt.Println("silence", r.Silence) + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +MaxHeight 为列表最大高度,默认 360 DIP;Disabled 禁用操作。AlertItem.ID 唯一,Title 必填,Level 为有效枚举;Acked、Silence 展示处理状态。 + +## 状态 + +未处理、已确认、静默中、空列表、禁用。 + +## 事件 + +Ack、Silence 返回告警 ID;调用方更新 Acked 或 Silence。 + +## 键盘操作 + +Tab 聚焦按钮;Enter 或 Space 激活。 + +## 限制 + +静默请求固定为一小时;告警数据由调用方管理。 diff --git a/docs/components/444-incident-card.md b/docs/components/444-incident-card.md new file mode 100644 index 0000000..98f4d80 --- /dev/null +++ b/docs/components/444-incident-card.md @@ -0,0 +1,36 @@ +# 444 IncidentCard · 事件卡片 + +## 用途 + +展示事件标题、状态、影响与按时间排列的更新。 + +## 最小示例 + +```go +incident := mujica.Incident{Title: "API latency", Status: mujica.IncidentMonitoring, Impact: mujica.ImpactMinor, Updates: []mujica.IncidentUpdate{{Status: mujica.IncidentIdentified, Text: "Slow query located"}, {Status: mujica.IncidentMonitoring, Text: "Recovery observed"}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IncidentCard(c, incident) +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Incident.Title 必填;Status、Impact 使用枚举;Started 与 Updates 的时间由调用方提供。 + +## 状态 + +调查中、已定位、观察中、已解决;四级影响。 + +## 事件 + +展示组件,调用方更新 Incident。 + +## 键盘操作 + +展示内容随调用方更新。 + +## 限制 + +时间线按输入顺序展示;调用方排序。 diff --git a/docs/components/445-uptime-bar.md b/docs/components/445-uptime-bar.md new file mode 100644 index 0000000..b52ed3e --- /dev/null +++ b/docs/components/445-uptime-bar.md @@ -0,0 +1,42 @@ +# 445 UptimeBar · 可用性条 + +## 用途 + +按日展示可用性,以条高与文字区分状态。 + +## 最小示例 + +```go +days := []mujica.UptimeDay{{Date: mujica.Date{Year: 2026, Month: 10, Day: 1}, Uptime: 1}, {Date: mujica.Date{Year: 2026, Month: 10, Day: 2}, Uptime: 0.91, Note: "Recovery"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.UptimeBar(c, days, mujica.UptimeBarOptions{Frame: mujica.ChartFrame{Label: "API uptime"}}) + if r.Changed() { + fmt.Println("day", r.Point) + } + if r.Retried() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Frame.Label 必填;Frame.Height 默认 36 DIP;Frame.Status、Error 控制状态;Degraded 默认 0.999,Down 默认 0.95;Uptime 为 0 到 1,NaN 表示缺少数据。 + +## 状态 + +正常、降级、中断、缺测、空数据、加载、失败、父级禁用。 + +## 事件 + +Changed() 报告读取点变化;Point 为日期索引;Retried() 报告重试。 + +## 键盘操作 + +Tab 聚焦图;方向键逐日移动;Home、End 到边界;Escape 清除读取。 + +## 限制 + +大数据按像素列汇总;更新数据时提交新切片。 diff --git a/docs/components/446-service-status.md b/docs/components/446-service-status.md new file mode 100644 index 0000000..2692c51 --- /dev/null +++ b/docs/components/446-service-status.md @@ -0,0 +1,36 @@ +# 446 ServiceStatus · 服务状态 + +## 用途 + +展示服务正常、降级、中断和总体统计。 + +## 最小示例 + +```go +services := []mujica.ServiceItem{{Name: "API", Health: mujica.ServiceOperational}, {Name: "Search", Health: mujica.ServiceDegraded, Note: "Slow queries"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ServiceStatus(c, services, mujica.ServiceStatusOptions{}) +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +MaxHeight 默认 360 DIP;ServiceItem.Name 必填;Health 为有效枚举;Note 展示原因。 + +## 状态 + +正常、降级、中断、空列表;总体统计随数据更新。 + +## 事件 + +展示组件,调用方更新服务切片。 + +## 键盘操作 + +滚动列表浏览服务。 + +## 限制 + +状态来自调用方;每行使用图标和文字区分状态。更新服务数据时提交新切片。 diff --git a/docs/components/447-log-stream.md b/docs/components/447-log-stream.md new file mode 100644 index 0000000..951d541 --- /dev/null +++ b/docs/components/447-log-stream.md @@ -0,0 +1,39 @@ +# 447 LogStream · 日志流 + +## 用途 + +展示实时 ANSI 日志,支持暂停、级别过滤与跟随末尾。 + +## 最小示例 + +```go +lines := []mujica.LogLine{{Level: mujica.LogInfo, Text: "server ready"}, {Level: mujica.LogWarn, Text: "slow query"}} +var state mujica.LogStreamState +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.LogStream(c, lines, &state, mujica.LogStreamOptions{}).Changed() { + fmt.Println("filter changed") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Height 默认 320 DIP;Disabled 禁用;LogStreamState.Paused 控制暂停,MinLevel 指定最低级别。 + +## 状态 + +跟随末尾、暂停、级别过滤、空数据、禁用。 + +## 事件 + +Changed() 报告暂停或过滤变化。 + +## 键盘操作 + +Tab 聚焦暂停和级别;方向键切换级别;Space 激活暂停。 + +## 限制 + +追加或替换日志提交新切片;暂停冻结条数。 diff --git a/docs/components/448-trace-waterfall.md b/docs/components/448-trace-waterfall.md new file mode 100644 index 0000000..b7fa2e6 --- /dev/null +++ b/docs/components/448-trace-waterfall.md @@ -0,0 +1,38 @@ +# 448 TraceWaterfall · 调用链瀑布图 + +## 用途 + +按跨度父子层级与耗时展示调用链,并读取跨度详情。 + +## 最小示例 + +```go +spans := []mujica.TraceSpan{{ID: "root", Name: "GET /api", Service: "gateway", Duration: 200 * time.Millisecond}, {ID: "db", Parent: "root", Name: "Query", Service: "database", Start: 20 * time.Millisecond, Duration: 80 * time.Millisecond}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.TraceWaterfall(c, spans, mujica.TraceWaterfallOptions{}).Changed() { + fmt.Println("span selected") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Height 默认 320 DIP;TraceSpan.ID 唯一,Name 必填;Parent 关联父跨度;Start、Duration 为非负时间;Error 标记失败。 + +## 状态 + +空数据、跨度选择、失败跨度、父级禁用。 + +## 事件 + +Changed() 表示选择了跨度。 + +## 键盘操作 + +Tab 聚焦跨度;上下方向键移动;Enter 读取详情。 + +## 限制 + +更新调用链提交新切片;跨度父子关系须构成树。 diff --git a/docs/components/449-resource-gauge.md b/docs/components/449-resource-gauge.md new file mode 100644 index 0000000..47b9336 --- /dev/null +++ b/docs/components/449-resource-gauge.md @@ -0,0 +1,38 @@ +# 449 ResourceGauge · 资源仪表 + +## 用途 + +展示 CPU、内存与磁盘使用量和阈值状态。 + +## 最小示例 + +```go +readings := []mujica.ResourceReading{{Name: "CPU", Used: 45, Total: 100}, {Name: "Memory", Used: 6.4, Total: 8, Unit: "GB"}, {Name: "Disk", Used: 470, Total: 500, Unit: "GB"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ResourceGauge(c, readings, mujica.ResourceGaugeOptions{}).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Warn 默认 0.7,Critical 默认 0.9,须 0 < Warn < Critical < 1;Height 默认 150 DIP;Status、Error 控制加载与失败;Name 必填,Total 为有限正数,Used 在 0 到 Total 内。 + +## 状态 + +正常、偏高、危险、空资源、加载、失败、父级禁用。 + +## 事件 + +Changed() 表示请求重试;调用方更新 readings。 + +## 键盘操作 + +Tab 聚焦仪表;方向键读取数值与阈值文字。 + +## 限制 + +资源采样与容量换算由调用方完成。 diff --git a/docs/components/450-system-monitor.md b/docs/components/450-system-monitor.md new file mode 100644 index 0000000..71bce85 --- /dev/null +++ b/docs/components/450-system-monitor.md @@ -0,0 +1,39 @@ +# 450 SystemMonitor · 系统监视器 + +## 用途 + +在同一时间轴上组合多资源折线,展示最新采样值。 + +## 最小示例 + +```go +times := []time.Time{time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC), time.Date(2026, 10, 5, 9, 0, 5, 0, time.UTC)} +metrics := []mujica.MonitorMetric{{Name: "CPU", Unit: "%", Samples: []float64{42, 51}}, {Name: "Memory", Unit: "GB", Samples: []float64{3.2, 3.4}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.SystemMonitor(c, times, metrics, mujica.SystemMonitorOptions{}).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Height 为单图高度,默认 110 DIP;Status、Error 控制加载与失败;每个 MonitorMetric.Name 必填,Samples 与 times 等长。 + +## 状态 + +实时采样、空资源、加载、失败、父级禁用。 + +## 事件 + +Changed() 表示请求重试。 + +## 键盘操作 + +Tab 到图例及图;方向键读取采样点;Home、End 到边界。 + +## 限制 + +采样由调用方提供;更新采样提交新切片;NaN 表示缺测。 diff --git a/docs/components/451-refresh-interval-selector.md b/docs/components/451-refresh-interval-selector.md new file mode 100644 index 0000000..5dd56da --- /dev/null +++ b/docs/components/451-refresh-interval-selector.md @@ -0,0 +1,42 @@ +# 451 RefreshIntervalSelector · 刷新间隔选择 + +## 用途 + +选择自动刷新间隔,报告手动与定时刷新请求。 + +## 最小示例 + +```go +interval := 30 * time.Second +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.RefreshIntervalSelector(c, &interval, mujica.RefreshIntervalSelectorOptions{}) + if r.Refresh { + fmt.Println("refresh") + } + if r.Changed { + fmt.Println("interval", interval) + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Intervals 默认提供 5、10、30 秒、1、5 分钟;0 表示关闭;选项须为正整数秒;Refreshing 暂停计时,Disabled 禁用。 + +## 状态 + +关闭自动刷新、自动刷新、刷新中、禁用。 + +## 事件 + +Refresh 表示请求刷新;Changed 报告间隔变化。 + +## 键盘操作 + +Tab 到选择器与按钮;方向键选择间隔;Enter 激活。 + +## 限制 + +调用方收到 Refresh 后执行加载并设置 Refreshing。 diff --git a/docs/components/452-dashboard-filter-bar.md b/docs/components/452-dashboard-filter-bar.md new file mode 100644 index 0000000..b5f3cf5 --- /dev/null +++ b/docs/components/452-dashboard-filter-bar.md @@ -0,0 +1,39 @@ +# 452 DashboardFilterBar · 仪表盘过滤栏 + +## 用途 + +编辑时间范围、环境和标签,并支持清除。 + +## 最小示例 + +```go +var filters mujica.DashboardFilters +opts := mujica.DashboardFilterBarOptions{Envs: []string{"production", "staging"}, Tags: []string{"api", "db"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.DashboardFilterBar(c, &filters, opts).Changed() { + fmt.Println("filters changed") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Ranges 默认 15 分钟、1 小时、1 天、7 天;Env 与 Tags 来自选项;Range 为 0 使用调用方默认;Disabled 禁用。 + +## 状态 + +默认过滤、已选择、已清除、禁用。 + +## 事件 + +Changed() 报告过滤或清除。 + +## 键盘操作 + +Tab 遍历控件;方向键选择;Space 切换标签;Escape 关闭弹层。 + +## 限制 + +过滤请求由调用方执行;选中值须存在于提供的选项中。 diff --git a/docs/components/453-json-viewer.md b/docs/components/453-json-viewer.md new file mode 100644 index 0000000..5abd3ce --- /dev/null +++ b/docs/components/453-json-viewer.md @@ -0,0 +1,40 @@ +# 453 JsonViewer · JSON 查看器 + +## 用途 + +显示 JSON 树、折叠节点、复制路径并搜索键和值。 + +## 最小示例 + +```go +data := `{"server":{"port":8080},"ready":true}` +var state mujica.JsonViewerState +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.JsonViewer(c, data, &state, mujica.JsonViewerOptions{}) + if r.Copied != "" { + fmt.Println("path copied") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +state 必填;Height 默认 360 DIP;Expanded 首次展开所有节点;Query 为搜索文本,Current 为匹配索引。 + +## 状态 + +展开、折叠、搜索匹配、无匹配、解析失败、父级禁用。 + +## 事件 + +Copied 为写入剪贴板的路径。 + +## 键盘操作 + +Tab 到搜索、复制和树;上下移动;左右展开折叠;Enter 切换节点。 + +## 限制 + +JSONPath 使用点号、数组索引和带引号的键;解析结果按数据变化缓存。 diff --git a/docs/components/454-json-editor.md b/docs/components/454-json-editor.md new file mode 100644 index 0000000..2bb8043 --- /dev/null +++ b/docs/components/454-json-editor.md @@ -0,0 +1,39 @@ +# 454 JsonEditor · JSON 编辑器 + +## 用途 + +编辑 JSON、格式化并显示解析错误行列与上下文。 + +## 最小示例 + +```go +text := `{"port":8080,"ready":true}` +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.JsonEditor(c, &text, mujica.JsonEditorOptions{}) + if r.Changed { + fmt.Println("valid", r.Valid) + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Label 默认 JSON;MinHeight 默认 160,MaxHeight 默认 400 DIP;Disabled 禁用;text 必填。 + +## 状态 + +有效 JSON、解析失败、错误行列定位、禁用。 + +## 事件 + +Changed 报告文本变化;Valid 为解析结果;Line、Column 为从 1 开始的错误位置。 + +## 键盘操作 + +Tab 到格式化和文本框;标准文本编辑与剪贴板快捷键。 + +## 限制 + +编辑单个 JSON 值;格式化使用两个空格缩进。 diff --git a/docs/components/455-schema-tree.md b/docs/components/455-schema-tree.md new file mode 100644 index 0000000..8eedc87 --- /dev/null +++ b/docs/components/455-schema-tree.md @@ -0,0 +1,40 @@ +# 455 SchemaTree · 数据库结构树 + +## 用途 + +显示数据库、表、视图、列和索引树。 + +## 最小示例 + +```go +roots := []mujica.SchemaNode{{Name: "app", Children: []mujica.SchemaNode{{Name: "users", Kind: mujica.SchemaTable, Children: []mujica.SchemaNode{{Name: "id", Kind: mujica.SchemaColumn, Detail: "bigint"}, {Name: "users_pk", Kind: mujica.SchemaIndex, Detail: "(id)"}}}}}} +var state mujica.SchemaTreeState +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.SchemaTree(c, &state, roots, mujica.SchemaTreeOptions{}).Changed() { + path, _ := state.Selected() + fmt.Println("selected", path) + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +state 必填;Height 默认 360 DIP;Name 必填,兄弟名称唯一;Kind 使用枚举,Detail 为类型说明。 + +## 状态 + +展开、折叠、选择、空结构、父级禁用。 + +## 事件 + +Changed() 报告选择变化;state.Selected() 返回路径。 + +## 键盘操作 + +Tab 进入树;上下选择;左右展开折叠。 + +## 限制 + +路径以斜线分隔;节点名称须保持路径唯一;更新结构提交新切片。 diff --git a/docs/components/456-api-request-builder.md b/docs/components/456-api-request-builder.md new file mode 100644 index 0000000..90b2de9 --- /dev/null +++ b/docs/components/456-api-request-builder.md @@ -0,0 +1,42 @@ +# 456 ApiRequestBuilder · API 请求构建器 + +## 用途 + +编辑方法、URL、参数、请求头和正文,报告发送请求。 + +## 最小示例 + +```go +request := mujica.ApiRequest{Method: "POST", URL: "https://example.com/api", Headers: []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ApiRequestBuilder(c, &request, mujica.ApiRequestBuilderOptions{}) + if r.Send { + fmt.Println("send", request.Method) + } + if r.Changed { + fmt.Println("request changed") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +Sending 防止重复发送;Disabled 禁用;Method 默认为 GET;URL 须为 HTTP 或 HTTPS;启用且键非空的参数进入预览。 + +## 状态 + +空地址、有效地址、无效地址、发送中、禁用。 + +## 事件 + +Send 表示请求发送;Changed 为编辑变化。 + +## 键盘操作 + +Tab 遍历控件;URL 框 Enter 发送;左右切换标签页。 + +## 限制 + +网络请求由调用方执行;支持 GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。 diff --git a/docs/components/457-response-viewer.md b/docs/components/457-response-viewer.md new file mode 100644 index 0000000..e90b164 --- /dev/null +++ b/docs/components/457-response-viewer.md @@ -0,0 +1,38 @@ +# 457 ResponseViewer · 响应查看器 + +## 用途 + +显示状态码、耗时、大小、JSON 或文本正文与响应头。 + +## 最小示例 + +```go +response := &mujica.ApiResponse{Status: 200, Duration: 182 * time.Millisecond, Size: 32, Body: `{"ready":true}`, Headers: []mujica.KeyValue{{Key: "Content-Type", Value: "application/json"}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ResponseViewer(c, response, mujica.ResponseViewerOptions{}).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +resp 为 nil 时显示等待;Status、Error 控制请求状态;Height 默认 320 DIP;HTTP 状态码须在 100 到 599;Size 为非负字节数。 + +## 状态 + +等待请求、加载、失败、JSON 正文、文本正文、空正文、空响应头、父级禁用。 + +## 事件 + +Changed() 表示重试。 + +## 键盘操作 + +Tab 到标签页;左右切换正文与响应头;JSON 树沿用查看器键盘操作。 + +## 限制 + +响应来自调用方;正文为有效 JSON 时使用树视图;其余正文使用文本。 diff --git a/docs/components/458-key-value-input.md b/docs/components/458-key-value-input.md new file mode 100644 index 0000000..46acde6 --- /dev/null +++ b/docs/components/458-key-value-input.md @@ -0,0 +1,38 @@ +# 458 KeyValueInput · 键值对输入 + +## 用途 + +编辑键值对、切换启用状态并增删行。 + +## 最小示例 + +```go +rows := []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.KeyValueInput(c, &rows, mujica.KeyValueInputOptions{}).Changed() { + fmt.Println("rows", len(rows)) + } +} +ui.Render(view, 720, 480, 1) +``` + +## 参数 + +KeyPlaceholder、ValuePlaceholder 默认内置文案;Label 为控件名称;MaxHeight 默认 320 DIP;Disabled 禁用;rows 必填。 + +## 状态 + +空集合、启用行、停用行、禁用。 + +## 事件 + +Changed() 报告编辑、启用切换或增删。 + +## 键盘操作 + +Tab 到各字段及按钮;Space 切换启用;Enter 激活增删。 + +## 限制 + +行顺序保持输入顺序;大量行采用虚拟化。 diff --git a/example_devtools_test.go b/example_devtools_test.go new file mode 100644 index 0000000..937de0f --- /dev/null +++ b/example_devtools_test.go @@ -0,0 +1,218 @@ +package mujica_test + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func ExampleStatCard() { + value := "12,480" + opts := mujica.StatCardOptions{Label: "Requests", Change: 0.12, HasChange: true, Trend: []float64{3, 5, 4, 8}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.StatCard(c, value, opts).Changed() { + fmt.Println("retry") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleAlertList() { + alerts := []mujica.AlertItem{{ID: "cpu", Title: "CPU usage high", Level: mujica.AlertWarning, Source: "worker", At: time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC)}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.AlertList(c, alerts, mujica.AlertListOptions{}) + if r.Ack != "" { + fmt.Println("ack", r.Ack) + } + if r.Silence != "" { + fmt.Println("silence", r.Silence) + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleIncidentCard() { + incident := mujica.Incident{Title: "API latency", Status: mujica.IncidentMonitoring, Impact: mujica.ImpactMinor, Updates: []mujica.IncidentUpdate{{Status: mujica.IncidentIdentified, Text: "Slow query located"}, {Status: mujica.IncidentMonitoring, Text: "Recovery observed"}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IncidentCard(c, incident) + } + ui.Render(view, 720, 480, 1) +} + +func ExampleUptimeBar() { + days := []mujica.UptimeDay{{Date: mujica.Date{Year: 2026, Month: 10, Day: 1}, Uptime: 1}, {Date: mujica.Date{Year: 2026, Month: 10, Day: 2}, Uptime: 0.91, Note: "Recovery"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.UptimeBar(c, days, mujica.UptimeBarOptions{Frame: mujica.ChartFrame{Label: "API uptime"}}) + if r.Changed() { + fmt.Println("day", r.Point) + } + if r.Retried() { + fmt.Println("retry") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleServiceStatus() { + services := []mujica.ServiceItem{{Name: "API", Health: mujica.ServiceOperational}, {Name: "Search", Health: mujica.ServiceDegraded, Note: "Slow queries"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ServiceStatus(c, services, mujica.ServiceStatusOptions{}) + } + ui.Render(view, 720, 480, 1) +} + +func ExampleLogStream() { + lines := []mujica.LogLine{{Level: mujica.LogInfo, Text: "server ready"}, {Level: mujica.LogWarn, Text: "slow query"}} + var state mujica.LogStreamState + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.LogStream(c, lines, &state, mujica.LogStreamOptions{}).Changed() { + fmt.Println("filter changed") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleTraceWaterfall() { + spans := []mujica.TraceSpan{{ID: "root", Name: "GET /api", Service: "gateway", Duration: 200 * time.Millisecond}, {ID: "db", Parent: "root", Name: "Query", Service: "database", Start: 20 * time.Millisecond, Duration: 80 * time.Millisecond}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.TraceWaterfall(c, spans, mujica.TraceWaterfallOptions{}).Changed() { + fmt.Println("span selected") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleResourceGauge() { + readings := []mujica.ResourceReading{{Name: "CPU", Used: 45, Total: 100}, {Name: "Memory", Used: 6.4, Total: 8, Unit: "GB"}, {Name: "Disk", Used: 470, Total: 500, Unit: "GB"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ResourceGauge(c, readings, mujica.ResourceGaugeOptions{}).Changed() { + fmt.Println("retry") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleSystemMonitor() { + times := []time.Time{time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC), time.Date(2026, 10, 5, 9, 0, 5, 0, time.UTC)} + metrics := []mujica.MonitorMetric{{Name: "CPU", Unit: "%", Samples: []float64{42, 51}}, {Name: "Memory", Unit: "GB", Samples: []float64{3.2, 3.4}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.SystemMonitor(c, times, metrics, mujica.SystemMonitorOptions{}).Changed() { + fmt.Println("retry") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleRefreshIntervalSelector() { + interval := 30 * time.Second + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.RefreshIntervalSelector(c, &interval, mujica.RefreshIntervalSelectorOptions{}) + if r.Refresh { + fmt.Println("refresh") + } + if r.Changed { + fmt.Println("interval", interval) + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleDashboardFilterBar() { + var filters mujica.DashboardFilters + opts := mujica.DashboardFilterBarOptions{Envs: []string{"production", "staging"}, Tags: []string{"api", "db"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.DashboardFilterBar(c, &filters, opts).Changed() { + fmt.Println("filters changed") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleJsonViewer() { + data := `{"server":{"port":8080},"ready":true}` + var state mujica.JsonViewerState + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.JsonViewer(c, data, &state, mujica.JsonViewerOptions{}) + if r.Copied != "" { + fmt.Println("path copied") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleJsonEditor() { + text := `{"port":8080,"ready":true}` + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.JsonEditor(c, &text, mujica.JsonEditorOptions{}) + if r.Changed { + fmt.Println("valid", r.Valid) + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleSchemaTree() { + roots := []mujica.SchemaNode{{Name: "app", Children: []mujica.SchemaNode{{Name: "users", Kind: mujica.SchemaTable, Children: []mujica.SchemaNode{{Name: "id", Kind: mujica.SchemaColumn, Detail: "bigint"}, {Name: "users_pk", Kind: mujica.SchemaIndex, Detail: "(id)"}}}}}} + var state mujica.SchemaTreeState + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.SchemaTree(c, &state, roots, mujica.SchemaTreeOptions{}).Changed() { + path, _ := state.Selected() + fmt.Println("selected", path) + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleApiRequestBuilder() { + request := mujica.ApiRequest{Method: "POST", URL: "https://example.com/api", Headers: []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ApiRequestBuilder(c, &request, mujica.ApiRequestBuilderOptions{}) + if r.Send { + fmt.Println("send", request.Method) + } + if r.Changed { + fmt.Println("request changed") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleResponseViewer() { + response := &mujica.ApiResponse{Status: 200, Duration: 182 * time.Millisecond, Size: 32, Body: `{"ready":true}`, Headers: []mujica.KeyValue{{Key: "Content-Type", Value: "application/json"}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ResponseViewer(c, response, mujica.ResponseViewerOptions{}).Changed() { + fmt.Println("retry") + } + } + ui.Render(view, 720, 480, 1) +} + +func ExampleKeyValueInput() { + rows := []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.KeyValueInput(c, &rows, mujica.KeyValueInputOptions{}).Changed() { + fmt.Println("rows", len(rows)) + } + } + ui.Render(view, 720, 480, 1) +} diff --git a/examples/gallery/pages_devtools.go b/examples/gallery/pages_devtools.go index bd2c03b..0469143 100644 --- a/examples/gallery/pages_devtools.go +++ b/examples/gallery/pages_devtools.go @@ -1,3 +1,23 @@ package main -var devtoolsPages = []page{} +const devCategory = "Dashboards & Dev Tools" + +var devtoolsPages = []page{ + {ID: "442", Name: "StatCard", ZhName: "统计卡片", Category: devCategory, Demo: devStatCardDemo, Code: devStatCardCode, Keys: "Tab 聚焦趋势或重试;方向键读取数据;Enter 激活重试。"}, + {ID: "443", Name: "AlertList", ZhName: "告警列表", Category: devCategory, Demo: devAlertListDemo, Code: devAlertListCode, Keys: "Tab 聚焦按钮;Enter 或 Space 激活。"}, + {ID: "444", Name: "IncidentCard", ZhName: "事件卡片", Category: devCategory, Demo: devIncidentCardDemo, Code: devIncidentCardCode, Keys: "展示内容随调用方更新。"}, + {ID: "445", Name: "UptimeBar", ZhName: "可用性条", Category: devCategory, Demo: devUptimeBarDemo, Code: devUptimeBarCode, Keys: "Tab 聚焦图;方向键逐日移动;Home、End 到边界;Escape 清除读取。"}, + {ID: "446", Name: "ServiceStatus", ZhName: "服务状态", Category: devCategory, Demo: devServiceStatusDemo, Code: devServiceStatusCode, Keys: "滚动列表浏览服务。"}, + {ID: "447", Name: "LogStream", ZhName: "日志流", Category: devCategory, Demo: devLogStreamDemo, Code: devLogStreamCode, Keys: "Tab 聚焦暂停和级别;方向键切换级别;Space 激活暂停。"}, + {ID: "448", Name: "TraceWaterfall", ZhName: "调用链瀑布图", Category: devCategory, Demo: devTraceWaterfallDemo, Code: devTraceWaterfallCode, Keys: "Tab 聚焦跨度;上下方向键移动;Enter 读取详情。"}, + {ID: "449", Name: "ResourceGauge", ZhName: "资源仪表", Category: devCategory, Demo: devResourceGaugeDemo, Code: devResourceGaugeCode, Keys: "Tab 聚焦仪表;方向键读取数值与阈值文字。"}, + {ID: "450", Name: "SystemMonitor", ZhName: "系统监视器", Category: devCategory, Demo: devSystemMonitorDemo, Code: devSystemMonitorCode, Keys: "Tab 到图例及图;方向键读取采样点;Home、End 到边界。"}, + {ID: "451", Name: "RefreshIntervalSelector", ZhName: "刷新间隔选择", Category: devCategory, Demo: devRefreshIntervalSelectorDemo, Code: devRefreshIntervalSelectorCode, Keys: "Tab 到选择器与按钮;方向键选择间隔;Enter 激活。"}, + {ID: "452", Name: "DashboardFilterBar", ZhName: "仪表盘过滤栏", Category: devCategory, Demo: devDashboardFilterBarDemo, Code: devDashboardFilterBarCode, Keys: "Tab 遍历控件;方向键选择;Space 切换标签;Escape 关闭弹层。"}, + {ID: "453", Name: "JsonViewer", ZhName: "JSON 查看器", Category: devCategory, Demo: devJsonViewerDemo, Code: devJsonViewerCode, Keys: "Tab 到搜索、复制和树;上下移动;左右展开折叠;Enter 切换节点。"}, + {ID: "454", Name: "JsonEditor", ZhName: "JSON 编辑器", Category: devCategory, Demo: devJsonEditorDemo, Code: devJsonEditorCode, Keys: "Tab 到格式化和文本框;标准文本编辑与剪贴板快捷键。"}, + {ID: "455", Name: "SchemaTree", ZhName: "数据库结构树", Category: devCategory, Demo: devSchemaTreeDemo, Code: devSchemaTreeCode, Keys: "Tab 进入树;上下选择;左右展开折叠。"}, + {ID: "456", Name: "ApiRequestBuilder", ZhName: "API 请求构建器", Category: devCategory, Demo: devApiRequestBuilderDemo, Code: devApiRequestBuilderCode, Keys: "Tab 遍历控件;URL 框 Enter 发送;左右切换标签页。"}, + {ID: "457", Name: "ResponseViewer", ZhName: "响应查看器", Category: devCategory, Demo: devResponseViewerDemo, Code: devResponseViewerCode, Keys: "Tab 到标签页;左右切换正文与响应头;JSON 树沿用查看器键盘操作。"}, + {ID: "458", Name: "KeyValueInput", ZhName: "键值对输入", Category: devCategory, Demo: devKeyValueInputDemo, Code: devKeyValueInputCode, Keys: "Tab 到各字段及按钮;Space 切换启用;Enter 激活增删。"}, +} diff --git a/examples/gallery/pages_devtools_code.go b/examples/gallery/pages_devtools_code.go new file mode 100644 index 0000000..1e33ea5 --- /dev/null +++ b/examples/gallery/pages_devtools_code.go @@ -0,0 +1,175 @@ +package main + +const devStatCardCode = `value := "12,480" +opts := mujica.StatCardOptions{Label: "Requests", Change: 0.12, HasChange: true, Trend: []float64{3, 5, 4, 8}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.StatCard(c, value, opts).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1)` + +const devAlertListCode = `alerts := []mujica.AlertItem{{ID: "cpu", Title: "CPU usage high", Level: mujica.AlertWarning, Source: "worker", At: time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC)}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.AlertList(c, alerts, mujica.AlertListOptions{}) + if r.Ack != "" { + fmt.Println("ack", r.Ack) + } + if r.Silence != "" { + fmt.Println("silence", r.Silence) + } +} +ui.Render(view, 720, 480, 1)` + +const devIncidentCardCode = `incident := mujica.Incident{Title: "API latency", Status: mujica.IncidentMonitoring, Impact: mujica.ImpactMinor, Updates: []mujica.IncidentUpdate{{Status: mujica.IncidentIdentified, Text: "Slow query located"}, {Status: mujica.IncidentMonitoring, Text: "Recovery observed"}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IncidentCard(c, incident) +} +ui.Render(view, 720, 480, 1)` + +const devUptimeBarCode = `days := []mujica.UptimeDay{{Date: mujica.Date{Year: 2026, Month: 10, Day: 1}, Uptime: 1}, {Date: mujica.Date{Year: 2026, Month: 10, Day: 2}, Uptime: 0.91, Note: "Recovery"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.UptimeBar(c, days, mujica.UptimeBarOptions{Frame: mujica.ChartFrame{Label: "API uptime"}}) + if r.Changed() { + fmt.Println("day", r.Point) + } + if r.Retried() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1)` + +const devServiceStatusCode = `services := []mujica.ServiceItem{{Name: "API", Health: mujica.ServiceOperational}, {Name: "Search", Health: mujica.ServiceDegraded, Note: "Slow queries"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ServiceStatus(c, services, mujica.ServiceStatusOptions{}) +} +ui.Render(view, 720, 480, 1)` + +const devLogStreamCode = `lines := []mujica.LogLine{{Level: mujica.LogInfo, Text: "server ready"}, {Level: mujica.LogWarn, Text: "slow query"}} +var state mujica.LogStreamState +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.LogStream(c, lines, &state, mujica.LogStreamOptions{}).Changed() { + fmt.Println("filter changed") + } +} +ui.Render(view, 720, 480, 1)` + +const devTraceWaterfallCode = `spans := []mujica.TraceSpan{{ID: "root", Name: "GET /api", Service: "gateway", Duration: 200 * time.Millisecond}, {ID: "db", Parent: "root", Name: "Query", Service: "database", Start: 20 * time.Millisecond, Duration: 80 * time.Millisecond}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.TraceWaterfall(c, spans, mujica.TraceWaterfallOptions{}).Changed() { + fmt.Println("span selected") + } +} +ui.Render(view, 720, 480, 1)` + +const devResourceGaugeCode = `readings := []mujica.ResourceReading{{Name: "CPU", Used: 45, Total: 100}, {Name: "Memory", Used: 6.4, Total: 8, Unit: "GB"}, {Name: "Disk", Used: 470, Total: 500, Unit: "GB"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ResourceGauge(c, readings, mujica.ResourceGaugeOptions{}).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1)` + +const devSystemMonitorCode = `times := []time.Time{time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC), time.Date(2026, 10, 5, 9, 0, 5, 0, time.UTC)} +metrics := []mujica.MonitorMetric{{Name: "CPU", Unit: "%", Samples: []float64{42, 51}}, {Name: "Memory", Unit: "GB", Samples: []float64{3.2, 3.4}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.SystemMonitor(c, times, metrics, mujica.SystemMonitorOptions{}).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1)` + +const devRefreshIntervalSelectorCode = `interval := 30 * time.Second +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.RefreshIntervalSelector(c, &interval, mujica.RefreshIntervalSelectorOptions{}) + if r.Refresh { + fmt.Println("refresh") + } + if r.Changed { + fmt.Println("interval", interval) + } +} +ui.Render(view, 720, 480, 1)` + +const devDashboardFilterBarCode = `var filters mujica.DashboardFilters +opts := mujica.DashboardFilterBarOptions{Envs: []string{"production", "staging"}, Tags: []string{"api", "db"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.DashboardFilterBar(c, &filters, opts).Changed() { + fmt.Println("filters changed") + } +} +ui.Render(view, 720, 480, 1)` + +const devJsonViewerCode = `data := ` + "`" + `{"server":{"port":8080},"ready":true}` + "`" + ` +var state mujica.JsonViewerState +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.JsonViewer(c, data, &state, mujica.JsonViewerOptions{}) + if r.Copied != "" { + fmt.Println("path copied") + } +} +ui.Render(view, 720, 480, 1)` + +const devJsonEditorCode = `text := ` + "`" + `{"port":8080,"ready":true}` + "`" + ` +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.JsonEditor(c, &text, mujica.JsonEditorOptions{}) + if r.Changed { + fmt.Println("valid", r.Valid) + } +} +ui.Render(view, 720, 480, 1)` + +const devSchemaTreeCode = `roots := []mujica.SchemaNode{{Name: "app", Children: []mujica.SchemaNode{{Name: "users", Kind: mujica.SchemaTable, Children: []mujica.SchemaNode{{Name: "id", Kind: mujica.SchemaColumn, Detail: "bigint"}, {Name: "users_pk", Kind: mujica.SchemaIndex, Detail: "(id)"}}}}}} +var state mujica.SchemaTreeState +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.SchemaTree(c, &state, roots, mujica.SchemaTreeOptions{}).Changed() { + path, _ := state.Selected() + fmt.Println("selected", path) + } +} +ui.Render(view, 720, 480, 1)` + +const devApiRequestBuilderCode = `request := mujica.ApiRequest{Method: "POST", URL: "https://example.com/api", Headers: []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ApiRequestBuilder(c, &request, mujica.ApiRequestBuilderOptions{}) + if r.Send { + fmt.Println("send", request.Method) + } + if r.Changed { + fmt.Println("request changed") + } +} +ui.Render(view, 720, 480, 1)` + +const devResponseViewerCode = `response := &mujica.ApiResponse{Status: 200, Duration: 182 * time.Millisecond, Size: 32, Body: ` + "`" + `{"ready":true}` + "`" + `, Headers: []mujica.KeyValue{{Key: "Content-Type", Value: "application/json"}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ResponseViewer(c, response, mujica.ResponseViewerOptions{}).Changed() { + fmt.Println("retry") + } +} +ui.Render(view, 720, 480, 1)` + +const devKeyValueInputCode = `rows := []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.KeyValueInput(c, &rows, mujica.KeyValueInputOptions{}).Changed() { + fmt.Println("rows", len(rows)) + } +} +ui.Render(view, 720, 480, 1)` diff --git a/examples/gallery/pages_devtools_editors.go b/examples/gallery/pages_devtools_editors.go new file mode 100644 index 0000000..7d3b74b --- /dev/null +++ b/examples/gallery/pages_devtools_editors.go @@ -0,0 +1,133 @@ +package main + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func devJsonViewerDemo(c *ui.Context, log func(string)) { + dtSection(c, "JsonViewer", func() { + s := devControls(c, "453", log, false) + type state struct { + tree mujica.JsonViewerState + invalid bool + } + st := ui.Local(c.Root(), "453", func() state { return state{} }) + if mujica.Checkbox(c, &st.invalid, "Invalid JSON", mujica.CheckboxOptions{}).Changed() { + log("JSON validity changed") + } + devPreview(c, s, func() { + data := `{"server":{"port":8080,"hosts":["east","west"]},"ready":true}` + if st.invalid { + data = `{"port":}` + } + if s.empty { + data = `{}` + } + if mujica.JsonViewer(c, data, &st.tree, mujica.JsonViewerOptions{}).Copied != "" { + log("path copied") + } + }) + }) +} + +func devJsonEditorDemo(c *ui.Context, log func(string)) { + dtSection(c, "JsonEditor", func() { + s := devControls(c, "454", log, false) + text := ui.Local(c.Root(), "454", func() string { return `{"port":8080,"ready":true}` }) + if mujica.Button(c, "Invalid sample", mujica.ButtonOptions{}).Clicked() { + *text = "{\n \"port\": [1,2,]\n}" + log("invalid sample loaded") + } + devPreview(c, s, func() { + r := mujica.JsonEditor(c, text, mujica.JsonEditorOptions{}) + if r.Changed { + log(fmt.Sprintf("JSON edited; valid=%t", r.Valid)) + } + }) + }) +} + +func devSchemaTreeDemo(c *ui.Context, log func(string)) { + dtSection(c, "SchemaTree", func() { + s := devControls(c, "455", log, false) + type state struct { + tree mujica.SchemaTreeState + roots []mujica.SchemaNode + } + st := ui.Local(c.Root(), "455", func() state { + return state{roots: []mujica.SchemaNode{{Name: "app", Children: []mujica.SchemaNode{{Name: "users", Kind: mujica.SchemaTable, Children: []mujica.SchemaNode{{Name: "id", Kind: mujica.SchemaColumn, Detail: "bigint"}, {Name: "name", Kind: mujica.SchemaColumn, Detail: "text"}, {Name: "users_pk", Kind: mujica.SchemaIndex, Detail: "(id)"}}}, {Name: "active_users", Kind: mujica.SchemaView}}}}} + }) + devPreview(c, s, func() { + roots := st.roots + if s.empty { + roots = nil + } + if mujica.SchemaTree(c, &st.tree, roots, mujica.SchemaTreeOptions{}).Changed() { + log("schema node selected") + } + }) + }) +} + +func devApiRequestBuilderDemo(c *ui.Context, log func(string)) { + dtSection(c, "ApiRequestBuilder", func() { + s := devControls(c, "456", log, false) + request := ui.Local(c.Root(), "456", func() mujica.ApiRequest { + return mujica.ApiRequest{URL: "https://example.com/api", Headers: []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}}} + }) + sending := ui.Local(c.Root(), "456-sending", func() bool { return false }) + if mujica.Checkbox(c, sending, "Sending", mujica.CheckboxOptions{}).Changed() { + log("send state changed") + } + devPreview(c, s, func() { + r := mujica.ApiRequestBuilder(c, request, mujica.ApiRequestBuilderOptions{Sending: *sending}) + if r.Send { + log("send requested") + } + if r.Changed { + log("request edited") + } + }) + }) +} + +func devResponseViewerDemo(c *ui.Context, log func(string)) { + dtSection(c, "ResponseViewer", func() { + s := devControls(c, "457", log, true) + text := ui.Local(c.Root(), "457", func() bool { return false }) + if mujica.Checkbox(c, text, "Text body", mujica.CheckboxOptions{}).Changed() { + log("response format changed") + } + devPreview(c, s, func() { + resp := &mujica.ApiResponse{Status: 200, Duration: 182 * time.Millisecond, Size: 2048, Body: `{"ready":true,"requests":1248}`, Headers: []mujica.KeyValue{{Key: "Content-Type", Value: "application/json"}, {Key: "X-Trace", Value: "demo"}}} + if *text { + resp.Body = "Response received successfully." + } + if s.empty { + resp = nil + } + if mujica.ResponseViewer(c, resp, mujica.ResponseViewerOptions{Height: 260, Status: s.status, Error: "Connection refused"}).Changed() { + log("retry requested") + } + }) + }) +} + +func devKeyValueInputDemo(c *ui.Context, log func(string)) { + dtSection(c, "KeyValueInput", func() { + s := devControls(c, "458", log, false) + rows := ui.Local(c.Root(), "458", func() []mujica.KeyValue { + return []mujica.KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}, {Key: "debug", Value: "true"}} + }) + devPreview(c, s, func() { + if mujica.KeyValueInput(c, rows, mujica.KeyValueInputOptions{Label: "Headers"}).Changed() { + log("pairs edited") + } + }) + }) +} diff --git a/examples/gallery/pages_devtools_status.go b/examples/gallery/pages_devtools_status.go new file mode 100644 index 0000000..ee44e1c --- /dev/null +++ b/examples/gallery/pages_devtools_status.go @@ -0,0 +1,173 @@ +package main + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +type devDemoSettings struct { + disabled bool + status mujica.DataStatus + empty bool +} + +func devControls(c *ui.Context, id string, log func(string), states bool) *devDemoSettings { + s := ui.Local(c.Root(), id+"-controls", func() devDemoSettings { return devDemoSettings{} }) + dtControls(c, func() { + if mujica.Checkbox(c, &s.disabled, "Disabled", mujica.CheckboxOptions{}).Changed() { + log("disabled changed") + } + switch id { + case "451", "454", "456", "458": + default: + if mujica.Checkbox(c, &s.empty, "Empty data", mujica.CheckboxOptions{}).Changed() { + log("data state changed") + } + } + if states { + options := []mujica.SelectOption[mujica.DataStatus]{{Value: mujica.DataReady, Label: "Ready"}, {Value: mujica.DataLoading, Label: "Loading"}, {Value: mujica.DataFailed, Label: "Failed"}} + if mujica.Select(c, &s.status, options, mujica.SelectOptions{Label: "Status"}).Changed() { + log("status changed") + } + } + }) + return s +} + +func devPreview(c *ui.Context, s *devDemoSettings, build func()) { + ui.Column(c).Disabled(s.disabled).Gap(8).Children(build) +} + +func devStatCardDemo(c *ui.Context, log func(string)) { + dtSection(c, "StatCard", func() { + s := devControls(c, "442", log, true) + lower := ui.Local(c.Root(), "442-lower", func() bool { return false }) + if mujica.Checkbox(c, lower, "Lower is better", mujica.CheckboxOptions{}).Changed() { + log("change direction updated") + } + devPreview(c, s, func() { + value := "12,480" + trend := []float64{3, 5, 4, 8, 7, 9} + if s.empty { + value, trend = "—", nil + } + if mujica.StatCard(c, value, mujica.StatCardOptions{Label: "Requests", Change: 0.12, HasChange: true, LowerIsBetter: *lower, Trend: trend, Status: s.status, Error: "Source unreachable"}).Changed() { + log("retry requested") + } + }) + }) +} + +func devAlertListDemo(c *ui.Context, log func(string)) { + dtSection(c, "AlertList", func() { + s := devControls(c, "443", log, false) + alerts := ui.Local(c.Root(), "443", func() []mujica.AlertItem { + return []mujica.AlertItem{{ID: "cpu", Title: "CPU usage high", Level: mujica.AlertWarning, Source: "worker", At: time.Now()}, {ID: "api", Title: "API unavailable", Level: mujica.AlertCritical, Source: "gateway", At: time.Now()}} + }) + devPreview(c, s, func() { + shown := *alerts + if s.empty { + shown = nil + } + r := mujica.AlertList(c, shown, mujica.AlertListOptions{}) + for i := range *alerts { + if r.Ack == (*alerts)[i].ID { + (*alerts)[i].Acked = true + log("acknowledged " + r.Ack) + } + if r.Silence == (*alerts)[i].ID { + (*alerts)[i].Silence = c.Now().Add(time.Hour) + log("silenced " + r.Silence) + } + } + }) + }) +} + +func devIncidentCardDemo(c *ui.Context, log func(string)) { + dtSection(c, "IncidentCard", func() { + s := devControls(c, "444", log, false) + status := ui.Local(c.Root(), "444", func() mujica.IncidentStatus { return mujica.IncidentMonitoring }) + choices := []mujica.SelectOption[mujica.IncidentStatus]{{Value: mujica.IncidentInvestigating, Label: "Investigating"}, {Value: mujica.IncidentIdentified, Label: "Identified"}, {Value: mujica.IncidentMonitoring, Label: "Monitoring"}, {Value: mujica.IncidentResolved, Label: "Resolved"}} + if mujica.Select(c, status, choices, mujica.SelectOptions{Label: "Incident status"}).Changed() { + log("incident status changed") + } + devPreview(c, s, func() { + updates := []mujica.IncidentUpdate{{Status: mujica.IncidentIdentified, Text: "Slow query located"}, {Status: mujica.IncidentMonitoring, Text: "Recovery observed"}} + if s.empty { + updates = nil + } + mujica.IncidentCard(c, mujica.Incident{Title: "API latency", Status: *status, Impact: mujica.ImpactMinor, Updates: updates}) + }) + }) +} + +func devUptimeBarDemo(c *ui.Context, log func(string)) { + dtSection(c, "UptimeBar", func() { + s := devControls(c, "445", log, true) + days := ui.Local(c.Root(), "445", func() []mujica.UptimeDay { + out := make([]mujica.UptimeDay, 30) + start := mujica.Date{Year: 2026, Month: 10, Day: 1} + for i := range out { + out[i] = mujica.UptimeDay{Date: start.AddDays(i), Uptime: 1} + } + out[7].Uptime, out[7].Note = 0.91, "2 h outage" + out[12].Uptime = 0.98 + return out + }) + devPreview(c, s, func() { + data := *days + if s.empty { + data = nil + } + r := mujica.UptimeBar(c, data, mujica.UptimeBarOptions{Frame: mujica.ChartFrame{Label: "API uptime", Status: s.status, Error: "Source unreachable"}}) + if r.Changed() { + log(fmt.Sprintf("day %d", r.Point)) + } + if r.Retried() { + log("retry requested") + } + }) + }) +} + +func devServiceStatusDemo(c *ui.Context, log func(string)) { + dtSection(c, "ServiceStatus", func() { + s := devControls(c, "446", log, false) + health := ui.Local(c.Root(), "446", func() mujica.ServiceHealth { return mujica.ServiceDegraded }) + choices := []mujica.SelectOption[mujica.ServiceHealth]{{Value: mujica.ServiceOperational, Label: "Operational"}, {Value: mujica.ServiceDegraded, Label: "Degraded"}, {Value: mujica.ServiceOutage, Label: "Outage"}} + if mujica.Select(c, health, choices, mujica.SelectOptions{Label: "Search health"}).Changed() { + log("service health changed") + } + devPreview(c, s, func() { + data := []mujica.ServiceItem{{Name: "API", Health: mujica.ServiceOperational}, {Name: "Search", Health: *health, Note: "Search cluster"}} + if s.empty { + data = nil + } + mujica.ServiceStatus(c, data, mujica.ServiceStatusOptions{}) + }) + }) +} + +func devResourceGaugeDemo(c *ui.Context, log func(string)) { + dtSection(c, "ResourceGauge", func() { + s := devControls(c, "449", log, true) + used := ui.Local(c.Root(), "449", func() float64 { return 45 }) + if mujica.NumberInput(c, used, mujica.NumberInputOptions{Min: 0, Max: 100, Step: 5, Label: "CPU usage"}).Changed() { + log("resource reading changed") + } + devPreview(c, s, func() { + data := []mujica.ResourceReading{{Name: "CPU", Used: *used, Total: 100}, {Name: "Memory", Used: 6.4, Total: 8, Unit: "GB"}, {Name: "Disk", Used: 470, Total: 500, Unit: "GB"}} + if s.empty { + data = nil + } + if mujica.ResourceGauge(c, data, mujica.ResourceGaugeOptions{Status: s.status, Error: "Source unreachable"}).Changed() { + log("retry requested") + } + }) + }) +} diff --git a/examples/gallery/pages_devtools_streams.go b/examples/gallery/pages_devtools_streams.go new file mode 100644 index 0000000..99fc0b8 --- /dev/null +++ b/examples/gallery/pages_devtools_streams.go @@ -0,0 +1,127 @@ +package main + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func devLogStreamDemo(c *ui.Context, log func(string)) { + dtSection(c, "LogStream", func() { + s := devControls(c, "447", log, false) + type state struct { + lines []mujica.LogLine + stream mujica.LogStreamState + } + st := ui.Local(c.Root(), "447", func() state { + return state{lines: []mujica.LogLine{{Level: mujica.LogInfo, Text: "server ready"}, {Level: mujica.LogWarn, Text: "slow query"}}} + }) + if mujica.Button(c, "Append line", mujica.ButtonOptions{}).Clicked() { + st.lines = append(st.lines, mujica.LogLine{Time: c.Now(), Level: mujica.LogInfo, Text: fmt.Sprintf("request %d completed", len(st.lines))}) + log("line appended") + } + devPreview(c, s, func() { + data := st.lines + if s.empty { + data = nil + } + if mujica.LogStream(c, data, &st.stream, mujica.LogStreamOptions{}).Changed() { + log("pause or level changed") + } + }) + }) +} + +func devTraceWaterfallDemo(c *ui.Context, log func(string)) { + dtSection(c, "TraceWaterfall", func() { + s := devControls(c, "448", log, false) + spans := ui.Local(c.Root(), "448", func() []mujica.TraceSpan { + return []mujica.TraceSpan{{ID: "root", Name: "GET /api", Service: "gateway", Duration: 320 * time.Millisecond}, {ID: "db", Parent: "root", Name: "Query", Service: "database", Start: 40 * time.Millisecond, Duration: 90 * time.Millisecond}, {ID: "pay", Parent: "root", Name: "Charge", Service: "payments", Start: 230 * time.Millisecond, Duration: 80 * time.Millisecond, Error: true}} + }) + devPreview(c, s, func() { + data := *spans + if s.empty { + data = nil + } + if mujica.TraceWaterfall(c, data, mujica.TraceWaterfallOptions{}).Changed() { + log("span selected") + } + }) + }) +} + +func devSystemMonitorDemo(c *ui.Context, log func(string)) { + dtSection(c, "SystemMonitor", func() { + s := devControls(c, "450", log, true) + type state struct { + times []time.Time + metrics []mujica.MonitorMetric + } + st := ui.Local(c.Root(), "450", func() state { + out := state{metrics: []mujica.MonitorMetric{{Name: "CPU", Unit: "%"}, {Name: "Memory", Unit: "GB"}}} + for i := range 20 { + out.times = append(out.times, time.Date(2026, 10, 5, 9, 0, i*5, 0, time.UTC)) + out.metrics[0].Samples = append(out.metrics[0].Samples, 40+float64(i%7)*3) + out.metrics[1].Samples = append(out.metrics[1].Samples, 3.2+float64(i)*0.02) + } + return out + }) + if mujica.Button(c, "Append sample", mujica.ButtonOptions{}).Clicked() { + st.times = append(append([]time.Time(nil), st.times...), st.times[len(st.times)-1].Add(5*time.Second)) + for i := range st.metrics { + last := st.metrics[i].Samples[len(st.metrics[i].Samples)-1] + st.metrics[i].Samples = append(append([]float64(nil), st.metrics[i].Samples...), last+0.1) + } + log("sample appended") + } + devPreview(c, s, func() { + times, metrics := st.times, st.metrics + if s.empty { + times, metrics = nil, nil + } + if mujica.SystemMonitor(c, times, metrics, mujica.SystemMonitorOptions{Status: s.status, Error: "Agent offline"}).Changed() { + log("retry requested") + } + }) + }) +} + +func devRefreshIntervalSelectorDemo(c *ui.Context, log func(string)) { + dtSection(c, "RefreshIntervalSelector", func() { + s := devControls(c, "451", log, false) + interval := ui.Local(c.Root(), "451", func() time.Duration { return 0 }) + refreshing := ui.Local(c.Root(), "451-refreshing", func() bool { return false }) + if mujica.Checkbox(c, refreshing, "Refreshing", mujica.CheckboxOptions{}).Changed() { + log("refresh state changed") + } + devPreview(c, s, func() { + r := mujica.RefreshIntervalSelector(c, interval, mujica.RefreshIntervalSelectorOptions{Refreshing: *refreshing}) + if r.Refresh { + log("refresh requested") + } + if r.Changed { + log("interval changed") + } + }) + }) +} + +func devDashboardFilterBarDemo(c *ui.Context, log func(string)) { + dtSection(c, "DashboardFilterBar", func() { + s := devControls(c, "452", log, false) + filters := ui.Local(c.Root(), "452", func() mujica.DashboardFilters { return mujica.DashboardFilters{} }) + devPreview(c, s, func() { + opts := mujica.DashboardFilterBarOptions{Envs: []string{"production", "staging"}, Tags: []string{"api", "db", "web"}} + if s.empty { + opts.Envs, opts.Tags = nil, nil + *filters = mujica.DashboardFilters{} + } + if mujica.DashboardFilterBar(c, filters, opts).Changed() { + log("filters changed") + } + }) + }) +} diff --git a/examples/gallery/pages_devtools_test.go b/examples/gallery/pages_devtools_test.go new file mode 100644 index 0000000..c010b2b --- /dev/null +++ b/examples/gallery/pages_devtools_test.go @@ -0,0 +1,87 @@ +package main + +import ( + "testing" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func devPageTester(p page, mode mujica.Mode, events *[]string) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + mujica.Use(c, mujica.Settings{Mode: mode}) + ui.Column(c).Padding(16).Children(func() { p.Demo(c, func(s string) { *events = append(*events, s) }) }) + }, 1000, 800) +} + +func TestDevtoolsPagesControlsAndThemes(t *testing.T) { + if len(devtoolsPages) != 17 { + t.Fatalf("pages=%d", len(devtoolsPages)) + } + for _, p := range devtoolsPages { + t.Run(p.Name, func(t *testing.T) { + for _, mode := range []mujica.Mode{mujica.Light, mujica.Dark} { + var events []string + tt := devPageTester(p, mode, &events) + if p.Category != "Dashboards & Dev Tools" || p.Code == "" || p.Keys == "" { + t.Fatal("page metadata") + } + if err := tt.Click("Disabled"); err != nil { + t.Fatal(err) + } + if len(events) != 1 || events[0] != "disabled changed" { + t.Fatalf("control events %v", events) + } + if err := tt.Click("Disabled"); err != nil { + t.Fatal(err) + } + if _, ok := tt.Find("Empty data"); ok { + if err := tt.Click("Empty data"); err != nil { + t.Fatal(err) + } + if events[len(events)-1] != "data state changed" { + t.Fatal("empty event") + } + if err := tt.Click("Empty data"); err != nil { + t.Fatal(err) + } + } + } + }) + } +} + +func TestDevtoolsDemoEvents(t *testing.T) { + cases := []struct{ id, label, event string }{ + {"443", "Acknowledge", "acknowledged cpu"}, + {"447", "Append line", "line appended"}, + {"450", "Append sample", "sample appended"}, + {"451", "Refresh", "refresh requested"}, + {"453", "Copy path", "path copied"}, + {"454", "Format", "JSON edited; valid=true"}, + {"456", "Send", "send requested"}, + {"458", "Add row", "pairs edited"}, + } + for _, tc := range cases { + t.Run(tc.id, func(t *testing.T) { + for _, p := range devtoolsPages { + if p.ID != tc.id { + continue + } + var events []string + tt := devPageTester(p, mujica.Light, &events) + if err := tt.Click(tc.label); err != nil { + t.Fatal(err) + } + found := false + for _, event := range events { + found = found || event == tc.event + } + if !found { + t.Fatalf("events %v want %s", events, tc.event) + } + } + }) + } +} diff --git a/incident_card.go b/incident_card.go index 25b6281..4491f8f 100644 --- a/incident_card.go +++ b/incident_card.go @@ -10,7 +10,7 @@ import ( "mujicaui/theme" ) -// IncidentStatus is where an incident stands. The zero value is IncidentInvestigating. +// IncidentStatus tracks investigation; zero means IncidentInvestigating. type IncidentStatus int const ( @@ -20,7 +20,7 @@ const ( IncidentResolved ) -// IncidentImpact is how badly users are affected. The zero value is ImpactNone. +// IncidentImpact tracks severity; zero means ImpactNone. type IncidentImpact int const ( @@ -75,8 +75,8 @@ func IncidentCard(c *ui.Context, inc Incident) *ui.Element { agentCaption(c, fmt.Sprintf(msg(c, "incident_card.started"), inc.Started.Format("2006-01-02 15:04"))) } }) - for i, up := range inc.Updates { - incidentUpdate(c, k, up, i == len(inc.Updates)-1) + if len(inc.Updates) > 0 { + agentRows(c, len(inc.Updates), func(i int) { incidentUpdate(c, k, inc.Updates[i], i == len(inc.Updates)-1) }).Shrink(1).MaxHeight(320) } }) return card @@ -94,7 +94,7 @@ func incidentUpdate(c *ui.Context, k theme.Tokens, up IncidentUpdate, last bool) } p.FillPath(internal.Diamond(cx, cy, 9), k.Ornament) }) - ui.Column(c).Grow(1).Shrink(1).Gap(u / 2).Padding(0, 0, u*2, 0).Children(func() { + ui.Column(c).Grow(1).Shrink(1).Gap(u/2).Padding(0, 0, u*2, 0).Children(func() { ui.Row(c).Gap(u * 2).Children(func() { ui.Text(c, incidentStatusWord(c, up.Status)).FontWeight(600) if !up.At.IsZero() { diff --git a/incident_card_test.go b/incident_card_test.go index 98fa5f1..f352a00 100644 --- a/incident_card_test.go +++ b/incident_card_test.go @@ -53,3 +53,14 @@ func TestIncidentCardSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { IncidentCard(c, incidentSample()) }) }) } + +func TestIncidentCardManyUpdates(t *testing.T) { + inc := Incident{Title: "Recovery", Updates: make([]IncidentUpdate, 100000)} + for i := range inc.Updates { + inc.Updates[i].Text = "Update received" + } + tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); IncidentCard(c, inc) }, 560, 500) + if n := len(tt.Texts()); n > 500 { + t.Fatalf("built %d texts for 100000 updates", n) + } +} diff --git a/json_editor.go b/json_editor.go index eb66d78..0265b0b 100644 --- a/json_editor.go +++ b/json_editor.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "log/slog" "strings" @@ -19,7 +20,7 @@ import ( type JsonEditorOptions struct { // Label names the editor; empty uses "JSON". Label string - // MinHeight and MaxHeight bound the text; zero means 160 and 400. + // MinHeight and MaxHeight default to 160 and 400 DIPs. MinHeight, MaxHeight float32 Disabled bool } @@ -30,7 +31,7 @@ type JsonEditorResult struct { Changed bool // Valid reports *text parses as one JSON value. Valid bool - // Line and Column locate a parse error, 1-based; 0 when valid. + // Line and Column locate errors; valid documents use zero. Line, Column int } @@ -40,7 +41,7 @@ type jsonEditorCheck struct { line, column int } -// JsonEditor edits JSON text, formats it and points at the line and column of a parse error. +// JsonEditor edits and formats JSON with error locations. func JsonEditor(c *ui.Context, text *string, opts JsonEditorOptions) JsonEditorResult { if text == nil || opts.MinHeight < 0 || opts.MaxHeight < 0 { panic("mujica: JsonEditor needs text and non-negative heights") @@ -56,6 +57,9 @@ func JsonEditor(c *ui.Context, text *string, opts JsonEditorOptions) JsonEditorR if maxH == 0 { maxH = 400 } + if minH > maxH { + panic("mujica: JsonEditor MinHeight exceeds MaxHeight") + } k := Tokens(c) u := Density(c).Unit() var r JsonEditorResult @@ -101,11 +105,20 @@ func jsonEditorValidate(chk *jsonEditorCheck, text string) { } chk.src, chk.err, chk.line, chk.column = text, "", 0, 0 dec := json.NewDecoder(strings.NewReader(text)) + dec.UseNumber() var v any err := dec.Decode(&v) - offset := dec.InputOffset() - if err == nil && dec.More() { - err = errors.New("unexpected data after the value") + var offset int64 + if err == nil { + rest := text[dec.InputOffset():] + offset = dec.InputOffset() + int64(len(rest)-len(strings.TrimLeft(rest, " \t\r\n"))) + 1 + var trailing any + if next := dec.Decode(&trailing); next != io.EOF { + err = errors.New("unexpected data after the value") + if next != nil { + err = next + } + } } if err == nil { return @@ -120,7 +133,9 @@ func jsonEditorValidate(chk *jsonEditorCheck, text string) { case strings.TrimSpace(text) == "": err, offset = errors.New("empty document"), 0 default: - offset = int64(len(text)) + if offset == 0 { + offset = int64(len(text)) + } } before := text[:min(int(offset), len(text))] chk.line = strings.Count(before, "\n") + 1 @@ -129,7 +144,7 @@ func jsonEditorValidate(chk *jsonEditorCheck, text string) { chk.err = fmt.Sprintf("%d:%d %v", chk.line, chk.column, err) } -// jsonEditorExcerpt shows the error line with a caret under the column. +// jsonEditorExcerpt shows an error line and column caret. func jsonEditorExcerpt(c *ui.Context, line string, n, col int) { k := Tokens(c) u := Density(c).Unit() diff --git a/json_editor_test.go b/json_editor_test.go index ebed49e..f4f0933 100644 --- a/json_editor_test.go +++ b/json_editor_test.go @@ -73,3 +73,63 @@ func TestJsonEditorSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { JsonEditor(c, &text, JsonEditorOptions{MinHeight: 120}) }) }) } + +func TestJsonEditorRejectsTrailingDelimiter(t *testing.T) { + for _, text := range []string{"{} ]", "1 }", "true ]"} { + var r JsonEditorResult + jsonEditorTester(&text, JsonEditorOptions{}, &r) + if r.Valid { + t.Fatalf("accepted trailing delimiter: %q", text) + } + } +} + +func TestJsonEditorHeightBounds(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("reversed heights accepted") + } + }() + text := "{}" + var r JsonEditorResult + jsonEditorTester(&text, JsonEditorOptions{MinHeight: 300, MaxHeight: 100}, &r) +} + +func TestJsonEditorAncestorDisabledFormat(t *testing.T) { + text := `{"a":1}` + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { JsonEditor(c, &text, JsonEditorOptions{}) }) + }, 600, 460) + tt.Key(0, ui.KeyTab) + disabled = true + tt.Key(0, ui.KeyEnter) + _ = tt.Click("JSON") + tt.Type("x") + if text != `{"a":1}` { + t.Fatal("disabled editor changed") + } +} + +func TestJsonEditorTrailingValueLocation(t *testing.T) { + text := "{}\n{}" + var result JsonEditorResult + jsonEditorTester(&text, JsonEditorOptions{}, &result) + if result.Valid || result.Line != 2 || result.Column != 1 { + t.Fatalf("trailing value at %d:%d", result.Line, result.Column) + } +} + +func TestJsonEditorPreservesLargeNumbers(t *testing.T) { + text := `{"value":1e309}` + var result JsonEditorResult + tt := jsonEditorTester(&text, JsonEditorOptions{}, &result) + if !result.Valid { + t.Fatal("valid large JSON number rejected") + } + _ = tt.Click("Format") + if text != "{\n \"value\": 1e309\n}" { + t.Fatal("large number changed by formatting") + } +} diff --git a/json_viewer.go b/json_viewer.go index 0a847c6..5ac4d89 100644 --- a/json_viewer.go +++ b/json_viewer.go @@ -45,7 +45,7 @@ type JsonViewerResult struct { Copied string } -// JsonViewer shows JSON as a tree with folding, path copy and search, virtualized. +// JsonViewer shows searchable JSON trees with folding and path copying. func JsonViewer(c *ui.Context, data string, s *JsonViewerState, opts JsonViewerOptions) JsonViewerResult { if s == nil || opts.Height < 0 { panic("mujica: JsonViewer needs a state and Height >= 0") @@ -66,6 +66,11 @@ func JsonViewer(c *ui.Context, data string, s *JsonViewerState, opts JsonViewerO u := Density(c).Unit() var r JsonViewerResult r.Element = codePanel(c).Height(h) + if r.Element.IsDisabled() { + for _, key := range []ui.Key{ui.KeyDown, ui.KeyUp, ui.KeyHome, ui.KeyEnd, ui.KeyPageDown, ui.KeyPageUp} { + r.Element.Shortcut(0, key) + } + } r.Element.Children(func() { if s.err != nil { ui.Row(c).Padding(u * 3).Gap(u * 2).TextColor(Tokens(c).Danger).Role(ui.RoleStatus).Children(func() { @@ -103,10 +108,10 @@ func JsonViewer(c *ui.Context, data string, s *JsonViewerState, opts JsonViewerO s.list.Selected = &at s.list.Label = func(i int) string { return s.tree.nodes[s.rows[i]].label() } list := codeRows(c, &s.list, len(s.rows), func(i int) { jsonViewerRow(c, s, s.rows[i]) }) - if at != was && at >= 0 { + if !list.IsDisabled() && at != was && at >= 0 { s.sel = s.rows[at] } - if at >= 0 && at < len(s.rows) { + if !list.IsDisabled() && at >= 0 && at < len(s.rows) { n := s.tree.nodes[s.rows[at]] if n.container() && (list.Shortcut(0, ui.KeyRight) && !s.open[n.path] || list.Shortcut(0, ui.KeyLeft) && s.open[n.path] || list.Submitted()) { s.open[n.path] = !s.open[n.path] @@ -117,7 +122,7 @@ func JsonViewer(c *ui.Context, data string, s *JsonViewerState, opts JsonViewerO return r } -// jsonViewerSearch finds matches and opens their ancestors when the query changes. +// jsonViewerSearch finds matches and opens their ancestors. func jsonViewerSearch(s *JsonViewerState) { if s.searched == s.Query { return @@ -142,7 +147,7 @@ func jsonViewerSearch(s *JsonViewerState) { s.stale = true } -// jsonViewerRows lists the visible nodes, skipping closed subtrees, when anything changed. +// jsonViewerRows rebuilds visible indices when nodes change. func jsonViewerRows(s *JsonViewerState) { if !s.stale { return @@ -167,7 +172,7 @@ func jsonViewerRows(s *JsonViewerState) { } } -// jsonViewerRow shows one node: fold mark, key, and value or size. +// jsonViewerRow shows disclosure, key and value. func jsonViewerRow(c *ui.Context, s *JsonViewerState, i int) { k := Tokens(c) n := s.tree.nodes[i] @@ -180,7 +185,7 @@ func jsonViewerRow(c *ui.Context, s *JsonViewerState, i int) { } mark.Role(ui.RoleDisclosure).Label(n.path).Cursor(ui.CursorPointer) mark.Children(func() { ui.Icon(c, icons.Must(name)).Size(14, 14).TextColor(k.TextMuted) }) - if mark.Clicked() { + if !mark.IsDisabled() && mark.Clicked() { s.open[n.path], s.stale = !s.open[n.path], true } } diff --git a/json_viewer_test.go b/json_viewer_test.go index 8ba2c81..5f9fc68 100644 --- a/json_viewer_test.go +++ b/json_viewer_test.go @@ -117,3 +117,48 @@ func TestJsonViewerSnapshot(t *testing.T) { }) }) } + +func TestJsonViewerAncestorDisabledKeepsTreeAndClipboard(t *testing.T) { + data := jsonSample + var s JsonViewerState + disabled := false + copied := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if JsonViewer(c, data, &s, JsonViewerOptions{}).Copied != "" { + copied++ + } + }) + }, 640, 460) + if err := tt.Click("ball: { 3 items }"); err != nil { + t.Fatal(err) + } + disabled = true + tt.Key(0, ui.KeyRight) + _ = tt.Click("$.ball") + _ = tt.Click("Copy path") + if s.open["$.ball"] || copied != 0 || tt.Clipboard() != "" { + t.Fatal("disabled tree input") + } +} + +func TestJsonViewerAncestorDisabledSelection(t *testing.T) { + var state JsonViewerState + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + JsonViewer(c, `{"a":1,"b":2}`, &state, JsonViewerOptions{}) + }) + }, 640, 460) + if err := tt.Click("a: 1"); err != nil { + t.Fatal(err) + } + before := state.sel + disabled = true + tt.Key(0, ui.KeyDown) + if state.sel != before { + t.Fatal("disabled JSON selection changed") + } +} diff --git a/key_value_input.go b/key_value_input.go index 7a0beca..3c94780 100644 --- a/key_value_input.go +++ b/key_value_input.go @@ -3,13 +3,14 @@ package mujica import ( "fmt" "log/slog" + "slices" "github.com/egoist/mygo/ui" "mujicaui/icons" ) -// KeyValue is one editable pair; disabled pairs are kept but not used. +// KeyValue holds an editable pair and enable flag. type KeyValue struct { Key, Value string Enabled bool @@ -22,11 +23,13 @@ type KeyValueInputOptions struct { // Label names the editor for assistive technology. Label string Disabled bool + // MaxHeight caps the rows; zero means 320. + MaxHeight float32 } -// KeyValueInput edits rows of pairs with an enable switch, add and remove. +// KeyValueInput edits virtualized pairs with enable, add and remove. func KeyValueInput(c *ui.Context, rows *[]KeyValue, opts KeyValueInputOptions) ChoiceResult { - if rows == nil { + if rows == nil || opts.MaxHeight < 0 { panic("mujica: KeyValueInput needs rows") } kp, vp := opts.KeyPlaceholder, opts.ValuePlaceholder @@ -40,9 +43,17 @@ func KeyValueInput(c *ui.Context, rows *[]KeyValue, opts KeyValueInputOptions) C var r ChoiceResult r.Element = ui.Column(c).Shrink(0).Gap(u * 2).Disabled(opts.Disabled).Label(opts.Label) locked := r.Element.IsDisabled() + if locked { + copy := slices.Clone(*rows) + rows = © + } + maxH := opts.MaxHeight + if maxH == 0 { + maxH = 320 + } remove := -1 r.Element.Children(func() { - for i := range *rows { + agentRows(c, len(*rows), func(i int) { kv := &(*rows)[i] ui.Row(c).Key(i).Gap(u * 2).AlignItems(ui.Center).Children(func() { name := fmt.Sprintf(msg(c, "key_value_input.row"), i+1) @@ -60,7 +71,7 @@ func KeyValueInput(c *ui.Context, rows *[]KeyValue, opts KeyValueInputOptions) C remove = i } }) - } + }).Shrink(1).MaxHeight(maxH) if Button(c, msg(c, "key_value_input.add"), ButtonOptions{Variant: Ghost, Icon: icons.Must("plus"), Disabled: locked}).AlignSelf(ui.Start).Clicked() && !locked { *rows = append(*rows, KeyValue{Enabled: true}) r.changed = true diff --git a/key_value_input_test.go b/key_value_input_test.go index c100bb8..491cdc6 100644 --- a/key_value_input_test.go +++ b/key_value_input_test.go @@ -63,3 +63,29 @@ func TestKeyValueInputSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { KeyValueInput(c, &rows, KeyValueInputOptions{}) }) }) } + +func TestKeyValueInputManyRows(t *testing.T) { + rows := make([]KeyValue, 100000) + for i := range rows { + rows[i] = KeyValue{Key: "item", Value: "value", Enabled: true} + } + n := 0 + tt := kvTester(&rows, KeyValueInputOptions{}, &n) + if got := len(tt.Texts()); got > 500 { + t.Fatalf("built %d texts for 100000 rows", got) + } +} + +func TestKeyValueInputAncestorDisabledAndEmpty(t *testing.T) { + var rows []KeyValue + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(true).Children(func() { KeyValueInput(c, &rows, KeyValueInputOptions{}) }) + }, 600, 300) + _ = tt.Click("Add row") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if len(rows) != 0 { + t.Fatal("disabled empty editor changed") + } +} diff --git a/log_stream.go b/log_stream.go index 0e188a5..77f725d 100644 --- a/log_stream.go +++ b/log_stream.go @@ -14,12 +14,14 @@ type LogStreamState struct { Paused bool // MinLevel hides lines below it. MinLevel LogLevel - // frozen is the line count at pause; lines after it wait. + // frozen holds the paused line count; later lines wait. frozen int shown []int scanned int min LogLevel rows ui.ListState + src []LogLine + started bool } // LogStreamOptions configure a LogStream. @@ -29,7 +31,7 @@ type LogStreamOptions struct { Disabled bool } -// LogStream shows live ANSI log lines that follow the end, pause and filter by level, virtualized. +// LogStream shows virtualized ANSI logs with pause and level filters. func LogStream(c *ui.Context, lines []LogLine, s *LogStreamState, opts LogStreamOptions) ChoiceResult { if s == nil { panic("mujica: LogStream needs a state") @@ -44,6 +46,9 @@ func LogStream(c *ui.Context, lines []LogLine, s *LogStreamState, opts LogStream var r ChoiceResult r.Element = codePanel(c).Disabled(opts.Disabled).Height(h) locked := r.Element.IsDisabled() + if !s.started { + s.frozen, s.started = len(lines), true + } r.Element.Children(func() { codeHeader(c, func() { was := s.Paused @@ -89,9 +94,9 @@ func LogStream(c *ui.Context, lines []LogLine, s *LogStreamState, opts LogStream return r } -// logStreamFilter extends the shown lines, or redoes them after a filter change. +// logStreamFilter updates filtered indices when lines or filters change. func logStreamFilter(lines []LogLine, s *LogStreamState) { - if s.min != s.MinLevel || s.scanned > len(lines) { + if s.min != s.MinLevel || s.scanned > len(lines) || len(lines) > 0 && (len(s.src) == 0 || &lines[0] != &s.src[0]) { s.min, s.scanned, s.shown = s.MinLevel, 0, s.shown[:0] } for i := s.scanned; i < len(lines); i++ { @@ -103,7 +108,7 @@ func logStreamFilter(lines []LogLine, s *LogStreamState) { s.shown = append(s.shown, i) } } - s.scanned = len(lines) + s.scanned, s.src = len(lines), lines } // logStreamRow shows one line: time, level word and ANSI text. @@ -111,7 +116,7 @@ func logStreamRow(c *ui.Context, l LogLine) { k := Tokens(c) d := Density(c) col := [...]ui.Color{k.TextMuted, k.Info, k.Warning, k.Danger}[l.Level] - ui.Row(c).MinHeight(d.ControlHeight() - 8).Padding(0, d.Unit()*3).Gap(d.Unit() * 3).AlignItems(ui.Center).Children(func() { + ui.Row(c).MinHeight(d.ControlHeight()).Padding(0, d.Unit()*3).Gap(d.Unit() * 3).AlignItems(ui.Center).Children(func() { if !l.Time.IsZero() { codeMono(c, l.Time.Format("15:04:05.000")).TextColor(k.TextMuted).Shrink(0) } diff --git a/log_stream_test.go b/log_stream_test.go index 782c686..f8f1adb 100644 --- a/log_stream_test.go +++ b/log_stream_test.go @@ -95,3 +95,50 @@ func TestLogStreamSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { LogStream(c, lines, &s, LogStreamOptions{Height: 220}) }) }) } + +func TestLogStreamAncestorDisabledAndEmptyFilter(t *testing.T) { + lines := []LogLine{{Level: LogInfo, Text: "ready"}} + var s LogStreamState + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { LogStream(c, lines, &s, LogStreamOptions{}) }) + }, 700, 400) + _ = tt.Click("WARN") + if !tt.HasText("No log lines") || s.MinLevel != LogWarn { + t.Fatal("empty level filter") + } + disabled = true + tt.Key(0, ui.KeyRight) + _ = tt.Click("Pause") + if s.MinLevel != LogWarn || s.Paused { + t.Fatal("disabled stream changed") + } +} + +func TestLogStreamReplacedLevels(t *testing.T) { + lines := []LogLine{{Level: LogInfo, Text: "ready"}} + s := LogStreamState{MinLevel: LogWarn} + changes := 0 + tt := logStreamTester(&lines, &s, LogStreamOptions{}, &changes) + lines = []LogLine{{Level: LogError, Text: "failed"}} + tt.Frame() + if !tt.HasText("failed") || tt.HasText("No log lines") { + t.Fatal("replaced log levels retained old filter") + } +} + +func TestLogStreamInitiallyPausedKeepsCurrentLines(t *testing.T) { + lines := logStreamLines(4) + state := LogStreamState{Paused: true} + changes := 0 + tt := logStreamTester(&lines, &state, LogStreamOptions{}, &changes) + if !tt.HasText("line 3") { + t.Fatal("initial pause hid existing lines") + } + lines = append(lines, LogLine{Level: LogInfo, Text: "later"}) + tt.Frame() + if tt.HasText("later") || !tt.HasText("1 new lines") { + t.Fatal("initial pause did not freeze lines") + } +} diff --git a/messages_devtools.go b/messages_devtools.go index 1b8a9e1..b1caaeb 100644 --- a/messages_devtools.go +++ b/messages_devtools.go @@ -8,8 +8,9 @@ func init() { "key_value_input.remove": {"Remove row %d", "删除第 %d 行"}, "key_value_input.add": {"Add row", "添加一行"}, - "stat_card.change": {"Change %s", "变化 %s"}, - "devtools.ago": {"%s ago", "%s 前"}, + "system_monitor.empty": {"No resources", "没有资源"}, + "stat_card.change": {"Change %s", "变化 %s"}, + "devtools.ago": {"%s ago", "%s 前"}, "alert_list.info": {"Info", "提示"}, "alert_list.warning": {"Warning", "警告"}, @@ -43,6 +44,7 @@ func init() { "uptime_bar.down": {"Outage", "中断"}, "uptime_bar.nodata": {"No data", "无数据"}, + "resource_gauge.empty": {"No resources", "没有资源"}, "resource_gauge.normal": {"Normal", "正常"}, "resource_gauge.high": {"High", "偏高"}, "resource_gauge.critical": {"Critical", "危险"}, @@ -95,6 +97,7 @@ func init() { "schema_tree.column": {"Column", "列"}, "schema_tree.index": {"Index", "索引"}, + "api_request_builder.invalid_url": {"Enter a valid HTTP or HTTPS URL", "请输入有效的 HTTP 或 HTTPS 地址"}, "api_request_builder.method": {"Method", "方法"}, "api_request_builder.url": {"Request URL", "请求地址"}, "api_request_builder.send": {"Send", "发送"}, @@ -106,6 +109,13 @@ func init() { "api_request_builder.no_body": {"GET and HEAD requests usually carry no body.", "GET 与 HEAD 请求通常不带正文。"}, "api_request_builder.parts": {"Request parts", "请求组成"}, + "response_viewer.label": {"Response", "响应"}, + "response_viewer.none": {"Send a request to see its response", "发送请求后在此查看响应"}, + "response_viewer.body": {"Body", "正文"}, + "response_viewer.empty": {"Empty body", "正文为空"}, + "response_viewer.headers": {"Headers (%d)", "响应头(%d)"}, + "response_viewer.no_headers": {"No headers", "没有响应头"}, + "alert_list.empty": {"No alerts", "没有告警"}, }) } diff --git a/refresh_interval_selector.go b/refresh_interval_selector.go index 5839c59..af7e12a 100644 --- a/refresh_interval_selector.go +++ b/refresh_interval_selector.go @@ -12,7 +12,7 @@ import ( // RefreshIntervalSelectorOptions configure a RefreshIntervalSelector. type RefreshIntervalSelectorOptions struct { - // Intervals to offer besides Off; nil uses 5 s, 10 s, 30 s, 1 m and 5 m. + // Intervals defaults to 5s, 10s, 30s, 1m and 5m. Intervals []time.Duration // Refreshing shows the refresh in progress and holds the timer. Refreshing bool @@ -22,7 +22,7 @@ type RefreshIntervalSelectorOptions struct { // RefreshResult reports this frame's events. type RefreshResult struct { Element *ui.Element - // Refresh asks the caller to reload, by hand or because the interval elapsed. + // Refresh requests caller loading, manually or after the interval. Refresh bool // Changed reports a new interval. Changed bool @@ -32,7 +32,7 @@ type refreshState struct{ last time.Time } var refreshDefaults = []time.Duration{5 * time.Second, 10 * time.Second, 30 * time.Second, time.Minute, 5 * time.Minute} -// RefreshIntervalSelector picks an auto-refresh interval, zero for off, and refreshes by hand. +// RefreshIntervalSelector selects timed refresh intervals and reports manual requests. func RefreshIntervalSelector(c *ui.Context, interval *time.Duration, opts RefreshIntervalSelectorOptions) RefreshResult { if interval == nil { panic("mujica: RefreshIntervalSelector needs an interval") @@ -43,10 +43,12 @@ func RefreshIntervalSelector(c *ui.Context, interval *time.Duration, opts Refres } options := []SelectOption[time.Duration]{{Value: 0, Label: msg(c, "refresh_interval_selector.off")}} known := *interval == 0 + seen := map[time.Duration]bool{} for _, d := range choices { - if d < time.Second || d%time.Second != 0 { + if d < time.Second || d%time.Second != 0 || seen[d] { panic("mujica: RefreshIntervalSelector intervals must be whole seconds") } + seen[d] = true known = known || d == *interval label := fmt.Sprintf(msg(c, "refresh_interval_selector.seconds"), int(d/time.Second)) if d%time.Minute == 0 { diff --git a/refresh_interval_selector_test.go b/refresh_interval_selector_test.go index c456eb6..1d642b8 100644 --- a/refresh_interval_selector_test.go +++ b/refresh_interval_selector_test.go @@ -84,3 +84,45 @@ func TestRefreshIntervalSelectorSnapshot(t *testing.T) { }) }) } + +func TestRefreshIntervalSelectorKeyboardAncestorDisable(t *testing.T) { + interval := time.Duration(0) + disabled := false + changes, refreshes := 0, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + r := RefreshIntervalSelector(c, &interval, RefreshIntervalSelectorOptions{}) + if r.Changed { + changes++ + } + if r.Refresh { + refreshes++ + } + }) + }, 500, 400) + _ = tt.Click("Refresh interval") + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + if interval != 5*time.Second || changes != 1 { + t.Fatal("keyboard interval") + } + _ = tt.Click("Refresh interval") + disabled = true + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + if interval != 5*time.Second || changes != 1 || refreshes != 0 || tt.HasText("Every 10 s") { + t.Fatal("disabled popup remained active") + } +} + +func TestRefreshIntervalSelectorRejectsDuplicateIntervals(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("duplicate intervals accepted") + } + }() + interval := time.Duration(0) + refreshes, changes := 0, 0 + refreshTester(&interval, &RefreshIntervalSelectorOptions{Intervals: []time.Duration{time.Second, time.Second}}, &refreshes, &changes) +} diff --git a/resource_gauge.go b/resource_gauge.go index 14a6f54..f6fc08f 100644 --- a/resource_gauge.go +++ b/resource_gauge.go @@ -2,6 +2,7 @@ package mujica import ( "fmt" + "log/slog" "math" "github.com/egoist/mygo/ui" @@ -22,10 +23,15 @@ type ResourceGaugeOptions struct { Warn, Critical float64 // Height of each dial; zero means 150. Height float32 + Status DataStatus + Error string } -// ResourceGauge shows CPU, memory and disk dials with named normal, high and critical bands. -func ResourceGauge(c *ui.Context, readings []ResourceReading, opts ResourceGaugeOptions) *ui.Element { +// ResourceGauge shows resource usage with named threshold bands. +func ResourceGauge(c *ui.Context, readings []ResourceReading, opts ResourceGaugeOptions) ChoiceResult { + if opts.Status != DataReady && opts.Status != DataLoading && opts.Status != DataFailed { + panic("mujica: ResourceGauge needs a known status") + } warn, crit := opts.Warn, opts.Critical if warn == 0 { warn = 0.7 @@ -42,16 +48,23 @@ func ResourceGauge(c *ui.Context, readings []ResourceReading, opts ResourceGauge } u := Density(c).Unit() row := ui.Row(c).Wrap().Gap(u * 4).Shrink(0) + result := ChoiceResult{Element: row} row.Children(func() { + if len(readings) == 0 { + ui.Column(c).Height(h).Children(func() { + result.changed = dataPlaceholder(c, opts.Status, opts.Error, msg(c, "resource_gauge.empty"), "") + }) + return + } for i, r := range readings { - if r.Name == "" || !(r.Total > 0) || r.Used < 0 || r.Used > r.Total || math.IsNaN(r.Used) { + if r.Name == "" || !(r.Total > 0) || r.Used < 0 || r.Used > r.Total || math.IsNaN(r.Used) || math.IsInf(r.Used, 0) || math.IsInf(r.Total, 0) { panic(fmt.Sprintf("mujica: ResourceGauge reading %d needs a Name and 0 <= Used <= Total", i)) } frac := r.Used / r.Total ui.Column(c).Key(r.Name).Width(200).Gap(u).AlignItems(ui.Center).Children(func() { ui.Text(c, r.Name).FontWeight(600) - Gauge(c, frac*100, GaugeOptions{ - Frame: ChartFrame{Label: r.Name, Height: h}, Min: 0, Max: 100, Unit: "%", + gauge := Gauge(c, frac*100, GaugeOptions{ + Frame: ChartFrame{Label: r.Name, Height: h, Status: opts.Status, Error: opts.Error}, Min: 0, Max: 100, Unit: "%", Format: func(v float64) string { return fmt.Sprintf("%.0f", v) }, Segments: []GaugeSegment{ {To: warn * 100, Label: msg(c, "resource_gauge.normal"), Tone: GaugeGood}, @@ -59,11 +72,15 @@ func ResourceGauge(c *ui.Context, readings []ResourceReading, opts ResourceGauge {To: 100, Label: msg(c, "resource_gauge.critical"), Tone: GaugeDanger}, }, }) + result.changed = result.changed || gauge.Retried() if r.Unit != "" { agentCaption(c, fmt.Sprintf("%s / %s %s", sandboxNum(r.Used), sandboxNum(r.Total), r.Unit)) } }) } }) - return row + if result.changed { + slog.Debug("mujica: resource_gauge retry") + } + return result } diff --git a/resource_gauge_test.go b/resource_gauge_test.go index bc03728..38d4501 100644 --- a/resource_gauge_test.go +++ b/resource_gauge_test.go @@ -1,6 +1,7 @@ package mujica import ( + "math" "testing" "github.com/egoist/mygo/ui" @@ -54,3 +55,49 @@ func TestResourceGaugeSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { ResourceGauge(c, resourceSample, ResourceGaugeOptions{}) }) }) } + +func TestResourceGaugeRejectsInfiniteTotal(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("infinite capacity accepted") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ResourceGauge(c, []ResourceReading{{Name: "CPU", Total: math.Inf(1)}}, ResourceGaugeOptions{}) + }, 400, 300) +} + +func TestResourceGaugeEmptyState(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); ResourceGauge(c, nil, ResourceGaugeOptions{}) }, 600, 300) + if !tt.HasText("No resources") { + t.Fatal("empty resource state") + } +} + +func TestResourceGaugeLoadingErrorAndDisabledRetry(t *testing.T) { + status, disabled := DataLoading, false + retries := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if ResourceGauge(c, resourceSample[:1], ResourceGaugeOptions{Status: status, Error: "offline"}).Changed() { + retries++ + } + }) + }, 400, 300) + if !tt.HasText("Loading") { + t.Fatal("loading resource") + } + status = DataFailed + tt.Frame() + _ = tt.Click("Retry") + if retries != 1 || !tt.HasText("offline") { + t.Fatal("error retry") + } + disabled = true + tt.Key(0, ui.KeyEnter) + if retries != 1 { + t.Fatal("disabled resource retry") + } +} diff --git a/response_viewer.go b/response_viewer.go new file mode 100644 index 0000000..f5e728b --- /dev/null +++ b/response_viewer.go @@ -0,0 +1,127 @@ +package mujica + +import ( + "encoding/json" + "fmt" + "log/slog" + "net/http" + "strings" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// ApiResponse is an HTTP response the caller received. +type ApiResponse struct { + Status int + Duration time.Duration + // Size is the body size in bytes. + Size int64 + Headers []KeyValue + Body string +} + +// ResponseViewerOptions configure a ResponseViewer. +type ResponseViewerOptions struct { + // Status replaces the response while loading or failed. + Status DataStatus + Error string + // Height of the body; zero means 320. + Height float32 +} + +type responseViewerState struct { + tab int + json JsonViewerState + body string + isJSON bool +} + +// ResponseViewer shows response metadata, body and headers. +func ResponseViewer(c *ui.Context, resp *ApiResponse, opts ResponseViewerOptions) ChoiceResult { + if opts.Status != DataReady && opts.Status != DataLoading && opts.Status != DataFailed { + panic("mujica: ResponseViewer needs a known status") + } + if opts.Height < 0 || resp != nil && (resp.Status < 100 || resp.Status > 599 || resp.Size < 0 || resp.Duration < 0) { + panic("mujica: ResponseViewer needs Height >= 0, a 1xx–5xx Status and Size >= 0") + } + h := opts.Height + if h == 0 { + h = 320 + } + u := Density(c).Unit() + var r ChoiceResult + r.Element = ui.Column(c).Shrink(0).Gap(u * 3).Label(msg(c, "response_viewer.label")) + st := ui.Local(r.Element, "mujica.response", func() responseViewerState { return responseViewerState{} }) + r.Element.Children(func() { + if opts.Status != DataReady || resp == nil { + ui.Column(c).Height(h).Children(func() { + r.changed = dataPlaceholder(c, opts.Status, opts.Error, msg(c, "response_viewer.none"), "") + }) + return + } + ui.Row(c).Gap(u * 4).AlignItems(ui.Center).Role(ui.RoleStatus).Children(func() { + responseStatus(c, resp.Status) + agentCaption(c, agentDuration(resp.Duration)) + agentCaption(c, processListBytes(uint64(resp.Size))) + }) + if st.body != resp.Body { + st.body, st.isJSON = resp.Body, json.Valid([]byte(resp.Body)) + } + tabs := []Tab{ + {Label: msg(c, "response_viewer.body"), Panel: func() { + ui.Column(c).Height(h).Children(func() { + switch { + case resp.Body == "": + agentCaption(c, msg(c, "response_viewer.empty")) + case st.isJSON: + JsonViewer(c, resp.Body, &st.json, JsonViewerOptions{Height: h}) + default: + agentCode(c, "", resp.Body, h) + } + }) + }}, + {Label: fmt.Sprintf(msg(c, "response_viewer.headers"), len(resp.Headers)), Panel: func() { + ui.Column(c).Height(h).Children(func() { responseHeaders(c, resp.Headers, h) }) + }}, + } + Tabs(c, &st.tab, tabs, TabsOptions{Label: msg(c, "response_viewer.label")}) + }) + if r.changed { + slog.Debug("mujica: response_viewer retry") + } + return r +} + +// responseStatus shows "200 OK" with a severity icon and tone. +func responseStatus(c *ui.Context, code int) { + sev := SeveritySuccess + switch { + case code >= 500: + sev = SeverityError + case code >= 400: + sev = SeverityWarning + case code >= 300 || code < 200: + sev = SeverityInfo + } + text := strings.TrimSpace(fmt.Sprintf("%d %s", code, http.StatusText(code))) + devtoolsSeverity(c, sev, text) +} + +// responseHeaders lists headers as name and value rows. +func responseHeaders(c *ui.Context, headers []KeyValue, h float32) { + k := Tokens(c) + if len(headers) == 0 { + agentCaption(c, msg(c, "response_viewer.no_headers")) + return + } + agentWellRows(c, len(headers), func(i int) { + kv := headers[i] + ui.Row(c).MinHeight(Density(c).ControlHeight()).Gap(Density(c).Unit() * 3).Children(func() { + ui.Text(c, kv.Key).TextColor(k.AccentText).FontWeight(600).Width(200).Shrink(0) + ui.Text(c, kv.Value).Selectable().Grow(1).Shrink(1) + }) + }, h).Font(theme.MonoFont) +} diff --git a/response_viewer_test.go b/response_viewer_test.go new file mode 100644 index 0000000..27daf29 --- /dev/null +++ b/response_viewer_test.go @@ -0,0 +1,154 @@ +package mujica + +import ( + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func responseSample() *ApiResponse { + return &ApiResponse{Status: 201, Duration: 182 * time.Millisecond, Size: 2048, + Headers: []KeyValue{{Key: "Content-Type", Value: "application/json"}, {Key: "X-Trace", Value: "ab12"}}, + Body: `{"id":7,"hall":"east wing"}`} +} + +func responseTester(resp **ApiResponse, opts *ResponseViewerOptions, retries *int) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ResponseViewer(c, *resp, *opts).Changed() { + *retries++ + } + }, 640, 520) +} + +func TestResponseViewerJsonTextHeaders(t *testing.T) { + resp := responseSample() + opts := ResponseViewerOptions{} + n := 0 + tt := responseTester(&resp, &opts, &n) + for _, s := range []string{"201 Created", "182 ms", "2 KB", `id: 7`} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + _ = tt.Click("Headers (2)") + if !tt.HasText("X-Trace") || !tt.HasText("ab12") { + t.Fatalf("headers: %q", tt.Texts()) + } + resp = &ApiResponse{Status: 503, Body: "upstream down"} + tt.Frame() + _ = tt.Click("Body") + if !tt.HasText("503 Service Unavailable") || !tt.HasText("upstream down") { + t.Fatalf("text body: %q", tt.Texts()) + } +} + +func TestResponseViewerStates(t *testing.T) { + var resp *ApiResponse + opts := ResponseViewerOptions{} + n := 0 + tt := responseTester(&resp, &opts, &n) + if !tt.HasText("Send a request to see its response") { + t.Fatalf("none: %q", tt.Texts()) + } + opts = ResponseViewerOptions{Status: DataFailed, Error: "connection refused"} + tt.Frame() + _ = tt.Click("Retry") + if n != 1 || !tt.HasText("connection refused") { + t.Fatalf("failed: %q retries %d", tt.Texts(), n) + } + defer func() { + if recover() == nil { + t.Fatal("status 42 did not panic") + } + }() + bad := &ApiResponse{Status: 42} + responseTester(&bad, &ResponseViewerOptions{}, &n) +} + +func TestResponseViewerSnapshot(t *testing.T) { + snapshot(t, "response_viewer", 620, 360, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { + ResponseViewer(c, responseSample(), ResponseViewerOptions{Height: 240}) + }) + }) +} + +func TestResponseViewerKeyboardDisabledAndLoading(t *testing.T) { + resp := responseSample() + disabled := false + retries := 0 + opts := ResponseViewerOptions{} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if ResponseViewer(c, resp, opts).Changed() { + retries++ + } + }) + }, 640, 520) + if err := tt.Click("Body"); err != nil { + t.Fatal(err) + } + tt.Key(0, ui.KeyRight) + if !tt.HasText("X-Trace") { + t.Fatal("keyboard header selection") + } + opts.Status = DataLoading + tt.Frame() + if !tt.HasText("Loading") || tt.HasText("X-Trace") { + t.Fatal("loading state") + } + opts.Status = DataFailed + opts.Error = "offline" + disabled = true + tt.Frame() + _ = tt.Click("Retry") + tt.Key(0, ui.KeyEnter) + if retries != 0 { + t.Fatal("disabled retry") + } +} + +func TestResponseViewerRejectsUnknownDataStatus(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("unknown data status accepted") + } + }() + resp := responseSample() + n := 0 + responseTester(&resp, &ResponseViewerOptions{Status: DataStatus(99)}, &n) +} + +func TestResponseViewerEmptyBodyAndHeaders(t *testing.T) { + resp := &ApiResponse{Status: 204} + n := 0 + tt := responseTester(&resp, &ResponseViewerOptions{}, &n) + if !tt.HasText("204 No Content") || !tt.HasText("Empty body") { + t.Fatal("empty response") + } + _ = tt.Click("Headers (0)") + if !tt.HasText("No headers") { + t.Fatal("empty headers") + } +} + +func TestResponseViewerAncestorDisabledTabs(t *testing.T) { + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + ResponseViewer(c, responseSample(), ResponseViewerOptions{}) + }) + }, 640, 520) + if err := tt.Click("Body"); err != nil { + t.Fatal(err) + } + disabled = true + tt.Key(0, ui.KeyRight) + if tt.HasText("X-Trace") || !tt.HasText("id: 7") { + t.Fatal("disabled response switched tabs") + } +} diff --git a/schema_tree.go b/schema_tree.go index 0c8fed3..3dfc50c 100644 --- a/schema_tree.go +++ b/schema_tree.go @@ -10,7 +10,7 @@ import ( "mujicaui/theme" ) -// SchemaKind is what a schema node is. The zero value is SchemaDatabase. +// SchemaKind classifies nodes; zero means SchemaDatabase. type SchemaKind int const ( @@ -21,7 +21,7 @@ const ( SchemaIndex ) -// SchemaNode is one database object; Detail is a column type or index columns. +// SchemaNode describes an object; Detail holds type or index columns. type SchemaNode struct { Name string Kind SchemaKind @@ -39,7 +39,7 @@ type SchemaTreeState struct { src []SchemaNode } -// Selected returns the chosen node's path, as "shop/orders/id", and whether one is chosen. +// Selected returns the chosen path and whether it exists. func (s *SchemaTreeState) Selected() (string, bool) { if s.selected < 0 || s.selected >= s.outline.Rows() { return "", false @@ -53,7 +53,7 @@ type SchemaTreeOptions struct { Height float32 } -// SchemaTree shows databases, tables, views, columns and indexes as a keyboard tree, virtualized. +// SchemaTree shows database objects in a virtualized keyboard tree. func SchemaTree(c *ui.Context, s *SchemaTreeState, roots []SchemaNode, opts SchemaTreeOptions) ChoiceResult { if s == nil || opts.Height < 0 { panic("mujica: SchemaTree needs a state and Height >= 0") @@ -67,6 +67,19 @@ func SchemaTree(c *ui.Context, s *SchemaTreeState, roots []SchemaNode, opts Sche d := Density(c) var r ChoiceResult r.Element = codePanel(c).Height(h).Label(msg(c, "schema_tree.label")) + locked := r.Element.IsDisabled() + if locked { + copy := *s + copy.outline.Open = ui.Selection[string]{} + for path := range s.outline.Open.All() { + copy.outline.Open.Add(path) + } + s = © + for _, mods := range []ui.Modifiers{0, ui.Alt, ui.Shift} { + r.Element.Shortcut(mods, ui.KeyLeft) + r.Element.Shortcut(mods, ui.KeyRight) + } + } r.Element.Children(func() { if len(s.roots) == 0 { codeCaption(c, msg(c, "schema_tree.empty")).Padding(d.Unit() * 4) @@ -75,10 +88,10 @@ func SchemaTree(c *ui.Context, s *SchemaTreeState, roots []SchemaNode, opts Sche was := s.selected s.outline.List.Selected = &s.selected s.outline.List.Label = func(i int) string { return s.nodes[s.outline.Item(i)].Name } - restore := dataSelectTheme(c, 0) + restore := dataSelectTheme(c, theme.MinHitSize/4) e := ui.Outline(c, &s.outline, s.roots, func(p string) []string { return s.kids[p] }, func(p string) { n := s.nodes[p] - ui.Row(c).Grow(1).MinWidth(0).MinHeight(d.ControlHeight()-2*d.Unit()).Gap(d.Unit()*2).AlignItems(ui.Center). + ui.Row(c).Grow(1).MinWidth(0).MinHeight(d.ControlHeight() - 2*d.Unit()).Gap(d.Unit() * 2).AlignItems(ui.Center). Label(fmt.Sprintf("%s %s %s", schemaWord(c, n.Kind), n.Name, n.Detail)).Children(func() { sel, _ := s.Selected() codeSelectMark(c, sel == p) @@ -92,7 +105,7 @@ func SchemaTree(c *ui.Context, s *SchemaTreeState, roots []SchemaNode, opts Sche }).Grow(1) restore() internal.Ring(e, k.Focus, theme.ControlRadius) - r.changed = s.selected != was + r.changed = !locked && s.selected != was }) if r.changed { p, _ := s.Selected() @@ -134,6 +147,10 @@ func schemaIndex(s *SchemaTreeState, roots []SchemaNode) { return paths } s.roots = walk(roots, "") + if len(s.roots) == 0 { + s.outline = ui.OutlineState[string]{} + s.selected = -1 + } } func schemaBadge(k theme.Tokens, kind SchemaKind) (string, ui.Color) { diff --git a/schema_tree_test.go b/schema_tree_test.go index 2a487b1..0f55243 100644 --- a/schema_tree_test.go +++ b/schema_tree_test.go @@ -88,3 +88,61 @@ func TestSchemaTreeSnapshot(t *testing.T) { } }) } + +func TestSchemaTreeAncestorDisabled(t *testing.T) { + var s SchemaTreeState + disabled := false + changes := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if SchemaTree(c, &s, schemaSample, SchemaTreeOptions{}).Changed() { + changes++ + } + }) + }, 520, 420) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyDown) + before, _ := s.Selected() + old := changes + disabled = true + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeyDown) + if after, _ := s.Selected(); after != before || changes != old || tt.HasText("guests") { + t.Fatalf("disabled schema: before=%q after=%q events=%d old=%d texts=%q", before, after, changes, old, tt.Texts()) + } +} + +func TestSchemaTreeDisclosureHitArea(t *testing.T) { + var state SchemaTreeState + changes := 0 + tt := schemaTester(&state, schemaSample, &changes) + row, ok := tt.Find("court") + if !ok { + t.Fatal("database row missing") + } + tt.ClickAt(row.X+31, row.Y+8) + if !tt.HasText("guests") { + t.Fatal("disclosure missed 28 DIP hit area") + } +} + +func TestSchemaTreeClearsSelectionWhenEmpty(t *testing.T) { + var state SchemaTreeState + roots := schemaSample + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + SchemaTree(c, &state, roots, SchemaTreeOptions{}) + }, 520, 420) + if err := tt.Click("court"); err != nil { + t.Fatal(err) + } + if _, ok := state.Selected(); !ok { + t.Fatal("database selection missing") + } + roots = nil + tt.Frame() + if _, ok := state.Selected(); ok || !tt.HasText("No databases") { + t.Fatal("empty schema retained selection") + } +} diff --git a/service_status.go b/service_status.go index e2a9c91..95a0454 100644 --- a/service_status.go +++ b/service_status.go @@ -31,19 +31,25 @@ type ServiceStatusOptions struct { MaxHeight float32 } -// ServiceStatus lists services as operational, degraded or down, under an overall summary. +// ServiceStatus lists service health and an overall summary. func ServiceStatus(c *ui.Context, services []ServiceItem, opts ServiceStatusOptions) *ui.Element { if opts.MaxHeight < 0 { panic("mujica: ServiceStatus MaxHeight is negative") } - worst, counts := ServiceOperational, [3]int{} - for i, s := range services { - if s.Name == "" || s.Health < ServiceOperational || s.Health > ServiceOutage { - panic(fmt.Sprintf("mujica: ServiceStatus service %d needs a Name and a known Health", i)) + col := ui.Column(c).Shrink(0).Gap(Density(c).Unit() * 2) + summaryState := ui.Local(col, "mujica.services.summary", func() serviceSummary { return serviceSummary{key: "unset"} }) + if key := chartID(services); key != summaryState.key { + worst, counts := ServiceOperational, [3]int{} + for i, s := range services { + if s.Name == "" || s.Health < ServiceOperational || s.Health > ServiceOutage { + panic(fmt.Sprintf("mujica: ServiceStatus service %d needs a Name and a known Health", i)) + } + worst = max(worst, s.Health) + counts[s.Health]++ } - worst = max(worst, s.Health) - counts[s.Health]++ + summaryState.key, summaryState.worst, summaryState.counts = key, worst, counts } + worst, counts := summaryState.worst, summaryState.counts maxH := opts.MaxHeight if maxH == 0 { maxH = 360 @@ -51,9 +57,9 @@ func ServiceStatus(c *ui.Context, services []ServiceItem, opts ServiceStatusOpti k := Tokens(c) u := Density(c).Unit() summary := msg(c, [...]string{"service_status.all_ok", "service_status.some_degraded", "service_status.some_down"}[worst]) - col := ui.Column(c).Shrink(0).Gap(u * 2).Label(summary) + col.Label(summary) col.Children(func() { - ui.Row(c).Gap(u * 3).AlignItems(ui.Center).Padding(u*3).Radius(theme.CardRadius).Border(theme.BorderWidth, k.Border). + ui.Row(c).Gap(u*3).AlignItems(ui.Center).Padding(u*3).Radius(theme.CardRadius).Border(theme.BorderWidth, k.Border). Background(k.Surface).Role(ui.RoleStatus).Label(summary).Children(func() { devtoolsSeverity(c, serviceSeverity(worst), summary) ui.Box(c).Grow(1) @@ -66,7 +72,7 @@ func ServiceStatus(c *ui.Context, services []ServiceItem, opts ServiceStatusOpti agentRows(c, len(services), func(i int) { s := services[i] word := serviceWord(c, s.Health) - ui.Row(c).Key(i).Gap(u * 3).AlignItems(ui.Center).MinHeight(Density(c).ControlHeight()).Padding(u, u*3). + ui.Row(c).Key(i).Gap(u*3).AlignItems(ui.Center).MinHeight(Density(c).ControlHeight()).Padding(u, u*3). Label(s.Name + ", " + word).Children(func() { ui.Column(c).Grow(1).Shrink(1).Children(func() { ui.Text(c, s.Name).SingleLine() @@ -89,3 +95,9 @@ func serviceSeverity(h ServiceHealth) Severity { func serviceWord(c *ui.Context, h ServiceHealth) string { return msg(c, [...]string{"service_status.operational", "service_status.degraded", "service_status.outage"}[h]) } + +type serviceSummary struct { + key string + worst ServiceHealth + counts [3]int +} diff --git a/service_status_test.go b/service_status_test.go index 6d9a07b..14da4c5 100644 --- a/service_status_test.go +++ b/service_status_test.go @@ -55,3 +55,15 @@ func TestServiceStatusSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { ServiceStatus(c, servicesSample, ServiceStatusOptions{}) }) }) } + +func TestServiceStatusRejectsUnknownHealth(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("unknown service health accepted") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ServiceStatus(c, []ServiceItem{{Name: "API", Health: 99}}, ServiceStatusOptions{}) + }, 400, 300) +} diff --git a/stat_card.go b/stat_card.go index 1a5bc7c..7b9fcec 100644 --- a/stat_card.go +++ b/stat_card.go @@ -14,7 +14,7 @@ import ( // StatCardOptions configure a StatCard. Label is required. type StatCardOptions struct { Label string - // Change is the relative change, 0.12 for +12%; HasChange shows it. + // Change is relative; 0.12 means +12%, shown with HasChange. Change float64 HasChange bool // LowerIsBetter colors a fall as good, as for latency. @@ -25,14 +25,8 @@ type StatCardOptions struct { Error string } -// StatCardResult reports this frame's events. -type StatCardResult struct { - Element *ui.Element - Retry bool -} - -// StatCard shows a statistic, its change and trend, or loading and error states at the same size. -func StatCard(c *ui.Context, value string, opts StatCardOptions) StatCardResult { +// StatCard shows values, changes, trends, loading and errors. +func StatCard(c *ui.Context, value string, opts StatCardOptions) ChoiceResult { if opts.Label == "" { panic("mujica: StatCard needs a Label") } @@ -44,8 +38,8 @@ func StatCard(c *ui.Context, value string, opts StatCardOptions) StatCardResult } k := Tokens(c) u := Density(c).Unit() - var r StatCardResult - r.Element = agentCard(c).Height(116).MinWidth(180).Label(opts.Label) + var r ChoiceResult + r.Element = agentCard(c).MinHeight(FontSize(c, 116)).MinWidth(180).Label(opts.Label) r.Element.Children(func() { agentCaption(c, opts.Label) switch opts.Status { @@ -60,7 +54,7 @@ func StatCard(c *ui.Context, value string, opts StatCardOptions) StatCardResult ui.Icon(c, icons.Must("circle-alert")).Size(16, 16) ui.Text(c, dataError(c, opts.Error)).Role(ui.RoleStatus).FontSize(FontSize(c, theme.CaptionSize+1)) }) - ui.Row(c).Children(func() { r.Retry = agentToggle(c, msg(c, "list.retry"), "refresh-cw", false) }) + ui.Row(c).Children(func() { r.changed = agentToggle(c, msg(c, "list.retry"), "refresh-cw", false) }) }) return } @@ -75,13 +69,13 @@ func StatCard(c *ui.Context, value string, opts StatCardOptions) StatCardResult } }) }) - if r.Retry { + if r.changed { slog.Debug("mujica: stat_card retry", "label", opts.Label) } return r } -// statChange shows a signed percentage with an arrow, toned good or bad. +// statChange shows a signed percentage and direction arrow. func statChange(c *ui.Context, change float64, lowerIsBetter bool) { k := Tokens(c) icon, tone, sign := "minus", k.TextMuted, "" diff --git a/stat_card_test.go b/stat_card_test.go index d843db7..6d83a8a 100644 --- a/stat_card_test.go +++ b/stat_card_test.go @@ -37,7 +37,7 @@ func TestStatCardLoadingErrorSameSize(t *testing.T) { ui.Column(c).AlignItems(ui.Start).Children(func() { r := StatCard(c, "42 ms", StatCardOptions{Label: "Latency", Status: status, Error: "timeout"}) h = append(h, r.Element.Bounds().H) - if r.Retry { + if r.Changed() { retries++ } }) @@ -63,7 +63,7 @@ func TestStatCardLoadingErrorSameSize(t *testing.T) { } func TestStatCardSnapshot(t *testing.T) { - snapshot(t, "stat_card", 640, 150, func(c *ui.Context) { + snapshot(t, "stat_card", 720, 150, func(c *ui.Context) { ui.Row(c).Padding(16).Gap(12).Children(func() { StatCard(c, "12,480", StatCardOptions{Label: "Requests", Change: 0.124, HasChange: true, Trend: []float64{3, 5, 4, 8, 6, 9}}) StatCard(c, "182 ms", StatCardOptions{Label: "p95 latency", Change: 0.08, HasChange: true, LowerIsBetter: true, Trend: []float64{120, 140, 130, 182}}) @@ -71,3 +71,42 @@ func TestStatCardSnapshot(t *testing.T) { }) }) } + +func TestStatCardDisabledRetryAndKeyboardTrend(t *testing.T) { + status := DataReady + disabled := false + retries := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if StatCard(c, "42", StatCardOptions{Label: "CPU", Trend: []float64{1, 4, 2}, Status: status, Error: "offline"}).Changed() { + retries++ + } + }) + }, 400, 200) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + announced := false + for _, value := range tt.Announcements() { + announced = announced || value == "2" + } + if !announced || !tt.HasText("2") { + t.Fatalf("trend boundary readout: %q", tt.Texts()) + } + status, disabled = DataFailed, true + tt.Frame() + _ = tt.Click("Retry") + tt.Key(0, ui.KeyEnter) + if retries != 0 { + t.Fatal("disabled retry") + } +} + +func TestStatCardTextScaleKeepsCardHeight(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); StatCard(c, "42", StatCardOptions{Label: "CPU"}) }, 600, 350) + tt.SetPreferences(ui.Preferences{TextScale: 2, ReduceMotion: true}) + bounds, ok := tt.Find("CPU") + if !ok || bounds.H < 232 { + t.Fatalf("scaled card height %v", bounds.H) + } +} diff --git a/system_monitor.go b/system_monitor.go index 52f2ff2..8b02c4c 100644 --- a/system_monitor.go +++ b/system_monitor.go @@ -2,6 +2,7 @@ package mujica import ( "fmt" + "log/slog" "math" "time" @@ -10,7 +11,7 @@ import ( "mujicaui/theme" ) -// MonitorMetric is one sampled resource; Samples line up with the shared times. +// MonitorMetric holds samples aligned with the shared timestamps. type MonitorMetric struct { Name string Unit string @@ -25,15 +26,9 @@ type SystemMonitorOptions struct { Error string } -// SystemMonitorResult reports this frame's events. -type SystemMonitorResult struct { - Element *ui.Element - Retry bool -} - -// SystemMonitor stacks a live line chart per metric over one time axis, sampled by the caller. -func SystemMonitor(c *ui.Context, times []time.Time, metrics []MonitorMetric, opts SystemMonitorOptions) SystemMonitorResult { - if opts.Height < 0 { +// SystemMonitor combines resource charts sampled by the caller. +func SystemMonitor(c *ui.Context, times []time.Time, metrics []MonitorMetric, opts SystemMonitorOptions) ChoiceResult { + if opts.Height < 0 || opts.Status != DataReady && opts.Status != DataLoading && opts.Status != DataFailed { panic("mujica: SystemMonitor Height is negative") } for i, m := range metrics { @@ -47,11 +42,18 @@ func SystemMonitor(c *ui.Context, times []time.Time, metrics []MonitorMetric, op } k := Tokens(c) u := Density(c).Unit() - var r SystemMonitorResult + var r ChoiceResult r.Element = ui.Column(c).Shrink(0).Gap(u * 3) r.Element.Children(func() { + if len(metrics) == 0 { + ui.Column(c).Height(h).Children(func() { r.changed = dataPlaceholder(c, opts.Status, opts.Error, msg(c, "system_monitor.empty"), "") }) + return + } for _, m := range metrics { - ui.Column(c).Key(m.Name).Gap(u).Children(func() { + panel := ui.Column(c).Key(m.Name).Gap(u) + series := ui.Local(panel, "mujica.monitor.series", func() []ChartSeries { return []ChartSeries{{Name: m.Name, Values: m.Samples}} }) + (*series)[0].Name, (*series)[0].Values = m.Name, m.Samples + panel.Children(func() { ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { ui.Text(c, m.Name).FontWeight(600).Grow(1) last := math.NaN() @@ -64,13 +66,16 @@ func SystemMonitor(c *ui.Context, times []time.Time, metrics []MonitorMetric, op } }) unit := m.Unit - res := LineChart(c, []ChartSeries{{Name: m.Name, Values: m.Samples}}, LineChartOptions{ + res := LineChart(c, *series, LineChartOptions{ Frame: ChartFrame{Label: m.Name, Height: h, Status: opts.Status, Error: opts.Error}, Times: times, Format: func(v float64) string { return sandboxNum(v) + " " + unit }, }) - r.Retry = r.Retry || res.Retried() + r.changed = r.changed || res.Retried() }) } }) + if r.changed { + slog.Debug("mujica: system_monitor retry") + } return r } diff --git a/system_monitor_test.go b/system_monitor_test.go index cbc7edf..3ad5339 100644 --- a/system_monitor_test.go +++ b/system_monitor_test.go @@ -52,7 +52,7 @@ func TestSystemMonitorStatesAndRules(t *testing.T) { retries := 0 tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}) - if SystemMonitor(c, times, metrics[:1], SystemMonitorOptions{Status: DataFailed, Error: "agent offline"}).Retry { + if SystemMonitor(c, times, metrics[:1], SystemMonitorOptions{Status: DataFailed, Error: "agent offline"}).Changed() { retries++ } }, 600, 300) @@ -76,7 +76,48 @@ func TestSystemMonitorStatesAndRules(t *testing.T) { func TestSystemMonitorSnapshot(t *testing.T) { times, metrics := monitorSample(40) - snapshot(t, "system_monitor", 560, 380, func(c *ui.Context) { + snapshot(t, "system_monitor", 560, 460, func(c *ui.Context) { ui.Column(c).Padding(16).Children(func() { SystemMonitor(c, times, metrics, SystemMonitorOptions{}) }) }) } + +func TestSystemMonitorEmptyLoadingAndDisabled(t *testing.T) { + status := DataReady + retries := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(true).Children(func() { + if SystemMonitor(c, nil, nil, SystemMonitorOptions{Status: status, Error: "offline"}).Changed() { + retries++ + } + }) + }, 600, 300) + if !tt.HasText("No resources") { + t.Fatal("empty resources") + } + status = DataLoading + tt.Frame() + if !tt.HasText("Loading") { + t.Fatal("loading resources") + } + status = DataFailed + tt.Frame() + _ = tt.Click("Retry") + if retries != 0 { + t.Fatal("disabled retry") + } +} + +func TestSystemMonitorManySamples(t *testing.T) { + times, metrics := monitorSample(100000) + tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); SystemMonitor(c, times, metrics[:1], SystemMonitorOptions{}) }, 600, 420) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + if len(tt.Texts()) > 200 { + t.Fatal("unbounded sample elements") + } + if !tt.HasText(times[len(times)-1].Format("15:04:05")) { + t.Fatal("last sample readout") + } +} diff --git a/tabs.go b/tabs.go index 1b89d6d..9dc5441 100644 --- a/tabs.go +++ b/tabs.go @@ -54,6 +54,11 @@ func Tabs(c *ui.Context, selected *int, tabs []Tab, opts TabsOptions) ChoiceResu } } root := ui.Column(c).AlignItems(ui.Stretch) + if root.IsDisabled() { + for _, key := range []ui.Key{ui.KeyRight, ui.KeyDown, ui.KeyLeft, ui.KeyUp, ui.KeyHome, ui.KeyEnd} { + root.Shortcut(0, key) + } + } if opts.Vertical { root.Row() } @@ -96,7 +101,7 @@ func Tabs(c *ui.Context, selected *int, tabs []Tab, opts TabsOptions) ChoiceResu built[i] = tab } }) - if list.Changed() { + if !list.IsDisabled() && list.Changed() { prev := *selected *selected = enabled[at] res.changed = true diff --git a/tabs_test.go b/tabs_test.go index f6beb01..ff9b17f 100644 --- a/tabs_test.go +++ b/tabs_test.go @@ -201,3 +201,26 @@ func tabsMode(c *ui.Context) Mode { } return Light } + +func TestTabsAncestorDisabledNavigation(t *testing.T) { + for _, key := range []ui.Key{ui.KeyRight, ui.KeyDown, ui.KeyEnd} { + selected, changes := 0, 0 + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if Tabs(c, &selected, tabsSample(), TabsOptions{}).Changed() { + changes++ + } + }) + }, 500, 200) + if err := tt.Click("General"); err != nil { + t.Fatal(err) + } + disabled = true + tt.Key(0, key) + if selected != 0 || changes != 0 { + t.Fatalf("disabled tab navigation: selected=%d events=%d", selected, changes) + } + } +} diff --git a/testdata/snapshots/darwin/incident_card-dark.png b/testdata/snapshots/darwin/incident_card-dark.png index 464c30672a927e565126315fc37639872023f387..9c606cbe08dc2e7ed6784cbfeda5fed0b3b8f985 100644 GIT binary patch delta 17016 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 delta 16939 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 delta 16077 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
DpF5+h{qVXnTvzd`(+>IrQ%GmqD-e=&n5s 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 delta 5929 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 diff --git a/testdata/snapshots/darwin/key_value_input-light.png b/testdata/snapshots/darwin/key_value_input-light.png index e89ea5cb0a26ffbfe093e2cc7860c0ba49ea2aa3..601d094df91468fee157218291f19efed6dbebb2 100644 GIT binary patch delta 5541 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 QG0tUEQP7Ytl{E?cFHB453jhEB diff --git a/testdata/snapshots/darwin/log_stream-dark.png b/testdata/snapshots/darwin/log_stream-dark.png index 64003dff77c7648a86950345da432d28b7fec39c..4823fa4eb9f4a9c5f6370fa63654e0d7a3270b95 100644 GIT binary patch literal 25839 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 literal 25790 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 Vc&^X_Joj{Tw{93*FVV1%_%BH@*TVn+ diff --git a/testdata/snapshots/darwin/log_stream-light.png b/testdata/snapshots/darwin/log_stream-light.png index 68839db031f0f8f4b729de69bcfc10015184dd46..7f6462a58f04b9fc84f1bb81ffc116c2b74942f6 100644 GIT binary patch literal 24899 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 P7656e>ZnvH*@piI()E%H diff --git a/testdata/snapshots/darwin/response_viewer-dark.png b/testdata/snapshots/darwin/response_viewer-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..54c8f759129165356db32fc315e6408d3a395055 GIT binary patch literal 17213 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/response_viewer-light.png b/testdata/snapshots/darwin/response_viewer-light.png new file mode 100644 index 0000000000000000000000000000000000000000..58db5fa57cf2f35d2aff23c166de1716be4e6444 GIT binary patch literal 16849 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/schema_tree-dark.png b/testdata/snapshots/darwin/schema_tree-dark.png index b11c6b27e8803791ed7d9910d8554d0e716d912c..bee36d4fe59100cf11bd32664fb4077e7bed4e46 100644 GIT binary patch literal 16367 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 literal 16250 zcmdtJ1yEc~*Djg_0)x8;w*+^W;BLVoKyY^%oZuGRJp>ExZXvk4yZhh_I^22Ryx(`e zs#Eo!b8pqH|J>UQd%Ab++1)$42MKLg+m z^i0d*T+XXk!Xh%_B5LlLC#zn{YG54rb7$t(fSLm)GG-h-baV_@er1L?Zs(H`vJzdW zsOrm0b5iiV4-9H$Iz&>FBUA*e39#F#;#a?<@G->UVIqcMN8d+$WHJ5gT=3y${kBzvXfZA_D|G)%>nS+CW|L=XZby{UUCH0seP4 zIuSt>ZiW```j!^8bs{BuYnSlND<^%)>A` zYf|&IW>|PUKWp4y{pC%r7zAFAp+xBax#kTv1u+Ru#cAb!(SKztC9QIx*Zr261~~j>1nBW z$S4@D!%xV&UZ-jEj+5>`vZ5ua`|*16KxRV4vH7}F>b=m$o#D}XnD4vKy3e7CN->BG(2IwdO1}#>~lkozj-L) zqX`6k+k8xVek=nKr`c~~U<)DK)*>LN7}5ka*%Aqo77AfD#!9U%cFka)guZ73|f z@_v73D6H!Mh$!qY*jUL2kY6}XUr$9A}7aW|Gh?~4ruS_ zWdGRKkX*af_YtL6fr9V+rHPl^pUb#>alV}=Tq@e<+HokM`rEKc5ipv>ocYZktvU2P z6Rd~B$-6zbE)nUZQ=6I5z-@y-AW?BkOHIDB_kxu4f_cXIS49V54-b;0t@k)fQV-Oc@ z-EV6(?u(Ds+!!iHqe21=?V4Kh;Oo zl=Q5;axa+vAOLT5Wvj@A+hIylxJ8ZiTr}xj+=#6aug`XjtLVoL= zi>5i0fZxK#TenZZc`+v7+(k6&SY zxU}~}WimKDwEi7@Vnw+-P2jz`-)+p%(T;-sA`j53x@;#{dv zat2Jy-A+I03CEFInrW<0{5(GG>;fw8qjEZ%w4iyB#X~KkX*0g*Yf+93q4m1f-4o>Y4Z{k8FU@WNc{olfNmkNY5 zehd2;i^B&qTq6JkyM5u++Kn5H1cjV|_esGJP&0iVdyZhHml+cjWi>**WF3Xp+Wfig zH%5uvulkTZu0p8og2mBcMGA%gkD$W;nT%=sR{L7~p6u1LOW&jn%_X6w z29D(CmOtHJhY}ni<>wnjW?-5c0dYTJ-XcWa!Bx*kUxd}#+uqT|Y4IVY`^2UR7ISU6 zAtdWLhusgd`WjL?#qPvB&s|0GrypG+5Qy!th8lDn_(mzKxtZV8M|lI<6u%bR5L#G& znN1?3Xt9rb-1ztswFf7Hz93P%b#OPWY2X3E%Z4JAv@B$0`7w88<#$YCPEauDaLx*R zBFMoOp-3y4Urk058YY&27q}MZKgA zEk<(i+1m|t2ZM3ydsR@bo4wL@vwL9-2OqkC_T~={Cr7lh@!9z(f3F;;6gRnCbxBWi zKJ;sTA(>wE6})Yq4?l zEX}?Mqt?Gpx#r7STMqi9POm-Wdg&_Vm`F%z_}XWL|N56fqm55<`DtI=xlfi}`a!Cn z2b0&v;RfvtHy<6Hm8>lN({4<1vijW2%yRgCG$~e2><9$z4-z%1t@O*2-ewUAf%WcT zh9IkQG`c%9t_nP9PUjO+;%aJY4QJ)t3%%i3Z7P#1Qx7Mk2B*izN{YNW=s*s#FY0cJ zkTUItw33y9Z3I@XqNiPqZxoHQ@#> zGiaotyL_gdgR6-lh~hP7`4>Mi0{4U(AY-VE+_SUYSI7GeZ&Q-hQIV0`YMhB$MPXoI zB0<1Ck1-4E&w6;5Pb{ExyKc?qJ1v;wl%P$DYo78D#0+st_(uv2=)V~9X^LvLE+3VCiE_;UK*$%lb zDvnd3jgk~|k>3g_3Rv^;YSgbBZ%(cJ7DoLeIr(_-gJr2tJFxvWz~GlER4%Z6V!iuMluPzhBSjOv~DC(jzT;w?NWE*x1w61sQ;UBqYiJcV4~5 z2o`7u_2OmoUU#rD30a;Xlt@!eS$QoG=WTk7t*vzwNfpf>YuncqPalSa*l~rv0qjl3J5E#NnzX)v%AO(55v5-F{Nnz*o*D*Y>Gx^4M*Tr?@pVR`;DwTD0iu zF3&y9G5_*Q>iUw(ZtkXfrHMD?yx@9tdTJcn*kgg+(!z0KQ?hp+A4m4h2VR~FZkSCg zxvK^_+0^X1MqXx5`z4kbIL7{HN_=WdUE*BED&qEXzk2;GG7?WtLSTJiAwKD9_s)Ya zfNa3U42r-|CrnGTqqhdx&kF{MugY@<|HAM8U7zexzW2HFB+E-#)iS-WGhrtdDHa`h zfZ7QS{HX9TRkBwDy|Q$He_1E5mXGuFL<4+1GdHFNw4I%SaMmxgtLnD$*YXQCjE!A? zi_o*8e6PtG_VX)%!wF$P5FM~d81Ec!6Wk5|6E^>I|;Cf zPs*2KgJ{&kiBCkjmso%}SY7!`N25Sn0@PUI0aO$C8kj}y)Dvs*3c<&(L@;*9O{^Pz zUx{iR?M7P2=1H0YKa!yzpx|+^ieO>=KRMXyV@)?IR4*H2O<@Kbkw?})G*5hCv6xAx zMLWuw(YlG&_{#r_cmve|zR4bS1$xoh=g#Tn#Xv0jaI!Gl*FxIxwXZ<0fY6J4ur^T} zMvfZ3DKpf?pX|9ACKO9eGGazLy!rdrFe|S?_Ean7j>dBx!%MwJwH>wKtnXE1nOghz zmE@v%V$-!#xeBODJKq)TPHmma6dniHH4yZIav+xpWiYLdMk>Nj`=lpJomlpal+2`+ zwWK+_{D=-)Z<}R5C$PnDsct(O;Vkmyq++ctp%;MUm$TC-un`=Mrm;zgAP{)k3tV^5 zMswgkM8g9F56q_wvQry${LOW7Cy+P!bN){wWUV9zd9pL4QwU$#tWBdrgaj`&xTw2ZlS)yTuw+#(i>PRU7(gF49Ob| z|BzXw2`ftTL{Qq^jNWF-?1;RHJ9r(KGF98#wf(uN9zj!@E6x|9#XH@y~IPsCYFuDXt&W3`A-5qdv9f*aV zXNx56B_!tUBB{4j_mw1jB=Dp9E(4tCCkb-W(Q&aP`C=oIqqmNGITZL2vLLrBzLsQ=N24|VZysopZ7nTU9pF_=+bm=1L zK14*whRHrC*5oBnc2SIZU;6|p`?%^o2YNn?zorjues_ZNl`d!aai48LsOSwg9=q_^>EHT41wNy|bq5Kf)S(UmWA_##}J)01xH>Yw)r z)tjq6{)D&xHdH($apk?)0MpHSvJZ#uV&&7rIJYa`^CmckrE{ul&A)2FVai_|aR2t+ z-Z4e%B?w0iq}(jF+hLdVs1q>0@640wpZ)su8!q{E|N7Hpmw(+hqEALA2al+RhB9Q? z;0aCiXLF1n)({4JMY!7ws z`2h$R7#+SrLv3=}yxdqJ0Fdu6Urit1Kox@m7pTGSwe?8b*5E;x{UQA*;}e@|;O_t( zLY?16ztv=Mu4v!j>b?%+o)QxM&h7m65g=rK%F7B`~3pAb0h;=PxOKtuW z&r??Pn``TT2@?yJsT7Ec$w#%^kcx zN+ArN3#Sid;A@&Y2x7FbQ~FU5Q${GG&>@}2$U{(z9Rt&aU6-=Z6hc0{xlRFLSMz;j=2Lm!!!S^Yh&k5zd{GrB> zUDcTrY#q2G7G*CAKSGE(Rvv*cqdC zmKI%>f1u;p)dPg&{g-NzPWHCqxURw1SHy3nlt@N-ld;e-EkfE(8{`{*pA7aR|6Svt<9`x z!0n#}j8x?7c?4MMgqc%%jc(j-G;q@tZ1Jjxp)4|@AQE35KX5k?mm3%Pav`CqtEq0O z?rr7$#o~*Sd5jL{OIu;Vy=1~<=5JcMgu$lk{F|LkEU0B67LI#=)vzw zKl}9QDN5~ul~&cXwA!nkdsX8+W0-arq<%|FC<~hF?w4r{8`bi6Xs=?h5h@fm!>E=@ z(jyMnqJk`~t)Tq$t+c;%xHN%1ep_|>Lqtil?)3U<=LT6lSA!(ABD;3Rs(m zpz5cvVCnF0IqFM?Y@G!c7oCuub>VyNw)*!SUzN~%My`<+%Q}#@ck~(B9Bv|?O7X4= ze5bC2AAcF_NmT(nss+dyMf5-2w2lk)J2OU%8e)ZMoj)@Mhc<>Xh~8>Jv?}MX+}oUA zu37!PTdlf6@Fa2c zAf@jyMKjY6l}}K7PXCcYpjB&;?mIWZ#%t&MvGqCQHsW`L%xHc+eZP#gs0d%W2? zxfPqa>7VNbq$_VuvI^C*Y0xjKgsSsi{^AlJP-o_t3G34x$ejNxS-X`Ht5uLoh*5+J zSNp0g?B0|(FP)b2yav@>8@{a!Mt`o_j`{eNu9=uk8ZD>N*O`x2WSp^{?b6SlJvD9= zu+Y-8jPNbd%Od=*n%roh!rf`~zsfOb;XE90$)w7V>u*1W>@n6FZKeOG_Rx@h zQSeu2sp6IgsL*udn~r;ZJ+(9#vV5 zwLqFL3Yn`UezZuj!Bv1C4P_#@BE6>pIwHkybmY1|!P;I3X;gU5F3EwHE3Hnab#&=L z&pOLX5w2n)un|ZU?vBzHoV#YGTSyx7x``qSZ zLA#|Ekolfo3s0|@)YoG*k?Fowa9e{X?~u69w;$xD#E)Bnts@yYIjXxpU}UKkdI!}xm1T`VKR(|QFO_7Fbb;rZ4br?<vIR@a zF}j2VbV-9X&X*^W%N?YRaNR6$fgQBIrL_rS52Ptp*2j1uBg=P+45Ah%3zM~Gisr36 zg@p!nb#-@ckLJTay4lz(=Nt*~M!+!<$PxfX1cPgcm-Tz>OHzWAzE-}oJF^7(eNUtx|HP&PVUpiHmmdC97RF##LwEZCLuBsgjrBS#%DaU-TUTrP3arL&me5DEa zVm{ts5KSyBmY1g2oVjy!^bK8ygm`V@ZhlDJ@l!Fw{YbNMCn*3StvdKXf zSW@A$;RuQ9((_x;1oLGevBz0gt62tnNv!N_ zDJ8!t8*b{Y-h4k$L=YXA>w8#hzpSY#+4%mozSMX`TV75Msi35h-p)r1D~I_bpuXM_ zL)6q%T`)0m2sXfuE=ja#`W^8pKmS{Ppv|PB6i>y41CTnIO%#{G8H>*KD)h_>9Q(QA z3!4`yZE~XK8hvRhPuKRqph>uz>^s9c!i;oRQsR{U>9zjrOn>Nas>PR9rXFQ9W*z!! zvyh|iVy$>@mO3#S1CW2ohPEwSLP}Rq0>BlW67zJGe_{AIbhu|+1yy^RAnkV+f$#P8R>5R z-Ii2+p_t*T@`vn4;AKNu%jD}dVOE;tG`_@N)ixVQb}Qj zufVbgbimc(e2xL|MY)6TYtSre%|}^SbL|%HVyr#hny~Rwo&w_O;Znh|uC7SXAS^ZJ zAf5r}x8u9+DsA>6u)i43*XBXNeWBRlVn7ye6~Rehbf1 zE6);bQ4TE}h5=bBmudVNM^0h#Tm@5Z1)*8u(Gd|g;x4_&6_oml6mJ{8R6kV6G;qxc z@}dUI7fnO)=Y0~LZ_yVPVGOjtIWI=Mi82T^M>--Z{PGqWv8k`CC*|{u$M~zDY-dQ-I>lcgsdrSeMm80!0oDORzPzBG=%xS949dxYbeky*XDXmj?Pm-N&E!8+~0E1qF6^r2C zzP%g2P%Ty~QY?D$KH#a|_)f>f$jroe27b&b-e;R;Hc4YoTNO3TxpJRc+?Fw~&p7bx zIz4{dc+*EP;j1JdW^;>uJ>T;zTpbz_Ar~1TcgT@0&vcgZh}6=ujrNpJ4?*_PRn}K` z_8akm_oL)eF;ldgn-xe;E7rO^gNHl)y!L!`^U(Dxo4mU(nncWoh)VdZxVJv(VLys& z89a(dB(%iA(E!2=G4yJ**L&GC59$U?T9{!YO1$R)1&Cl1u;4~gV}?H-puxd$vDy5H z)P=M!!yqG9^m{7aWa6jvI|E(GZ?B=oM$Cnc9lX+bn+R3X5J}X@lGmH4j}veI4u(tN zFXl2_OX{F$pAS$EDwR*JJ!MP_Q{N2%{_eqH_-~sU9ObH^?wGrf9Vfr{kab3Vm}3t@#G2 z`3Akm#~R8Y4#Lr#f^uUU{2-Wri$;lh1*N!807CwqmX2NyDJNVXKLjJ1mPrn2E>T9G z3NsS{>IZt1>*ZjSL} zH$iu+hIZqepUlvsX^Z@-fg}zJdZ(nqc$kua*Fk{yZw!O(->ApENy=sDdL0n~^Haw$ zcV==<$NE_OC8DXMekSV2Ttq#^5P(cf#YF6t>7XQ64cki&)o1aLFYDlGD<9t&Qo(&* z+I@YMPVnH_JLJEu(igx+MR`HB{kVo;3s?4CtcjT!he!P3#-)yS+R?$6yfXP-tTP&z zmgw9L(9OB93rk*sW=>jV1i+46Ze}~Z7{OnL7DhaH&E51LmbZH9>7!!(+ zrR(#0sZvwxYvEaz>ZiiRZD(%e@GQSt4`KP%|42GNkLs4At~Q&fskRwD|C`0;de?h> zr>l}MQv^U=RM^a`kij;1A|gwd4fFThaAWd_@QMhpLDlF5q~g06G2%WB-m zfpT-v>=B$IYA@h@jZJQ1XV>7n>O`o}USA*8CC%q}nVFDx3ipBo$hFm-XTH+gsAc$a z{th=XYJGqxK8{?k`C4_Tn?npn&(?M{1tp4BNiQtggN)&46wF-Z#E)X2n`=?g{t1%6 z(&Xaqj>U1O8v&)zqGJn+j3gghd|c+G$##k_-O$YC<xwA9c2JPID*Vw%mL}?x^$)1eZ}v$5vojoCBN3)du}kb>&3QPBpuzp7%tUq zJc&^pF7A_(#Ep~YadI!p3sf-E(03ZbBDGiY5hSKl#~|nM&5W=TMz^r~`Qby92w?Qa zVYSAC)1SQ~i z)58`Yk{QS>tSnC9_&dlE32y{+1d3LYRw0pFt+C_`F=S)QH|}b+NI${=8q3KJnKv!K z+h~1QVo_67%@VdZGn&eKXo0H?c8-QSD=8_7icp-GpI?ONy%LpHP`HskXTnnLepI1YO`IQJP%}x2K*ic|&w}|r9tQ`PuCBZ!V6xt_BT`_Pj!ujz#MKp8 zskg}}=ezw~&DFO3$iOw>Pv{Wb+3NISpI=#7Dm9PV>UsQS;zQ8Hc0Ylan_nOrYB_bJ zfWDd<>;$TBv9Yv0|3oS+8;vi`4 z`L5~C#Mt<`%lTYARKrYTE!}nf^8Sgl)JoI0x@SPTvMyiX&H|8dU-tc+H^i{9dps=_ ze`8uj`TQ_r6PVObCn5QHY-|hc9 zu#~P#N?ZANjPNr?D=LZ~?P{T07jU%)9*&mxn*6snRi5u_YM`>Nh`#k{ zZJl%sN4!i7r|H8``33@I%b2~000@qzy|l{s!N$#>?WCmk3tj0g39)Lf5YHpOYZ4P5 zZL439{DD&NZ@rj`VDt!6Dg-`2FH5}Jsdq-{M+zBh3waAWJ6`Vtskl;T@c8D&Wh@h= z)NiqBVYqu~NPv@5@KXP?kn={P0uEkE6p#5w0iSfn%V_r6OLS4S0@mi{xAJ@J=CsS4 zrQRkVOgubzxk4kAqzKZQ0l6&?a6#y`8y@z}I(kx6h!87+qhqKF)P2|5i(qzl6BGLe z24eZ(a@{^2Ox7spYP zDy)aJ1M=y5=ityVZoLgXSl-UYuFLChQhi=W0%FWRpp#KjuD-l?S%2+8t^sR8jtMX_ z(t0e7URv_(q9GRbTMMV7FFiOqy1iXxnfD2)PrCOW*GAeKUn6oq0cT*`$p+w$X1+cG z9UgA0o#~KlA^4rBqqjhI5hbH*Ou|?E_ist#NR|d zd)j~PHQH1VY4iT@i#3$-7eh9Yh7DJ1Zn3tQt+$Tk?bqC{njEX*;);f=UvVi>3S1hv zk%Idhlw!xGV%w$BW99tdD|Z0_aLCMTpZPB91qt99EMxQKjS)6$uSr{FXmKk3k7)9H z&s3{Y`VC4-dS)eMgU9mEqBO(k;X%y75YDk_5o&| zZ0%LLm1{S;+HbJF*(62`2>5M85$6DUs?TagJ6rL&JE|83N%aCGeQU>U+23JFN-ECauJ}D|uj**od@nu?L7Uv{*+-If?<%ObjCRY}JT$!F z5sajeyUjc;;ZmHP1l1;l-X2VFT!@HIr?MoMXnod+ru_$Bz^zV=EX3SiEhM7SGX8Zg zV}4dd`Z%2yeehBfkr5^IhMSRi9xOj9oq0a9va&KYHr_FM>RZ{Akv0K!kG8*2-{Jlk z2s^*gcDS2BLqH?(v0|N^?Ap6#PH}QVQhc|Zk(TCl^I*%!hysNLnebN>%ycC|T+g4G zQs(F8gmyB45$S|o8aousKsxow-bFNe?XfK z(fW~NCnc%G#@SHc5GLmxrmHJJ0)Z1X5exVAjg2oUEg-1!^iV>h?>tY7|M5jk*M%dY ze;>&gK=0C_49E@XD-3%da>bEh$)&-7%g;sw@vtQD)#mUDF@{S2KpEu^guL4DeVR(x zPRZVA2hMF$b_)2$^Y*TM8{LFbo3EgcvUo&}k^u)>KEHep)H+MJWKmGC%?x|&_v4eJ zh|A2hu`To++H|mcB5~YXQ74JeXvV_ILX%1BLXYL`oJMj&q}&ivWJGUo@7s#73Cu&`oNj`J zu|Y%Mm+r3F(l%~;onS*PMO5ehn9y@1RC3f%dL0%@O5i$V+m}AYX053tuaD{+b1_xE5Nmo^M9*pcaRJs~_nQuNf?p=M~m`5MOz-oM>gSGU#PNG;JJvd;ef<=q>9GCoydt$6!qru&KtyS97H znRRnbH8uQ85-7p6-RqQ>+qz@HzG)Bq?nK(`l*1V%G`{%JbcS?JMQ`4hzv2A${3VA! z#PHTlBP7Jdk+phiDxxVUvGX&A7?+8k0qW7@$7(d8f8s*(B2rz{%>&zz--0<)}ApGN;KuPZL z5gr^~kz7sgr?Hc=72b%@&B95!biHf$k5>tK-Suo-XZl|DGLMR1G;Dldb0=B(C!+iR z$p1Q{UXj}Fdjd1R{!4DkzskUI+PYljLg;tIA%_2P9VyvLeLctR>0*i0Jnn65TH54} zOd&p81M&jfm*KCBFbyL=ZPQ+hG;*Kg1}>nW*|DB3<31 z^z(~2)Bnj+dKcMClVHjPS5{Y*DoqwvBshwS3Mr^ACLo78lkcj0gK-twYfJeB17Q6Ti_qRR~x279f)%(Z`o+|VZ`V#9Fxp8f47X{*TxbYB-o7-L_ijk}#9RFss6 z02Y_DnDp4@KN>U^HVDz|`Dc`N1Nl*Rc32)ki2q6~e9o&_X`S6o& z@clq?KHg>^rCbP=&(i=2o%+R7u=Vb4l3dEjRVKHpJTiZkeMacxx2LBcb#)AQw2vF# zNugk8Y9ieq0G#BQr3CdQCnk)wJ?)*C=<4X?7PEFuIXNxN>cR&qk_TB? z9ceNcSr~h0G?@$!}J^XJ-c%W(0o8`C75MFq4^cEK=<4eAXqS2{1htvHJNC=oUYVbv2=whE-HH+s5*{0HQ3OFZ zc90OWHPvSijt?`1y zH2?F2qB`_%GSRJ#W-_kLCWru_EC6*Bb2aU*WO1?6Am4sWk)%!S*&uK%Dd^cW2n$UA(15orm&k2=xwT zQpwKtX?V=PcQ<{|SMI%iE%(?3xakN8rj-7NsgwJn|LK$dbycvW4&sbfU3<;W;5^w7A@ zvVrY7F4<+kN3sbirZ|?_YC3x=$*H0~EN9uZ(I)rxI>;87)*JkdBp5&B-eAFZ#hg1E zU-WPOJv=!0Qp@YEcrGR@8!t`O(AfDKDQ`G5|^D(tX=|@!WB0Vysuto{YKZ@yabM#2pW& z*ULQVkI_6mIT{+KmzVYJ1fkmy{1aC>YcTyQp}89qdZQXsGH8L^{K@$GZ;!wJ8#(?; zcK+W>u=xMim|xB|ATK8itR;aTu|rhgywR|S$z*Oj`DCg{ikgb;gc08RXLb_m{o357 z1MXI=B(*wef`;^(>Hptrpe0rhet-DR|OR7Pw!`2$w}LF z8~dMYp3wXX5}(Y?%t9F`td{3b(}X=W?S?tm?Lhzf>-2OENe{a!H zkS#3>v)NCci1NrwiK}~L94`BQQrDvFJLP`%`xhF`2gnjlWpIh!KfhU`8wQ9+vdSre+W1((65R=qYIbo8u_=S^)8Z{<1 zx4_gBN)t>BxmXp**kz2jKX-CZijTAK^>$}VUb76Y1e#}UZUWOPHvIo`5haCIYz;W( z9auRy0J%snENXQ|(P#oA=+mXvrVE{KnmMKI#jHH|3;I(zNVq}V7y9I_8;4wr7c1xzT+0Bv+{d0?Y+Idh5C=RW~XNzUsqGy zPO-4A@A`5J3*9AsREJW1VHaX@9^O(sy zo$kDn?4IklhgM4(sJqscl(5iyI8ChOogMtc<4GZ4T$AvKkNOIeKihGBQzpmp^!7?e z8>tlj@jw&_u-*QWL364uR*w!z1TMkE&h{+VJ`(r#A*vd#uF_^~6&a_xLx7J4V8m4> z7#-c|%PUE2A_6$U}SQ@M7u~f+7SW4T>d^aPG3Xse8)z{H!ZAQl2aKipspkO7e1>Q=-K$keb1R% zSkQ4k>`4OgOUqW_OZ>SR85td@Dl3Dy?m4@-3{9*{XwAVO(NR%~hA@O;I{udLcP2VX z5zY>!3-j9x>%_#lMf5<2(%=ZSBBSg5gv~G62>hd_{I%1#$*oof#_wVAhya}>;7S;BZ3N#< zwU;#(mNXXXgdV;$n0q*OP()Oekz-PP?;Hoe%QmJ%Rhq0gZm7?st_nN~gt_>F8p$yc zWe$Ylr}wf?|7J8QcDT}=J$enuN^f+_CywgW|J-ycqZscna5#-u4b5pwL3$<83h3*& zyU{%|GQw?n3v1Q+3)=v~^~L%FO-%(OBdSCNa~@LEhUJ3;_&_#~Tx1{KJr&A7j7aNv zd~MLiuhz!z;$yDGOi%&ZhYX12)~RyL;~qi0n(xha1pt5-FJ6>_3bRGL5&JWPoB7lC z_b8~S{Wq@=|hiwm! zmd3ieq{K|0lhvGz(+`QLrNYWv0i^|^%D#+OuaCC&ni%%Lre_!CafxkA41&C0Ob7F1 zy>M_EeeY`2S@rlEOFTWjL8Vi4bdTnimc#@EDbwrLP2>@TanizuH_RI)r>|bG4!)IhUcXT9SeMYw70jHg zlw0}-S&BjTI`;#ccVQ@sKZv`R(NC+xpKg#dlB^tWP>nq-Go9j$-kc1%a5kqzt&z-` ziylu%Bt`7#uE$%{()o{U2YPN%QEbs?+)aTnoj#QNaJl#n0m@fJA08g&DlY>ApVxLp z`J4u^QyUA9olDwB9UmUX4Rz~$nHM0(j^3chKlUG%!0llZ^uF!kF-HNM#REyIB7e>A zM)=?EHcX!2q4p?=+F@i1g%JivQKNwdKTCCXic6Y-{FZ9e_rngQdd`K-LJoiU4iCcn zm$-2JgcFl}FZ#hk2;kW!n9@@mEn8^MHljxRsW@)W9Jh><(x5N4609Sh|6~(O*t6Rx ztM$}K3Pq3_b@MCv^;=X&RCotP(=*U2HZ%b6|3c;330h$HEm9#m!>+{Eicbez33#au zoJUjjb2hUY&0yNLr2j?w??hL++bVN(%5F4sO)%IZ6P~Kr+1!=iuD<^V8xSREH9L39 z5*MRwa!3up{|$L^eq^)Rk;#jHu_YP?W&*#ze#HN$fr_nZ3FrqAFdGsk$+6DO-liG#ZikX4}KY+;5-r^$vtFz=b#H~0jt5MNPO>c+h zL@xAOON$ZK=e?uGl>t5VKbJ+5$;tO8!>O8ed4*4&+txE#B2{6z9_u~F z$sE41p@#a1I9ul((yOa~SPsqr4YM*)pC05bu=jH~!yU1sqa$;sWy{BQqr!Yf zEug1##c1UMc**|Q-b%ot-q6|sQa+fGo)vpLSxR^rV!J`5AtNhWP{83!2j)fFMbkp$VrLS;^Cs zv&$M@@LbdZJxyGpf<{wT2H+UuRj;-aECHvnC~)1XIh0!w`T;!Ncd2|H2QCq}T} zgO`$0jBaLT{P}$%n-(O!{%1R)LMM#dpppCP`V#P%WYfd@A5MAQ1irFl1t9`MQNE*u zWO=Wy&2MJmK2p#WO15 zKVLgpYur3LX>S*8wEg<`_PE^Wc#St}@aPB5`?GzYCG%y?B*^5pM9hbpFki1x<1Ncu zlDBH&0o&bT2%VxO`fwBXE0>8074n^XtX!Q8+iLCW*~2nuD-bHMaGgxJy(v8A1YN8z zklDyeOY`MQwS%`>@}vbx5s;Is*YP}#NQUU?iXuiP=7l8 zES0iT3O{|=5w+Vvta1x-)s-C8(wk%cvtJ5dSFyzAl)vL4?{~tNUr4*GN5w(^Ha`+yJBxK>_Ld48FO%N3-l*^GL9zbsIZt>dN> zn?C?7V-(Ogj;0+^Px)U$Q}$d;3sIWmzx_3%=RH#t%6czthCTpEirJsloBwRUoK6Z@ zg|6oFK{)J{l`HRLvzkAmM!>MJ!RzcH?|4?uW{knuuacYH1RNX-D`)eH6eQ0w{ zI0lqdnj-T^j8gRH)PdtV&E?gVMb=tXV=6=T0Y z^|PNqJ6%x69#YSs4&o2jMn@q9Fp|90gs2q&$9rydy2ntjcw;5lW%9YJH3y?!4+_{eqEf&{ir^j$m z6tgX!EM)W5aN{ucTt_53!xNIjrT8*PGQM@OiHIzhl+CV>o?dp2#xxcdF!c1O64c+7 z`36Z#zx_5JmlS;0uOh!!(M9&c*O$~E(oqm5|MpwKY%v4@9}4));}7dXB^BL3N6_% zumg_7Zo!KP3CZnMDz0!pfu@zEp`y~3+_tu57>tI&xEi+bqrK=H7BR0DpX5Mh_fs`QS-ohzz8 zjI_dBJOY?wPqP3X@YQA|$c|{np`?%HThiAW8U~#kr?7=nMD)?Iwyw59{$*1?J@1g2 zLIDQN#U7kaK6@@1srfF?Qg%j8I_mdjj=|Z|$*x7TKZ6Z&FGTUow^O`mrkrb<*hwC79W`6E#KSLK zQ?Hnn4(j}PSo>w!LROY3aD08f2MNLmy03W7Zl}vn(WpX0Rbt|J5h-)%@w^j_oTRN5E~!wbV?W^5*8&LqGVqQl}c9hG6yJeBb+cZM2$z zDt&eRaDR`+-o`qPPcD~8=5^>Vyann&8EsswC{@uIh@CuFgs~t1tgeA$Si#GerQ_Du z&nSfTq;b>T$-uV)oQ~@7!KeLe;od^+;pw~+0l^#m_rI8o@yfHKDOF1oP})1Xpk2d} zAjlmexNZbyLM2S3gOt-8&(LIA^sZ_tda?{BUxtONdU}N(SpqIF$Hn-BMEQgai{?sZ zY_y0Q(-v*|;<)(ytsJ#yZ@7n&3V&&rhnE5-RGgani>(4{YR1$xwOU)u!H&jD0l1~f z(>gl3BM})fxZz>p?Cfl@1G*WR`Y6x7jcsKl^2rH{^lTA=goTCKhuLL5q5ZvK77@cE zpK<$~ih?$5rhp`Ae9$Y$m)<88Jj+0;9HFr1G(4QbCO?Bvd>%gaJguFUMiUeiAgt%v zxL{UgO++$(q){iWHuAs8^6h)kXA-{$2X*;N#wt3KcXoyE0~8AIPf&@6=#wuTugOUT zWrkC}{1K_uE+?_;mSu_HZMp{9*bj~jS=+StZ=A9yZ0+2QYwU`R9q*7iG9DyIsg7+q zvk(%l5{G(6mX?*()|KaH`|YZiNlfJJYTO?UEk9$Y$3;s}V37DdJUl$NRMnb0+`U{| zQ!4Cqs(O$4w`4~&t%`m-eoYJbPR5bEv^YD+qhy(Rc%+eEu@HKvm{>UGxEeF$>&O+j z8LclH!`iGrdZGnmHEl&PT|f2U@_eN@^;~>BG-*KBVqv5&Grl>Q{=Cy7S66RKQnUT3 z|K|5(8z4~RVo#vC=|?)y))b6f8+_@RSxy8+QKMsPjwtufhS&z>;w~;PndI@W-z0W= zdY`Xwam65|4W#DMZJS$_zJ?GT2=jAE5Ye>yopE6l^YRa>b-k_;m4C*|F$!VO36v^% zN3`dy0mKwn=O>AC-g2c7vXGsywf+F3AhbsLs z?8vn#FZs|`2)2n@oY%QqV{KDY)iPppNHk(;dRs@t)fe%8@6v1AeClG=wp%3cW6_j# zeX#$xI&tJv5mTltJZ7ISk2MH2wipd}Hd9ZBM@Fz@{JobF%aT#~wfzE)D1bf4PtuP$^iR548< zKJ7b?FJDqyf2ZdZo9kV;oT*sKB+pEur#EPGzmZYNNuKvE4*gbr`lkpp`~yzr8V))} zyxcwxB_c;@DY=fG!DK!)LuG5@DA|)$a-s|uUD{T44rg;bfC^&zx!0%0mT7?D@lNc~ z@+9(6>Cw0{fwYp_{|bVZgY)GSl$&QVmIZiN*a06}j5>p^-;i3``33%n zs4YXPbbGFa0uqw1b#=8FIraS3v-{h6M6s{1eMH4X`PS}(%DHuz;BVQ2DnEom8l&8G>!xzD$htPP|`gwCj8prLf`r*pr=>>Cl>+~Y zG4xyFU2TIizlt4SdUb`9iLx+kcR1HNZG`fOEnmQyTZt6Gm9f`wV{uJcpny~^N94}F zH^RCk`|#3xEk^ev*#nwA5i_kz1&!ns8T6B0arA9%J~G&89+4lf*53P?QLSynP}IBe z?r@q-@QCo6P>w1ZJ{ON{`cavyzDFWUMp|HdO8LT$SWEc&8cs>@s+SS=` z+UH4SPW*+)!*?7{vmNS=CwjIV8<8pjZAJWmIo?{VpD2Qn67F{)XV}m++jo^S{W|f3 zv8X>xqI%wYI&(G;HGSmj@+u-i-qF=DqhqQg>8ajJyHqBtAp*jcCch2cIbWpxLQ|7U zMu~n2&B+2xyZE~wG?UevBYI((vb=8FzEAvXNNOag1861mKRi{D%3=QbEj*W&wVic- z79`w{k*E66ttYA)o;lmlkY`$?DWd7vS;1~YWAY+K*Qt!QhIw7)i!K_j1WHOrW_*6* zkrP^Q)3=r5gRKACEKe9+o>i(|U*U9h$17joflTfuCrv-8CKVbMYU^qW{?K z{~J!lDpGjlY={ao0mkJ;#A&OeWsP9MR%fDt4i^5uPnKl8s%zki)~|Jxw`|8@XCh1(ra zg?ov+F#_%qXv<_u?Ck9e`-g)^EC9dFx@7``0)r+^|9#a+6sp8hV`9<1wYCsKX~jk$ zz0At``J?>Pzr3;#)uuf5snbO+UWJ078nVhagT@zEXXTZulh6L^eFZ4{UZ3!dl1tTjz?JEj;)Xh@JYR%wHsB=Y_2>5%^p&b?KZij}#_;d*ipo?$OFogCKT?sY0vl1*Iyyxd_5|(Q_qxt! zaUC5`Bz_+)71(O}D=RD06JP{~U>mgiyiXs2{X)>yw`7f2uo39shnX$kUZ0;k*xfl> zy11P0PS8EJJCnp)3w+GZ^7C1NJ!4>KM8zh5=it{G6T|;tS3z&yKMHPim@7M&QdNbB zc>KVvp|-A;v-@-B`cPDsDjV~ls=T{D0 z7aEP2L954My2HWDB|AI2ZE_WLU|M!(o_lpthMcapeF6wbMYB!X@*jHtC6EN0dd z2O99f>s=CFeYwIO%2yL1>G$_OD?0BQt8<(-WYf`TkYhW!;Fp%!CcQNfa5C9!Z?j%% zJf;m)*Ij4w&_fq(bfv+Kw4Vsl-H)lBg~+@^!G%dbVKWABQ0*RG*ls zO-oIUj4D}KM@L#rk1Z?(SCCCKx_>9;4Y!x3548M`K!CDUms9^N=Pk~KH^@3}TIH&@ zaLf(IE%3*WU&?Kt{mmZzGCwD`nC^TPfA%*%`}M7P(`p5a7Raxb&UXaCu1JRKpPsX^ zu~}?AHKoj^%5I{5C$Re)QCF7C@mk{6!+R_|=KSh(Z=$SdZ|CClNQrY+;lj&zs|u0@ z@D&o`v$)TfFCt)4u!qqH?z*;!`TNONXxi>)59mETgjT!skG4HKhNfS7)$1NDS5Zau z(gwcOt(GXV1*w^==l|~Mc`gyEP5)UzS4BsMC01_ML3?X$jU#p*PvY#X(x};I#^Y`5 zKz_E*Elor(K}7GV6MD99`+Mf!j{8bE0!XD@*dCga324X0MqfPXwCRTN`D~ti$*ZmL z3ysQ@5nIZO9W)EXC5o`-baQlaD+rNCF37Mp-`(Qaz#rAG^Efi@st-FKDBHZ81Ts<` z#t=wG-)ChASu(%hlm}K#$=Csbd8UQjZ!l3yc&-ndYwoTMw$6|&T1R>`&2Jgnvz`Tq z_r7>>{P&E|b-t@I7Qm$%nsJlYxNGblh9 z&fYh|n0~(GuW-o6U$wOifxovPQ2>E?F&;kfD~#}bE^F0E47J+yUK1iBf+?k$=wch&1NBngp(L_n zyjX2@qar>iZBK9g(&~>@?gc@oSFraF8nqnDoA#J5yMMO!M0Xmez(}UmwLVgqL#|!C zn!w2fI_Kxcsa zq2gHM#*`=*6H`gvMw|xQUVxaYK|yOm`T=XQWqy(O)g>Qq)kuY@C$q_)r&1;=ZizMG zWm~5=fj_d3#c;!=FKB{ui-~S6?o4h`&1$jy!)8i_^fth`My#w}ULNBiPe6Z3BrqOG zA~Yn~5;0?I%~FCAu&O`02QxIhh`hWxh2ETxEKpQ=dz zs5@2g<< zR>WHW(FeXfsmf$&i5+4Z*J9x0?u3UHB*sk8EgLlqK2!5t7=vusdmVgGQLiVd-xTr4?$viIXRa#o`?{aIKbj&l)@i*f z=wrb5XOx0{`n3JB!rW!7q$jJj}NS>&xcol`=_@)W|AknYaTLRT^Y{Qkh;< z;=_=p4N!h_>95wV2ymokNVGNO=Ck>h7yp`OGvrfHO^waxE+5KlG2iWUq_TQ>dbENJ zyF-O8xa;s=ei`S-O162oymfx#f{%aY+jjTK9XqCo?ogDv1~gLJcA!p>IAN9DHPAC=itM0RSc+VhVe@G4{^Rivm1#-GLb zhnD!<-c}jLlT(Pq;yOPfzN^snQwi1egR8DfujeR)J*2AU?rv^`1moCIDFypwEyWfcGO+hpJuW~`|1q#@LZw?H(0;XeFUYIY+70xDJkjU;UOhS<2wxv zg)k`-p}TPE(3xr!Q0u-BtZY=A5o~@M!p|JuqNC01=9-VXNX(IJTYngcTQdE$M$-K^ zBCsZJ2T^(f4T(bg_))&3vgTq)C_g${(&;@&f0%;U#Xpf_8ygCshtqt?`Lm7XbN;g3 zb0hI~8;dPGY>vv%-{Ya}*WAj~fd2yEyos^0GG+xmOa=WTf%q>Jc8pMC^OD71Iy(Cj zggT|nz8x*fPG!0}c2s!k1X9p_I@Qw9Z`8&>Ha-;lm~e#%GBhh`X+D~#_<^|81FhLV zplGB7dQ?VrJ0Qdf%w;r_Mg`*Hy#4vV+|B>Tq5}W-2g?2qAjJ9L5QQjljuCjK1`XgltrIE>Pla5gV4y4@x|D<8RU|#?^93hqvecf zWdxJ}XwIwo(e~X{8}DMRC0Op_7NFZ~*AROu2c)1l^pGUA9J&>xt3Bz9!l@|#g~JLe zhUPdQcPD~xjSbpx-lpBSg*I?fIUu zC={sd?d|O$XJs>)^TV8NG+VUR)J1(hZ53QlkhxcUavPO`l|K8NW0|nNKDU*eO2+2d zOUyUcCi(^{=s*&yp$~f7M^;0TStqIeamx?8&)hB)MUoCFEqFBLRmXJOSQAD@PanFN zsErXZ=wUBj%-sl!N)$(TmmE)iE~%_sJ5R@zAm-eDQK3^-B__=5pde*EDpQ4u3q-Z&u5g{#uT91LjRMD^&9x8rK8f3_-E1n-(p$5;6iG=`97cG| zc7%O)%QS6*Z)2ao)twz5e}muR)rZ+QO(*Mre@ZPOM{QM6TrB)cjD^~`{d?YW0}xEa zp})SqPe9&!3ttv%w2Kx;JH1gfdhwQ%)4$H<(%B_q;sDVWFf!U{sg`?t8{8sHra6T&IJJz=PtdPf{-y#J{F_du*KdjNxP;t5#{~~L-^WtMN45PVFwDm^$e358BfeA6j<&*;^76FbI&z3mF!M@MciL4N)#bAcUC}UtKdM) zjf$1FixjSDT&7-ru&u#x*<&)2HEFA#rTcjy%Y&Z(xV!DU+VcM(*`PPhA%mZfGAA!D z>ieLEzJ4jM6q~>wz>VZD)`YlqfT(D;o{nB{5O8=@5a{4=u+6vS>1b<>QLU-oaCA?P z2b=B3R^3Y2rYm6u6_$~NI>8dIh{Y%oMv%LE`4=xQ94gl`N%VE;%sx%=gRf5?2*m`4 z8XCvGAz5c?@8JaVvgo>BvIL8)Fa+16xKx$-`PHS>b8*a>sj|{yp7-3{q71aLb?iua zRCNf?&cQn%v9aODz=)=&>~Y#6&CSazsGz{745k<>Ev@MqhLVr{ErY#Rg1t2sM*6oJ zrE{+egVVlov&ax#rAY>FtbQ~T8kCX_ii^u2Z7|e@Qvj}9TwH4J5qgh^>tnGWVkmTW z@jy#@v@X|#0q# zE#Mg{ZD8d}QyAT(`+Z^51Pn$g_HZ#YQ8%np+vb=r+a}hvtBW{}7j^56rewem>oIZi z_6Af{pZbhiAHr3V_-0dCWI3_`j}w8X*KkCtpMap_r9y85xuInDcW?74=(3a0t^v{3 z7K^bj3~o5|g(=9buHLz9XkPvcFOJcgcp?&lmoKV5fBu~Q{^49u6fvPv{r%;80NwAN z>8AXA9(LXhSX+(T0j-eGX5%)rP*K$Hey*pd8;L1_v?ObXonZ^h6;AJWei_{jDVg>4 zZrAWc^yer#*E$Xdkk`{=6J7`S`>zxi z&-cgJI_1kYe@@pOTO%NL2fxMJwVqLuBjcIe6VOY#QqBzhQLpl4tsCpY{Ie&exT_8w zRSDOdsWxGM(KO0B*PG5iROFeNE%r^rqe9jeU*321{PAyD!~aJY@dqZ}F~L@R)*rC4 z+G@5(?z(!+HhW)rs+01vdTk`1x9_{sA;DlvKA)>t`Vf~7zO!s;kt`S%|9$<6ilY$` z^5-EoJ@@Xqh*O_uY{(Y5N@-}yAdh}VKKFh?nWE;UWmU&^fj`nnO%W)NJnPg(d%~>W zLWMjLQ98K?&KS@{YM~t;9`8h|V`KG1 zM117p>gpc^SiPQoR-w&Ro7BDY?XGwqtD>XDA9#G<)bh#I$#3#PO3|R=z*}`}4a&k| zaDVB1_@r%vHci0X1Ii}ywvBhNuu7Qvd~7=DMc#LRW*;Y)<}x`|{Q7ZPdT~!drMS(c zk@tBcBZW%Y!MLoftw(EXwWd3>C2C@c$8ala8u_?R<5fbX-mO{g)K7$jgWOA~yu7>w z?9RP9JtprH6?_?Gne9FbJIck*&R8^ok%CVHzhh-&a&fV=YOcYa5y=e zO|1G-jc2CmlcnXxi&HALrWys`BU|>}0MZO2Q)^$5w+!u-jC5XC~ zx<11c$Hk}tjqL62{vHtdzP!ANl*}kiQ-C1Ls<&=#yuwm1{Pnej6Q*a7e&lmUt&8%G zj@u^jEyR@u{Do!Qxe~)!Q)1gqrR*N(!T3a@)0yw-b+b{^575J6R6_&blnT<|`|KZ* zPK^ZmfKwg*QJs{XAjp+}MWsU*5CFg1EUm|3Ib4I#UDk1@x0 zx;H(g0dJhJi1G>t(@+eXHY%up7!U=$Z~{R_QHuDiV|g*nxJAbfs8$4b&M~=1@7q^e z&!an_U*PXRDS%;$ZETm2=I;OJs!EB?=L^rcSXe5AJXa&m0HyX7pZl-+BEODhGx#ww zzO&Q$z`TS^p#ybLIHE!oap0)!%#RyvZ2256^L=@_I|9-hiRJ4kf8Tw2jow88OdS9Y zK~>zy@EQ zT=CfRDNW}Z2}!DM#nr`LX-`jM=x)X43>}X583q?W~K{_JN%$=>| z`}CEoi(;%sTmw~~%#hfQ?lsPJQDOQ=1E`H28I@K2 ze!KU`5&r{JWMS>kng9n4jc3|I9R;9h9)-%xuD&INPdratcN*P@S1EPZ^uAdTGDh zl6gKSyimr;84)eyvJH)eP|)Q@M*{{1%8;Eb)|a%mzk(su`i_6baUpcbK%%9ksWK2s-CR2h?6KK$igv$O z+oOrUBB&TQ#vJbc3^V1$I=dmXh+}u0W*^zu&27Gm)5+ zv_-_%_d&|_NVhF!%!jFHfskqQ@)Bzw2HW1&M3wb+pGt|9lPNme5oKZ#aqV%Oneief z-odMR9qa#<^Y5_>aX@wEg>~$bQrtl%mH<@gjhX%6AyIrB%9#Gok%J*r+YZo+=&xf) z8d^Fk&olJSkw)cobKpk=c2_q(T1%L;$}u1Asc=SxkBp8sgQ~_xXEmAYEI`7nC;`S7 zwGMo@YmL8t?H_ z=n~cgd_?3{jT)suI`pdMh>1+skp(5ob7-XEkdy}NkB@OhWweF9&0+F21|8a zy+y+l?D=+}mZhbZi%Wz|p3{Bm_o%4(r6t?$+Yt>7%k(te*@6O2-6rh{IN?%g*zO-o zrpm_U`FJhIHHpg;3Nu?vHe57?k1_fV;7$%dby`0{jzq6=?btIfA64yL{NVxP&o5oL z7)6<$xjc3b`$p$Yi8)6s?7v4E*BMDkw=nM;?`uC}dwWWRN%1G5k5bLxS~az~icdP+ z0v;=)qwd%6Op|J)<|4$$$H>IQ2>|qWZ!`zJ`hLqB3=c0Tkd`okGNFF7wLKUd#5oU^ zlv=UIeX#7^IX}PN{=JpR%j-r%6W~H`Uk&jCUSI}Eq}rUq-5Y;d<~g^uUlALM+XY3w zhRoEIW(G}pw7y^Yt~sB#{(ltVQQd!(O&fD;8cYi4h zSv&RU`;i%XNO3rpCGxme?TjyRkex+e%Dn%!sA=%cL>_~Aw%;sta)0l%b$Y0KX(@stm;HMK<|3EXkZ>%J1R3H_ z^YD#nz$`TP`)d7n^$_J>dGhbR{Eu|`PmKxl+P@amUySig{7G=_D^BptYn0~4w!_1> zlGN0?k<^DT0%HkQ#AcpP`h9A23;{sbut81T6!8DnOGrmsf{@~SK6zF5(*S;wYshSj zFIhT0OTEAq(B8M)dhF03>Cz9}o)v?34Zd4`fct?UJFw$|>E_EvWU}aF)&h6m8y7^0 s5d!tUAGrV4nf@<26Jv)TKYgNT#mCF=*cy!djQokb^k=C`3FB}7AL0O79{>OV literal 15825 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 E0ETf;6aWAK literal 17500 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 diff --git a/testdata/snapshots/darwin/system_monitor-dark.png b/testdata/snapshots/darwin/system_monitor-dark.png index 8123bcf19c7bb766870546afa342bd290a8b3034..859b1371a3a50fd65b683d0f698adf6b246b6925 100644 GIT binary patch delta 8311 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

*>s@@=;)eFI#%!{&+^X_fu2{u9 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 Y0EE;A{FogQh5!Hn07*qoM6N<$g4#3v{{R30 diff --git a/testdata/snapshots/darwin/system_monitor-light.png b/testdata/snapshots/darwin/system_monitor-light.png index f8eabe15fa0c50c28698de5ba248b0195a696209..05429c03d681fc9eb59301c68d6f06947ad8f08a 100644 GIT binary patch delta 7946 zcmch5Ra9I}w=E$+NRY+}4#C|$I5h6TodkEMv7O)=EI^QkgvMQiLxMZO9fAdGAi<%L z+uwK3f5&||k7t}(d(_k3d(~QN&bg`zzVxIf4mF7scN7y91qDT(9en@=AWk@lyxs?aS6rMtE9wR{~9T zM>`&Kyt)wgGD%?Vq-#`3i|<{l0VY7HR(dXL8iNwX8?D*H^FGDc-O;?aUJ9Z9hLfBp z@Fb&h)2jy;@|3o3%5Dp(9aSAwPfCd-jyjyR=#d5+Fil_)^dyzZ&xbo3sr%qWT6yv9 ze)%S;0ewwOM8FV}F<6jP@F1N!!|LY}QK7t+eK&XK#d&a(_M^=y(4UX=7+86eX|Q5! zwmY`f+abcq@bG-*c_`Yywk;GY;Po8`IeomG8Ks0{-@@w0-#|3wd&p)|G*Khsyj+eR%l&n%_-%q~Z zw;Y7ylA(no2JA(=+Z2GMCN;L{!}G1pfeTkF6REY^^O@p2<&gf?4_3saY`Dh~N|_AF zBvZ~pTOyseZsqqPA$w@=<*G>X#5*6nOkA`7#0*A=3q$<*qPDAC=GTZ&QBk`aH%Ryy zpc)1>)$e<@!XqPw3-}66$w;Ve>v?EMrCcFWDsye2QP!TlBS(IuF1eV$*> zQ9o|wD_4AA1VPBp2^TvR!Z;pgH$kKuPj*W%QJz3-7pci}*v@cVE#?pwtZNAC>s zWCpsE0>}7E$qR?Z$8Oey-|R#SD~;7e&|`}iAHc<$LzyGb@$)h882-x&0@0q|?Z9tG z(t@EhJm8s1xQ^f|uf0!67igJdAi3?^bqg~9ELRJ`(sHc{qH%W=A&FMAuBw$&dJw)Th@ZeP1iN{~OH zRZ5JY9U9k9KNcx*w%<{VR2#d2UAM^3@Vj5?-p)SxAhMF&MJddY#JN4=MQQ4JlI&V3FbL%WG+vTb-(oBmO0qpx8lnb zab2gIdB=xO9@?|Bu$B{ya=O)PmJKfU>cMDrYMNc+FswyCvQ8+iw#%Wa#`3EDs*7$;T1>m1_$Ne41k;(|&Vx3pg6DZ4^K^35|KBv*`H&_RXZpchHc)6OxI zR%_P832`0&0(0ZX%Y!EEV!=0@E(xUNyx4I{vAdBN`L^QrX=WWZxD|Qk_>OvlO_|u> z8Nf|3EVR`!xDIMN_6T z*ghVF@&bY2yKDa$+l1%>e-IPwkzpuo$lqldyjzO%&u`i`NFwDpNDgNJO{kRDnsqH6 z`Q{S$JPX#@p+R+?)LXNl!^undt)qdnDLh=6Fxp({Q|cHFj@l#bfd1bs6-N|7)c>+u zm(pa4!eCXW!W+m9c_T(oP3=~{EhjK~dU`76{p)9CzsZOJr&QoAytZfHXXl(@qiq`S z{*h;@Qzl9J|5?s+9gB2dzb5ACX;_{eNI3=ch3hFAa`ei9K*G1c4<4Gl4!dMtz)dfWx@>Q$sVJZ0`a_QSY3L8K6^~z>*irwZ&W<}mD4|R`VDx@u= zAqgYQD&Y3KVRyQsPp5Gyv^_M7T@cBq3^w2Sy!^ZTSS(@&WpF}_aZbl);75&ZltpD{ zfXE}yS33V7^SN#g?E=gr+;}2`gvrWC6Uh2bZM%_Mr9ajYW;3?p&KWeGNCvM(+|$Iw zn2b7pduDszVH%qAtUE%+K6+K$cfBQe!1|j!SdlBh1z&Hle@M{!illh{5Cj)>ul!9O zX%&j{gI(49`3qcG#qZb-Kr}x?T;FN%@fE*CPD{wyZH};)O025blGrxY>4fCXsJ*~a z2()q46>%F^U7Cl1XJp{QlyE&~dX@yS$uQ2JhJwm70d~TC)v|K_=zOEO*kr z;cWeBih-TW8Ku(#=8z^Mz?UY3!1QwN_`5;l1HN_kG06NKu+nIRpp- zfm9+8t&G*&tT$h`ZSU0;cR#qh5Ycej)-O^Bxf!-ORJN*``Bse{3+nh*Rs50unrgC= zscYBz#*D`G&V4IAf$l5aQ}co+GUQpb7w6{;>dGoXZ1_DjEFMI0eJLY5W@S~M;y
-e<1=;1Mf#`jsP2fMO;+;W&G#wX7& zEJdfniN`cZ&=#J&?>`mpXa198QY1^u@gGHNvV73JP+k zBvpuxY(>FT_4VUiyt%#}4e}@&qaJ$47ZKOJ*y-#MZ&*DI>!?ZknPgL*ei72Q?b*U0 zGbLQ|Lx#Mu-;!rge7jqkE=_&hlIQv%D8dwK9us^wK#mq0!tTu+g_4PWCc#H86pp znBmGy7uVHe@@>9y$|q$Tm55XCp?xFnG1;hYY==F51`1?~?*lK3CGz?&ZD2wO`&I!- zcqeIgdvJScJ|sNyOXu?OS4Y8j!p$OWR^e~M#efgmQEYiqh^u<-uwVg4oUoxU)F;|q zxX-YsX(yiY!fBN~AN>%JAnHcc4K(H^k<_6#&0RGtT}m%muyL>y+TPRR7$ji_^c+9J zNd}^e3pM0ia5w&lgcnVKVzdYa$P;=tu08IY6F$j%w3s%aH@{C##6Lg-la>XA{O%q_ zqyrPX?xNtZ$uGj^W`g86Q6psikoQ))K@H66p|CU10TdEw63; z&E4a8_So;#K4wUexqY*^h8X~Beiu&*7SH)K(Il>;uelqur5dYxE*5;BaJ!VX^gMjgKedBSL zGf2T8xWZieRdrTjM?B;fm@MwVG3x|cS&u?0e#(5tx#&ZmDwBF{!x7E0QhYpt zqBe#qhud6x#xC(TagK;@cj8vluUT}Fk1*H={EaeRRB$#@Q;|4EKFCcwJbj|eufY5> zqPyy-O{j7;e9QlK^qfa~;h(I+ucZR*Q0HdSF8_KBfe8RwJc4iGHR$fc1oDoBpXJBM#83l&O<76q29RZWOkv-6V`^c85) zl2+kE_qpyZ+9?zb8ZM2Uk5`h3$Ws^M_jU*KuAk5=*^)Qrjsh>eF1HQ+vYZ!NZEhJ! z;@X&94*-WVkDtAa)k+VWXWZt%jSqIub?zNbwop=2cXhD%b>m64l^7IB=H_NK6SD!2 zAbe9|61HZ^LoPyzTQ`J4d(S70`azoZ zrwd*2a`j-UHn=g>9n1vWioO?kEfCbX^%`<{h-kSOu@uUtAWi_olGU0UXM8%H_NMS4 z$fIYZR9~eQ=!p_a!7_ys5WG>%E%BIgVejI~=;a!#F$-<|39&k5bd;FCz4%%^ltVF( zgJ@~x>Cz{wVoe=7Kbl{66d(^zGOvDgzOqAV)9)-3`NAmGY=9zrs6J1*w7bceTtkXT&!expYF=>c3Zrpk<=O95}d`FK7uv z)K_&PJl=uB{_Z8i>bGpy;fh`(WyNj92lBHk*Ddc*G0|Fayy>N7F+D^mNl8ghN3Ca> z%h*5a#V01H_5cOteEOo|;wA*_Qk7U{i zkjI_H0mxdr9=l>?aD3_;uFyCSxbIrKBbD9jfzmK>spSM#7iw2kRaA*-M_4UP6%_hS zv{BF%!1adXwn^K#Fwigxii!hXyjFfjQeIic$TNTxwS<7Uz7E-B6$bfp#qe$ z4YKbY?O*))RzAUL2_h8&ka7Qq{Ha-(<=padCE%2(NZ-iu>7(yyr(q3V@ z2pb(7tw}7q2pB#=x9K}R+UH!b_@YzR-rk{aTS0_~Q>Njud8X^@xBZD~(v%!0bzpl_ z{;*|k^JyOvGJ`9hL|+Ts?R0X-Fabp(UH&1Pccbc=^gZ;9&s6YajVtwojnqXZ_r15? zZee~ci!IAN&MnRjWV5kRDQ!PL*uO>`cWE+^jJ4QlEM*BC26bdK&C@4J$-<_$6+FYW z0-XYfKBPpbl2i?uPS5;2U!6R0HWouzYu%PsRvpwU$}6sSnP5C z1&+BVlu-f3xnXR2hL?1!lk^23zYvidZtGgZ>W8ygu)-F+c~O2oP~kQfuYKbl9Ab2Jz65eas17|(~LW- z=d$)|cM!!y!=>R!ew;c(qc>_qvi2J(5si9{aTx$76BVsuU(FR^9v)2|o|}WKw^(wQ z(rj@`q%yv23>M+@T}-;{ZoJ=n{nx$zn+iTQKFcja$%ZrD-&pDS=@|riWqYyA?uSFB zqU4N1`9-mIca9ou4%3GO3Q7zLs?|wVd#z)dH`L@*z2cgxn;4(cVfVBLb5uu|%ObV7 zQXh!JQ&CYSK*V(fcW8df+cUVJNB}2*Q**N7MXg4r)4TpQ2}ednN?cQ?Bk(=9S~@N- zoiORbe&CT&Ihax5-^8UeaWanhFmgbTpkkG-di`wV2~6qH+2cac6A^BlRD!s;BhDl3 zx{_~mLLV|L?cG^K7(RRR6h4`iHgZ^uodwum<}cwlyyWr&}_)yF2k=D_Cl zY=5`Se0jbo+1J!=2NB|l3$N#@58T{bs>`eBg%U;UtJMZ+!zqb-)+T;^xBT%CT6Jb- zTTezuBq1KaN7K@*k)6{ZtSD@LPZ9uhmX&!4cQ8#SH8ovbpbX7V_)P}KoqC=9 zHGRz|#s^X0>;Bo>D}Pz#d`i$u`e!I(2K*_!&$@Qe88#{MQ}~OvlR4xsF&_;MF19iK zTLE$qF}2PN`;4Pt0{Dy&q0U5aFwd^5W)M|qF*`x}Cx(f-hv!4a7mHaMD#CkUEZGel zspw9bm%&qA(J-pH&3sB)n`2ZE#;QkM-S9n(QdC<~-KYXSZI);3i=FEdpGkO@dVp=S zLll5D6f`0;np-;SIQ%`gLi7eHbQrhKUSf~r(0$wrdm1*E2;bg*H!UNBsf@~~MsgN3 z0MW~1W8erM*%6C9z|P0+J8b}V`fmEFyY2!kwP<<8Rm^dvQE698r8ocj%O|Gr_<^o! zCwULUL6KIkK_lo$h1PY+`B9=@zUuG#GO|=qSC=rLBjnVg*JnfWa{FxtGgqFZ&#l%5 zokcP?Z%xe$MUk5n+1GyNoB6%Z(xs%C)Cg^O2S*)JNQa77C!MtwD`1$B75u`sKREETUZLB;JG5&{yAr`Ec=jgivcLJxK2Fj4dBGC<)G`Z+qly=_VF6XR@E`M{Y zH{y*DWH6L#-I_~s<}f5TH87iBUM-(KPyuDcGFmgGvf`x9&CVc2{Ls6#Js5Ihu}vTT z8a>wxYW9>(6|}l^A@2ES@JDx;Gp@K8Q&wNyk&IV!PHvn8{~e>clD(3d546s}K`2{w zrw|f&HV9D0X_JIaod-zFM;spfUYeT%S3qL42U}54(4Ca!W!@~r)$z=G(NFH7VLS^t zyAVcRplL1|=o-oWR*RX)J4i&HlVVR_9Fi|6J|dFAmCvEXj+q%foFSodp)m=o$PS)& zx6XXwb5Q__nbk0>ctnz-?_#!?ySsb#yjy|yz*wT-l=} zn}Q8Y?osxf4ToWCo2Xb^Ww}C1+}$Og$etDfe+TQJZtWcg?i{A!@8mdO$^i-VTmdnl z@~+ME5MHQX&M4`*^LM!1K%z3GZ1iS}5}oh`Dk%0J+Wj+LW}% zU2WbbW~VuR>9Ra#>xFEQliNlLu*u)tpDl7MUN1;BTMnV}L8f@Z>EaK&&93%ZH}5vX z(4Ud1fpt6y<|9d^7vo7?iZr!6w^m-M0(9xW?A6r5|gq%^);EfNjKbk-BO z0%`$emqfLeB;?dflXG;y^G`{_>V&C%rjL8KR}c5*N_tAj9DLH$C1FQAWS_*0#m-mo zf32782x?!uJ`w)ryeexXN|hOGiFDoF9S%>dN8YG+1UjZh$CZ!BInl7OvWS`n84|Gk z1^r>BGEL4KOdPVleRfS)|A}7_Njocx+L-%1gxBTUm*C=QU0_Qj;2{(rX@G#F! z2vMHD_ohJEpZdj!Z0GjEFEG(=U7{bn#Gbx<+9qmyCP!dtY1yUhmBmVk{m+1B@TGcy zxqvBR+IuO44=oz<@>_azy)|wtidXg(!~fO;{I7ZX?;TnEPXt=foWxatgA(D{Z~R)Y S2K3L>yRw3Ye3h(a=>Gxz;5#D# delta 1939 zcmV;E2WU zNuZ73FiHQ6DpXCT5fUlew2=+EDb0&zY|@GpwMo{jtF}q4rgnLey{MusQAR4JX`m*w zSq6i(q7@WanhpxI4cM4qY-pjjA=ns0j6I!?$8}x9pyAIIzTY20zI%=+h!-C{&;6d~ z10by;khp(jj!Wh~8TrKNaJDtK@%enj392*RnTG2PB~O%utVpQ!sww;UXJ+A)>)?0m zvh3Qvnc2S`|IL_jkWxx^;MwD#5oiP&ZE_lkG?EIC#AB#3;+!$^;DOOh(@yZg0< z2k0Px1Rw!O0Fq>YbmWO6C1oYXUgPBpmrworREj1g)XUJ;-1gKnPtgY#3>4;373Plq z;lbvvnMqIb{ps1o-(Z#Ud$enB-IbxzX%cl?h40I^YikO&YYGGb<1F#wPZsr0hC)fd zR>ObLEs3^ov&lT;oyj%i2CvAum(M*~_~>K%9uqDIdH=@ySN?uQlq3cGfw{RkmSxZU z_DrHGk^Te7g88`N-TL315B0Wb9@u`g@-E-F*Q%0K z>AG~Y$?UW{bs4&l!aUcIdm{Zr@Ihj=SQ~%q8_R!D9-k0Te;QdZb9a4jovjS-v>r1K zUjET(-^|_R+O-h`K~_7G08(yVu5GXF!Ydd2bAE+Faq#fL%pIA2zyC(t4VGo~+x4N2 zJCDc1vaD98r9TS0_F{Hz+XsE(nF!&Tu#J8-yEcL#$f`zKCpEZT?)ZdwhGC*A%u#<| zt|i&EzgRm9A3Sj8IPBW6Ys0R+EW0*lNSkGbG|xtcNk~kfS3-eCU!YMS;I@y8XN(5l z`iw;1aLOe#>X&Q(%hi-@ z{gm_0g!R)|kC%?mCp61h$gZ9B_``qydf`t4t)1d7)C12RN2fJ9t^ra14sZ8fCM0|Fp$hG9knO_K(B=Q{@GJ%UFzbqANb|qmxEt!1Nh|tBmhZT zK&pE3SEGHmBf1PC9Y1vT<1kwbe_jf|9Q<^xTW61_qY1VN%lT0okfo>nTAEF0Yr z>ht;BF1Jdp3hkU-1N#tuQFbzC?=4m=8)Wq9TDoof4=kPOP55b$d!uX=gRZG^UbCEb`?Kgr($&$mBYOwE zA``=-AsUIDZ;ijdIQXA#*QmojVDnD8>4Tpqjn5X|_vq7-GSfJ{R-KWm+!9L%5d=Yy z^@${aBz_GI4%J<&8+VTHFWMisB`$P7ygL8e+1=S)@k|B1K`ig}L@c=ZeRH=OTj7_3 zUk-jb_~q8vF9&}hZ5$x+`8=P`PmE7g{<%`2P!t_1q9gOM+_uzK*Oon5wk>V3w?x8k zm7!*Laxzs66RU6%;v{1x>lm?ikay@42!bHUJ*487&(n_^3rMa>SI5ncec#&0FpN4$ zo&R9IvDX*@B!}Hmb*bvmw+|V18|XcuG7AiHr6PQiBv*ebe)7r-i?=o)2!bF|izI|Y zadB}?|88n+ZuR^9ZkPMkhqpw9dEduRujy*dRoA485V9+GSJ~0B*x1-NUVCH6GIZkf ziI%rp>aKUy(PxD^{ru^zDOwG&swaqHHp+WXXZPESA6tGk}+r+cmSTiw07J4!=M@hLtXJ{A_%Q>AzE znpjxa+V7CKi^Ynv(o$ZSS0;WmQ`SE1Dm0FR`X1W3R;{4|=f=-|Q1F z9fEPljbUgWjQiij8Zz2MImk4A<(x{D68DEQWMZ$j}_se&yancYs03Oxe3TdX~- z?Ed3kFzI;Jjri=_w%NJ==jlYQPh(C>*4WNp#7{{W@r<5cvgXi$yG zFhIG*0B^lk(xp!3>a@oKo^DFLLQg}NpP>S@+z^LnBUF(bAae9d9zr;CR9GF@)7rB# zHCbMAQ!e`ub_8xY)jq@vnc!^r> z-Frrx%Cc}pi0}UF3d{!NedQqvUC9Ie`swnYpFx48;rTB?)lEiBw}|9}Uy4&*K;ONe z_d^NGxf9zxnaEaHNN>r)**WzDT13+8e4SqT?m9tTrDqY?u35M1eq2^n<_z9`S2Rh( z#CV84EegR+$|KlS80?Yp9daUwiOC0D-B6pxBe!v<11aV3APrt8f=Sq1##bLG8ERTrs!$M0ejwN&!npLx!J+n)lRSxEK47i>i z30PE@V*BXG$o5nUsvo}hq1c?1jf5{gwlMXVzHxhcd?5FLmn2|fJ>hWmDFlgxM!3hr zh7xPp$*wfB)u6LZUN3odvj;4+eh!c&F0b3d_Acr^I;+Tl_ z7QYA7-j;QFm0nyC<7ZD6)GejwrTvZ`kZk27CXCzb?BsbL{Yl8q#!FrGUO#`Lt@};k zhT=d%G=LJw4bnzBfH(Ah4%p+LO^BkVPh9aG&Ko?>OEpz{!{)BY>*h)w7tdzzU~H@< za*655v-8VZUJBWr?tZhALae_hy1Zc2*E6Cy4n5wlU}jgww09q$(AQ}ny;G9$xy>0n zDSyF36(yhFx!#wepa`27jf{^bqmo;PyQ=cmSTwv8wltlcY>cDVW;BM8esBuGNU`8Y z22hOGGkrxsLH-~#E_skEA%XyDwbm?|gUR-(p;AVy{H8UZ0^*>ew$syJfLE7i;#qvn zMj%OXP9Cepw70}j|Jk*2#0PjCG#YZ`K&=0wRr$D+|5%xNZih{QkBxO@C?S?E4|NGY z)qC>g{_fyrhYD@?v9+)`(mX?)zgeush$=>2Q1GlfWL_!iNwSufytbD@m3XY`Qu~Md zO#r*gG6VZ9+LGpJa&;e z$jYqu1@0*GL#Uo5$}1t?Jj~Sgoj$(0@ejHasTObEml%m5 zNRX;J9y#8sw~1e5;fa{ZgmGh-RF}`m6uw~i#;|52Kve*q-WSQiQFUKAF(&HwSN9)(b9|AatdXB-*I`VEpylvEHx0TanyS)Q`m<+zhNuU5~n`r*^hrfTT zR4{7|n4=HPrAn{@ko~7x;3A+Rh+MvOt&A`pO8k`(`oY>K;`j4VUX0D~C>NIkjiO_hTA~j5^Q$=v#j_0Zyf239@<8@eFGa0{?yyOZ^6vussiWV~ z^U(=6HF27}@~K9yFXg<*+rLt=+TovxKDv?rBxDFe9i5AH6_uinCN))^ z)zSv+?;MWz*YKDbq+sXp0yhOj`TF5Ckj7wzg%s~0cF@O5GqH-~(8Ff~(q2o;Re;-{ z8@u>X@~jp#ZJa;HZ9rE=F-|URtzN^$lheXYeUP(>1uM<{(Iez1e6w@Q}*new7FHjAJMO-^wS?^xeH#M>oZR;(}|G zptLlb5g(bCz7ie(*4*`icydN3af zO?;xu!)emNJP98efc1Hg`CrgXN z%V&_}Ih)+t9naxSz{@8ibF8kdpuE#GH~$q$+FzFP#s?;9epgdK??U4B#uyqUOfI{pb3-|s3Nn{&R zmnXr@6jbT8O7j*C&193sYj8o~{@k3LYTd&!L#>3ZEppO+fhTT)mN+=9hLQ-rX) zj7hGXJUOasifF$qNGmCgL9Z?(A*M_gyNlNgCsKa1-dOrtK;n4hCbdfLYf8 zuRlB?4Y;`s>aqzn<^rjM?<@nAUvP6VI?&86`P&`VN^6ycA}$XNO?*)OE%~$JB9$rQ z@P^6$h^Gx74T!C+0~@aC;d4x_?Jj%Yf;1~U0&n>b_F|~&RI=_q-7Wb6X1A0AzjSjf z3z~2r9}N+O^yWu?K96PqNXoqlS@n0&`CXd3Zk|j9MAMKCjCb;I_$~~Nb)`XW({!s$ zI=5)yx|ptgulnoQ+I$hB%Ok!JDDUssY;c^E?2;cUW2oD()5IG;h06HxwKQg|#q&~r ztH29rXtMtNIG>j%edLotoB=~@v6^PC?&juk2ZsAqsoCi?rf#+NPQS&#U5hDEHT#IiieC&CIkkrTspw5UOge&tYYGaK-5N zNr+QV&uK2PyL{O7Np$=3jl#%9`j~dCCAn~-Ge0xklqR`ELk*9H4t>W~2sVy$mu0Zq z@}N^NvjAbym;LD%wfpW2wxS2&gB%TA(qb?~VRfNq)dxidmF4Dp_v|q$fzRz-Rq>J9 z?`>X_yo_H=cN5suu(p|NTBU>MOPZ?6o8;XV7NYU7^IKt9JmznLOOzVzvQ z69-8)$GeyypAKN<=9Qkm0x|+Y+!EY!bzXo!5ZDO6%=)~pmg|ewPc(xKf60PmnMop@ zqjG}#FcB3HkhCk~v0MC&(bRu-PUZgYR>lJj#wD_{YNlbJJHdkL4SAd~ zmX?*(3E`Yre|dtMKOdrD6Z2otqSE*W$c*L2MjM4TofjYGIa^0~V&1=xAf{hJk#s3Y z1G#!GwulWi16L%=J6oOCzJlVxA&;N#*|dIS$bzwpws?-LdV5VaLa(hD2yn`7lW#P~3vm-~}Xdd4F#*xbh%B z|D=m9D5#BeGFAE3^kera_!{c#y$6fRbX!}jZoMHfsnEW?^?igubA6dJwov>B1oXCc zc7pLww7F6%{H8n%#)jAXdw|xa?VRbqb~vB?b-cI?g56%X=xt2sK{35QS_($|-TU!1 z5o3J3)bcWN4VmL-xRN$DDewnu4877AfUg1$Qfk>J#C4JK&0m(O@-}x-o>wo6f+AHo z&KF^zM!R!9)(xMPkrB&Z%IZ-8`};Pg6}LOz+ZPLe7;obe2t71v|Kqx&k{Lkqn&jbP zgJsD`n#{<#zq9jtQi%)6q$H*aiyQa48l$Bt3vNCcCJK??)=jS@7NMW;g72FRS6}{w zNj%IODnfdv020owdlYZN=&!u;Hg6K8tzMdKv`|D4)1`U7P?zf37e$S*;I&3ayIWbM8n^W* z91DGlTuprha+@2N>AjVo`RhSC7jao<7r=^{Pt0q$pA0_3#rm2Z`{VplCw2Z#b0D04 zpoB_`v&My=Bx4ln6u>H!%?ok5XA+!UJ$9=YNa;2s{j%BXEVbN4uWoYd>>madh4c{w z$zJ^4+uzuIdE#oVHuR5K#WJEkddfim4<$_)3D}50uz>z=N+5?DXn>y$Hl@xy8ooP@ zE!=-}^nkBqJ2;ZH{CV1ov>;`PV1n=Ar5)O~6+VPo%A@##Z8K!-)Fk!5eW11miOJ-} z0HF#Oq5j*9AaklT{Sz>(L)hqTp`I@>T_5axa~KTixIW9-ls@lRwK*A;-H7-}90ec) zvV-0szad!QZ~hkwP>N*07!wT2o7x|F`#$s~sD4YxVIq4{IPgB~l70^5NUj8{gR zW9^!CSv#%5O6B&7!MBEzu)mm05PU_VtW5A=HQMBGTkF2G0z}xqVnU`y@{|8j+aA-D zZF5^pw8J)j=VadTqS)z;?uf2`q{?UxX*+27eUdzc8oj=~&-5Z&h-+6d%T-M3zxi4p+dMC?<_kSo#9SxiRV znDE2LA@C8#JJ?dk;n7wkNi>k6>yz7aPmNG)BxlYIynOypD}QP8dXP z3hHS{h|z+8_yD!WnStQ7Wt|T?*C#IX&4d0=gGhc$<#(}N$wq_}pgAy%_;Vg5ndaYC zjm;u*8irymSaa6zP!bWlcG&g>KVT`=bkMes%dLs)FxAz6dmOHz|F)zgEG*-S^fFvR zOqrERde=7pTZX*=P5RqV9UbUTfO11i!&R;T5zCgOxe>Z2fQU&3#KOtHrvs!e+ubwH zheHtnL%9c#hKfw)Qv{;8|H&_j+;KC3xmlh^*dX1jXQAJkl8cOLZS5vmLc53J4I2Cl z?0_DZ3vqvQargVB`ij5mrM#a-;V8N?)K#Ry7Mq+#X%Y$xE$pvCddsz*uf`!Ghqfzc zvT~Mq@Cr6C-fup1SAXxHh=-WY`VzKDyoPWC9p`We_c{4Ud+9}wI5ySXOZZ-u%#4L0sO|kFXr(rPFs#KZRi>9SrsG3yVl-xgN8bdU|>6>sVl~m8OsiL{p zof!yXK{td11!Ka&{D5^6hU5Dex9vqr#Ln-i@tF=}*|)?+%HJh9YE%F&#?C7BD)(v( zJ~)W%P*-Fd8oW!A$J@W~ZSo)A-Lh+57`BSBkh!rv*uwHnFkwa^k=Xjf8_=@Q;}v=! zD97ew`RI&-3PbeW1zTwmf$n|W z-IW(An(zv`yharL;_#m2(NXLHZLT~HzT+8>c1#To*p2Ln%4~vHOj|?_{i7lI36T5= zjL}IQp>CY79vtMb?^LLn-M^rV6JuW6o-|=Y+5d-0H9z=-PV6^U&wn-1wsCp5>FAV| z%-^je&-!_1=2xrO9E;0CE_!W@fyXPTx)E0(@?u;UYc>V!evKlp-C6xkJk3QFHfGY` z{UCm`4aCEN*N5!sWjdn+z9s?nY~K41WzT7-#`&ZAuFLD=$;ZZcC-aYeVYvf$*G}Se zar*P=NlAgScme3Z{o2})LNWQ@+n#!$&K}3@+w!N0>*kG*&O=D$thQ4R=Ui&4s}=B$ zSIFDkhjv;3FT`nL!^B+@T)mztosG`F;N*;$XPGt$9Mh{4XJ=4)<;REFok3@S%vY9Z z&-+7K76vo^;$SMmE5IQ9d}sV`tLMEuTAz{V@m?;;%LlNA6KBlhL-KM`6gT*wFze+C zeSiI{M!Qnc3oTS!dl4s{_JJjrUGFqbz@YCe4?PiQ>4ArDsK&}HGKl{o0WW*(lfX$z zN}g0exD27rPSiavI*WRN&vbaqPgsOq!k#yN6AI#cj%m!UeC_VsE9KaLJ#5bd^w&H0bOX8VCGRh`(xX#|7gQolF*r7 zbHSETf@{+`nAnM$&cVyknB}f3Gp*(7P`v)?{8TAPb&L^j*i7W$lF_y#*-B*Np%QAl zzZBpX=Z6=6|P(PeG>sOrU?q&SV4Igx=*lo5BQ z_gwD1{)@SVFKqhePaKw`G$#YIjKrZOBiu1B!YHDXl1g``W>kcCbI|VA61-1tYOJQO z&o56+;&x9F-K*Equ&@7HIf5eALi&0(xJ@aNnEI}L)Lnp-#{z5pUBw`UdVDJD<#N1jEAjco4KGT1xzQ}y+5eN z1)sd;r&md0mm7vBJ3H6n_+A~|*0+nWZ6+K!yuvH^{sV4QODf$RR9#&q{@Hn26w8)N zS4yiBPsD6YxF`ne54ZXLJ}tfbGfmppBp&pXx3`XBG0y^5UNfV_$Zejap-d?D)F{8B_v5L~ou|8awCe|7^nLUea zLp*RrBu>Gd6Wx=nRk!v74s@BPcb9#>Ml9O)9c9_*p6PW-= z79xXjEI6-+9QzT^aHU?blLW>LxP1DwHwN(Caa?Hp^Dc?~(aMPf+Z$;P)2VO5){;qO zl!;cz_G?v)`w`1zZdX`QIK1rfO<2teb25~W@kr>;yq%tkT#LMfm%-`J1~v=gs68cE z=3Mii)|Qq*fup%&|J?KO`?Llbd&SqUS(edl7~jN*#eU6dy)kPdYiMOv34P(0$blq~ zTKvT~z20rQnm9sL$^4uzCKs2%nPr+Ak5*_} zq4U06^mP;u#8@|dta0prjE#-GffJJ;xwuQYgl4(x=9_gxIDgmB3BO4g7H9| zjV8eN^~D!k9U?YmD;I>^)rz0=A(nN=A^5<2b+K0;oX^#YQvl3;126jDeg(p ztx*)KtJc<83r||y#rE|1LLP#EASPd18|8H}1CXQkK94x_=6Hfjyt}ot{}c9Se&t+P zZ<)BPr>@~LCZx;jP>$p$jJod68;!Y=BhsP}VGu+`ygM4e)^mC0u?TqMG(zx@N%#0g zTua@fk1b7Wa1}agTufe&kY3`amCs)&F;iM-T`a4sMZfxp{JVM;Q#kzkmxAWQfplS+&tq-zJ=T6Q0ggQE2{R}X2P4_-f=3hGSXYD0)xZVvy z)h|Hceqj5zGIzUQu|%6kj#!y#ziGa-nV@{^OIltg*F-DW^N1zUpe9q2x4rr37b>*) zOB$8Qi8CGxzgOG%6{FV>gH(RrtEu$W-tn}&g~8TaH->x}%gO4@UK#8JbSz{1rnm24 z$@V%uMYKWax4MJ~amedX4DKg#z@d3iLVhBQX4O_Em1|e-aCQq_TwWUEN^&wtH9DwE z$(6Sw;PFlld*jxpr2e|byvrRtL_=^+O7%7uV`1BG=ed$z6^t~5w-UWh??C-Omx~$SJo(ZF< zaj7XO{d_uUX=xAANL@n1I=GU5y|6P{q68NDWepX$E4sT+hrk!VQ6;eh8=I8K7!y_k zZTs32`~9V@8tKfZ;7*bjd$dohqnEl*t7x;u71mznWu}5Z>!f@%QuX@hxEm}h$IvG# zBEgTy&GXAaz@{}*_E;^2ULreJ;%}AMxI`*)@=6UIUMC?vjxrNUy(&@9_a!HIhB~Gb z)=eaGkP;gSkArsC6OR&2PxzV6WJB^ru~_Tu>T1Wt!mtKCJx?&R^U7~xLwIsw>-gMU z_zBu@X`BbcJMzJVV)}1~YpAFvl8-N7%HrKAjb|9YwZhtQL6_#s&!OVWA+Evo4GmLN zA0(CC52!<~O!i5zLYf3x)XA+G9oATFlM-ozgb^{J#^Jc(JVH`8z5`>RCY-W2^_ z(DS@Xb7{Wk&6`G>)z=l8`y#7ydAiYhica^ap-YVD5GT&6CZx7+Xan_cv|Lbshye2^ zF-j@FwlLg|BYdS-YXbdJ$g~V}7U2sb=PDa_h#8)qR((-h_#SV$>zWy|25JfsZmKo8 z6ZTq3H_bSUtuq2+HUlFvr$e;4b(Bwz64^UACCt~6nTkn8+l_R%xPG0ul$4aj9{am6 zaf5>LTnYi*#qg;q{+nBWs)n=d=`wyoj~kD(Vst2~KAd@YwyGyinps74Wa?OA*h-XJ zN4lk$#CwZ+Y2w#dmn$C^=k-j@|AA7106A1_iL{c;L4-woZ@VfPtyUq5-m+!Nmf?D_C0UhNah4)#*()Rb1R#siS3c_Ig9epuITF5k!I* z1^%}1Cc?D!WU71ZQmLwggr z22WqU{?T&D0iAOT_O=5&{0Wh4tTj5ED>+Y}F4NFQX~BEE3pDSpbau9nYKYyFLTc`MRZ z|FsqjSZHgr*l%D;m!7m;*|{U?G;7lT^5r;Rh7x$!0<5zdJAlQ;b*%FgrEqWO=xZVG z6#@mF%r~8b8U*!9G^M-3|2&%b*{<;6?#Mz;U43HsThU$ocLf^4$KmF2{VFQ$o}Rzk z?rL#Q$0O196}cUcjB%bb>F7MZ?~bp1AbZ$9{LONBU5ZjqbYFOjMj+ESZk77F)ZFZQ z9cKCea>c(*%vaK*%j2BR_-;)IHTayT>U)e!{;jX)hYy0r4qVil!u{#|GO1+hB<$gW z<2kA$;2S8mDxV9=1st_jk$@uQYL==PjvWMg~hd# ztWO0$XlzlHrY$|@Cke&-P3S&vGZyQ|ec|Dl+eEeI46L=`d|L8wz+-8jOYqD z_3OM+ijAf^<&Cc7iF!WAuTeA0&N#-cGvoRO^|dJEzWf6S)DKR5uj8h4Gif<*P@~J8 z`U!Mn_xX1k?DP0%oCjEIN`tyDSPCEImwgW7%x84pT~uOcj5dD2l)y;p0UV!a{cNNvMueXEPFvHTD!T62wL&F3n*4jHPri5$P$(KnJyY!vxBp)+w zAufddcn@;}O)>sWS?W(_kRI~BK_=w;9wfMhQ$0T}m(I$?Mp?cH=N=gV)|$SmS#BTu z)$441A@3aSLk~&F?)vIt?r|SLKwXmzU@H`7~NKeMW2|n$)__=Qbvbke(9D1^s96%@E*H zJ=@))QGv$k;8c2lU$DH~ddE4nUfsOMuA1<*3uYo`wzJpJnr7Fs;7-klvG(1;eM;*E zVnX_FHtYJkBaGU$HI2SxM#cyF`5qLX@?TkfP9FZ%3xbb4u}ZHa1RTsR_`-hZoxxd( z?mDk(!9IRNwP01RtO4CLc*FE#X=&LKd!T#m+FvMVN5%3I;!g4vZT=zoq{L0bWz*)| zM7;1Ikd#tKkIwX3SkP70G~8TmH*XieShK>y8qND^J3pKa|MXf_Su&$jIN)^cwK5f? zIM9;W`s~6kk@gPq-k@uKP@(nqep{YBRmu1Avzwcn(OvJ{(h^d%YL$>y@-y`0o?bjq z!r7?4Cup+Ow zdHlv;O|<>}8+%3EyMqP#!HAjJXoExzTg&^!>fD#V7VWzN8Ru$)-n}I`Q${dj1$Q^fW49v-1<4 zzGmcL1@I>X;VeZxmuBNR|7P@@;_t#j&IE))`dObhFyCq(nqKYb=!iKE$c7y-E!-%h zw5%*IDk=_KY1M@=TV%Kuyk7mZnj*;MAKMP3Y;BHoXvWv@TKgAPh5TV3LsJ1?lwJWAZFEv z2*_0Yn09$V^T}l~Ir67&nnbQz(d4JyoL{f})N1BjlRJG*P3x*+E(t_DF1--xR!4%% z2hfPN>^t}rnR9iIjxJYZd7U9_V*}8>04T2k-J`1f5Pm-?4DDWdg`mz*d?0V&9kxktH>j0Hd#Zg=2yV^a;IzvQY0Se zAuxEA0=Zt$J3)Aq-)QG&)zWAAXPSU~ql%)%=O)Z63--HMv!5jC*F~-=AUdIomv>Og zUW;45pW};;Uzf&n=ECF-pZnV@{YF>Jf?vYWRq%Y+%~?|%GHa@BTrp>lv0zcQbFE`x zI+U0=IFoR3rt2VDiu+(NKRVjJM3WLDor~7ozrR02$K&e2LK7mTZwxOMq~a9L(Qb8w z=lS1SIh!`^3Ju#14Gj#2!XDAX9;#%~SU=Y?UgkeOKA7-=U0=qWVj@70i`~&$e?DPJ z3ZsbD@k~$?KAqX<-}d12G}DeNMA*Mr(N{UTX5sGw8tMbL^*Bht9#YOszGMh!y`>g@pi|)fs zfPi*;qmLRN_x2Ln0@q$`%_Dn(AA`->eQKx3zw?K#$}GC24Z+Vle^y^;bX

xF-m>! z5B6L5m_SRpx3#BX{_!CN1r_ln-O=X$WSct7%`yZZKL#LpvnmV(%~kRDe4n-FH@#OX zo3?8)I8njKLS4QjI?IaIkF2PWJXkIk1l!!HowH}^h{}(=IvS%e)K|-uV0m`K%W7|L zZ_;Cdxmm#KkeOnoKV2ed^eiB7WG?rYQq-a5N=G21rW;vVSC{Vg7shX~kT+V%JrMb0 zUA{SB=tLDzBgQAL+tbEpcbQ$s=l}XS1?G$+(sCfn?|QLa2{Ui{W$P&+y!5+ncE8;@ zeeIKTUJ*FJe^fh2_Pb__&8~l7LwQQ%89qMlm6v*C{(wzJK2IePqvT}ot3Wj8h<Q|lZdw})TPMrx# z6rn@r#mc?drZ6f(KRe}l>U&)<1hWY1>0Z0}oAJw?JS`>V;M$BNQR6uYepsoO$RAAT ze3#5`eDb_$Cw?@nb7v=tUbDTZ7Q0_ykpDW9bqQfWMUauB4n);7Zflt*-6s5L%b$q+nc8ER`!Jy%LS8v8X z>?wxIc=j*M19}tI6#pL+@c)-}(e3>=p9uaRF~zyn<89sLJqf9F@YB|7`C353c`;i-UoWkfe!a>`D@i;u;`Y)WU+4+D#I> z(vV1kmXlwPFa6n`)3P&k`V5Fn)jU&AVh?DJEO#<(^8;Pz@{PQ5p@+n+4!Uf%!50xu zNHNrI+`s#!#{bgmmVvY=Tt81{43x2$hgW^S72*9i-CO+k=PHT~`4lT+RVv(^WjFsH OhA6#NldqLC3;rKFN)j3X literal 15132 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 P3!)&aDpM)-DfoW?(tZK% diff --git a/testdata/snapshots/darwin/trace_waterfall-light.png b/testdata/snapshots/darwin/trace_waterfall-light.png index 314480ba16e02ab0c1d6f97704580122bd7a98fc..6f41d9546683ebaa98b82d0e10172455a263b41b 100644 GIT binary patch literal 14743 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 literal 14635 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 diff --git a/testdata/snapshots/darwin/uptime_bar-dark.png b/testdata/snapshots/darwin/uptime_bar-dark.png index 03b3e10231577be93183a40fbfacafad8687113d..bb20022aba6859976872ca4dc0d7756af565a2b0 100644 GIT binary patch delta 4920 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 literal 5438 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 diff --git a/trace_waterfall.go b/trace_waterfall.go index 9ac6b6b..bb2ccb7 100644 --- a/trace_waterfall.go +++ b/trace_waterfall.go @@ -14,7 +14,7 @@ import ( "mujicaui/theme" ) -// TraceSpan is one timed operation of a request; Parent is "" for the root. +// TraceSpan holds timing; empty Parent marks a root. type TraceSpan struct { ID, Parent string Name string @@ -44,7 +44,7 @@ type traceState struct { services map[string]int // palette slot of each service } -// TraceWaterfall lays spans out by parent and time; choosing a span shows its detail. +// TraceWaterfall shows timed span hierarchies and selected details. func TraceWaterfall(c *ui.Context, spans []TraceSpan, opts TraceWaterfallOptions) ChoiceResult { if opts.Height < 0 { panic("mujica: TraceWaterfall Height is negative") @@ -88,7 +88,7 @@ func TraceWaterfall(c *ui.Context, spans []TraceSpan, opts TraceWaterfallOptions return r } -// traceLayout orders spans depth-first by start, only when the spans change. +// traceLayout caches spans in depth-first time order. func traceLayout(st *traceState, spans []TraceSpan) { key := fmt.Sprintf("%d", len(spans)) if len(spans) > 0 { @@ -134,16 +134,18 @@ func traceLayout(st *traceState, spans []TraceSpan) { } } -// traceSpanRow shows a span's name indented by depth beside its bar; it reports a choice. +// traceSpanRow shows span indentation, timing, selection and duration. func traceSpanRow(c *ui.Context, s TraceSpan, depth int, total time.Duration, slot int, selected bool) bool { k := Tokens(c) d := Density(c) u := d.Unit() - row := ui.ButtonBase(c).Key(s.ID).Justify(ui.Start).Gap(u*2).MinHeight(d.ControlHeight()-4).Padding(0, u*2). + row := ui.ButtonBase(c).Key(s.ID).Justify(ui.Start).Gap(u*2).MinHeight(d.ControlHeight()).Padding(0, u*2). Label(fmt.Sprintf("%s, %s, %s", s.Name, s.Service, agentDuration(s.Duration))) internal.Ring(row, k.Focus, theme.ControlRadius) if selected { - row.Background(k.Selection) + row.Background(k.Selection).DrawOver(func(p *ui.Painter, r ui.Rect) { + p.Stroke(ui.Rect{X: r.X + 2, Y: r.Y + 2, W: r.W - 4, H: r.H - 4}, k.Focus, theme.ControlRadius, 1) + }) } else if row.Hovered() { row.Background(k.SurfaceHover) } @@ -174,5 +176,5 @@ func traceSpanRow(c *ui.Context, s TraceSpan, depth int, total time.Duration, sl ui.Text(c, agentDuration(s.Duration)).Width(64).TextAlign(ui.End).FontSize(FontSize(c, theme.CaptionSize)). TextColor(k.TextMuted).FontFeatures("tnum").Shrink(0) }) - return row.Clicked() + return !row.IsDisabled() && row.Clicked() } diff --git a/trace_waterfall_test.go b/trace_waterfall_test.go index a15ad5a..60c942e 100644 --- a/trace_waterfall_test.go +++ b/trace_waterfall_test.go @@ -76,3 +76,24 @@ func TestTraceWaterfallSnapshot(t *testing.T) { ui.Column(c).Padding(16).Children(func() { TraceWaterfall(c, traceSample, TraceWaterfallOptions{Height: 180}) }) }) } + +func TestTraceWaterfallAncestorDisabled(t *testing.T) { + disabled := false + changes := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + if TraceWaterfall(c, traceSample, TraceWaterfallOptions{}).Changed() { + changes++ + } + }) + }, 700, 460) + _ = tt.Click("Charge") + disabled = true + tt.Key(0, ui.KeyUp) + tt.Key(0, ui.KeyEnter) + _ = tt.Click("ListGuests") + if changes != 1 || !tt.HasText("payments · starts at 230 ms · takes 80 ms") { + t.Fatal("disabled trace selection changed") + } +} diff --git a/uptime_bar.go b/uptime_bar.go index 9c1fe37..8b1fae5 100644 --- a/uptime_bar.go +++ b/uptime_bar.go @@ -9,7 +9,7 @@ import ( "mujicaui/internal" ) -// UptimeDay is one day's availability, 0 to 1; NaN means no data. +// UptimeDay holds availability; NaN marks missing data. type UptimeDay struct { Date Date Uptime float64 @@ -20,11 +20,11 @@ type UptimeDay struct { // UptimeBarOptions configure an UptimeBar; Frame.Height 0 means 36. type UptimeBarOptions struct { Frame ChartFrame - // Degraded and Down are the uptime limits below which a day is marked; zero means 0.999 and 0.95. + // Degraded and Down default to 0.999 and 0.95. Degraded, Down float64 } -// UptimeBar draws one bar per day by availability; hover or arrows read a day's detail. +// UptimeBar shows daily availability with pointer and keyboard readouts. func UptimeBar(c *ui.Context, days []UptimeDay, opts UptimeBarOptions) ChartResult { deg, down := opts.Degraded, opts.Down if deg == 0 { @@ -36,17 +36,22 @@ func UptimeBar(c *ui.Context, days []UptimeDay, opts UptimeBarOptions) ChartResu if !(down < deg && deg <= 1 && down > 0) { panic("mujica: UptimeBar needs 0 < Down < Degraded <= 1") } - for i, d := range days { - if !math.IsNaN(d.Uptime) && (d.Uptime < 0 || d.Uptime > 1) { - panic(fmt.Sprintf("mujica: UptimeBar day %d uptime %v outside 0..1", i, d.Uptime)) - } - } + if opts.Frame.Height == 0 { opts.Frame.Height = 36 } k := Tokens(c) ch := newChart(c, opts.Frame) n := len(days) + cache := ui.Local(ch.res.Element, "mujica.uptime", func() uptimeCache { return uptimeCache{} }) + if cache.key != chartID(days) { + for i, d := range days { + if !math.IsNaN(d.Uptime) && (d.Uptime < 0 || d.Uptime > 1) { + panic(fmt.Sprintf("mujica: UptimeBar day %d outside 0..1", i)) + } + } + cache.key, cache.width = chartID(days), -1 + } band := func(r ui.Rect) internal.Band { return internal.Band{N: n, R0: r.X, R1: r.X + r.W, Pad: 0.25} } level := func(v float64) int { // 0 ok, 1 degraded, 2 down, 3 no data switch { @@ -59,19 +64,27 @@ func UptimeBar(c *ui.Context, days []UptimeDay, opts UptimeBarOptions) ChartResu } return 0 } + pal := internal.Palette(k) words := [...]string{msg(c, "uptime_bar.ok"), msg(c, "uptime_bar.degraded"), msg(c, "uptime_bar.down"), msg(c, "uptime_bar.nodata")} res, _ := ch.build(chartSpec{ n: n, draw: func(p *ui.Painter, r ui.Rect, active int) { b := band(r) - for i, d := range days { - x, w := internal.Snap(p, b.Start(i)), max(b.Width(), 1) + cache.prepare(days, max(1, int(math.Ceil(float64(r.W*p.Scale()))))) + for _, slot := range cache.slots { + d := days[slot.index] + x, w := internal.Snap(p, b.Start(slot.first)), max(b.Start(slot.last)+b.Width()-b.Start(slot.first), 1) lv := level(d.Uptime) - col := [...]ui.Color{k.Success, k.Warning, k.Danger, k.Border}[lv] - // Shorter bars mark bad days, so color is not the only cue. + col := [...]ui.Color{pal[2], pal[3], k.Danger, k.TextMuted}[lv] + // Shorter bars distinguish degraded days and outages. h := r.H * [...]float32{1, 0.75, 0.5, 1}[lv] - p.Fill(ui.Rect{X: x, Y: r.Y + r.H - h, W: w, H: h}, col, 1) - if i == active { + bar := ui.Rect{X: x, Y: r.Y + r.H - h, W: w, H: h} + if lv == 3 { + p.Stroke(bar, col, 1, 1) + } else { + p.Fill(bar, col, 1) + } + if active >= slot.first && active <= slot.last { p.Stroke(ui.Rect{X: x - 2, Y: r.Y - 2, W: w + 4, H: r.H + 4}, k.Focus, 2, 1.5) } } @@ -94,3 +107,29 @@ func UptimeBar(c *ui.Context, days []UptimeDay, opts UptimeBarOptions) ChartResu }) return res } + +type uptimeSlot struct{ first, last, index int } +type uptimeCache struct { + key string + width int + slots []uptimeSlot +} + +func (s *uptimeCache) prepare(days []UptimeDay, width int) { + if s.width == width { + return + } + s.width, s.slots = width, s.slots[:0] + n := len(days) + for first := 0; first < n; { + last := min(n-1, max(first, ((first*width/n+1)*n-1)/width)) + index := first + for i := first + 1; i <= last; i++ { + if math.IsNaN(days[index].Uptime) || !math.IsNaN(days[i].Uptime) && days[i].Uptime < days[index].Uptime { + index = i + } + } + s.slots = append(s.slots, uptimeSlot{first, last, index}) + first = last + 1 + } +} diff --git a/uptime_bar_test.go b/uptime_bar_test.go index fdbff9f..6382516 100644 --- a/uptime_bar_test.go +++ b/uptime_bar_test.go @@ -85,3 +85,41 @@ func TestUptimeBarSnapshot(t *testing.T) { }) }) } + +func TestUptimeBarManyDaysBounded(t *testing.T) { + days := uptimeSample(100000) + var pts []int + tt := uptimeTester(days, ChartFrame{}, &pts) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + if pts[len(pts)-1] != 99999 { + t.Fatal("end boundary") + } + for i := range 20 { + tt.Key(0, ui.KeyRight) + _ = i + } + if pts[len(pts)-1] != 99999 { + t.Fatal("right boundary") + } +} + +func TestUptimeBarPixelBucketsPreserveOutages(t *testing.T) { + days := uptimeSample(100000) + var cache uptimeCache + cache.prepare(days, 500) + if len(cache.slots) > 500 || cache.slots[0].index != 7 { + t.Fatalf("%d buckets, first worst %d", len(cache.slots), cache.slots[0].index) + } + cache.prepare(days, 1000) + if len(cache.slots) > 1000 || cache.slots[len(cache.slots)-1].last != 99999 { + t.Fatal("resized buckets") + } + for _, n := range []int{1, 3, 12} { + cache.width = -1 + cache.prepare(days[:n], 500) + if len(cache.slots) != n { + t.Fatalf("%d days rendered as %d buckets", n, len(cache.slots)) + } + } +}