Merge Settings & Account

This commit is contained in:
ZacharyZhang-NY committed 2026-10-05 15:46:45 -04:00
commit 0e51784330
108 files changed
+6501 -2

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
# 461 SettingsLayout
设置布局。
## 用途
设置页框架:左侧分区导航(Sidebar),右侧显示当前分区;配套 `SettingsSection` 分节与 `SettingsRow` 设置行(标签、说明、控件)。
## 最小示例
```go
page := ""
sound := true
pages := []mujica.SettingsPage{{ID: "general", Label: "General"}, {ID: "privacy", Label: "Privacy"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.SettingsLayout(c, &page, pages, mujica.SettingsLayoutOptions{}, func(id string) {
mujica.SettingsSection(c, "Notifications", func() {
mujica.SettingsRow(c, "Sound", mujica.SettingsRowOptions{ID: "sound"}, func() *ui.Element {
return mujica.Switch(c, &sound, "", mujica.SwitchOptions{})
})
})
})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `page` | `*string` | 必填 | 当前分区 ID;空值取第一个,未知 ID panic。 |
| `pages` | `[]SettingsPage` | 必填 | ID、Label、Icon。 |
| `Title` | `string` | 内置“Settings” | 导航标题。 |
| `content` | `func(id string)` | 必填 | 构建分区内容。 |
| `SettingsRow control` | `func() *ui.Element` | 必填 | 返回控件;行标签与说明关联到它。 |
| `SettingsRowOptions.ID` | `string` | "" | 供 SettingsSearch 跳转定位。 |
## 状态
导航选中、行悬停、被搜索定位的行短暂高亮(减少动画时不高亮)。
## 事件
`ChoiceResult.Changed()` 在切换分区时为 true。
## 键盘操作
导航沿用 Sidebar 键盘操作;Tab 进入内容区各控件;点击行文字聚焦其控件。
## 限制
- 内容区独立滚动,最大宽度 720 DIP。
+48
View File
@@ -0,0 +1,48 @@
# 462 SettingsSearch
设置搜索。
## 用途
按标签、说明与关键词搜索设置项,高亮匹配片段;选中后切到对应分区并把该设置行滚入视野、聚焦其控件。
## 最小示例
```go
query, page := "", "general"
entries := []mujica.SettingEntry{{ID: "sound", Page: "general", Label: "Sound", Keywords: []string{"audio"}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if e, ok := mujica.SettingsSearch(c, &query, entries, mujica.SettingsSearchOptions{}).Chosen(); ok {
page = e.Page
}
fmt.Println("page", page)
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `query` | `*string` | 必填 | 搜索文字。 |
| `entries` | `[]SettingEntry` | 必填 | ID(对应 SettingsRow ID)、Page、Label、Description、Keywords。 |
| `Limit` | `int` | 8 | 最多显示条数。 |
## 状态
无输入、有结果(当前项底色)、无结果。
## 事件
`SettingsSearchResult.Chosen()` 返回选中的条目;调用方据此设置分区。
## 键盘操作
在搜索框中 ↑/↓ 移动当前项,Enter 跳转;也可点击结果。
## 限制
大集合使用虚拟列表,构建当前可见行;搜索与分组在数据或查询变化时更新。
- 匹配不区分大小写,按子串查找。
+41
View File
@@ -0,0 +1,41 @@
# 463 ThemeSelector
主题选择。
## 用途
以三张预览卡选择跟随系统、浅色或深色;预览用对应主题的设计变量绘制。
## 最小示例
```go
mode := mujica.System
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{Mode: mode})
mujica.ThemeSelector(c, &mode, mujica.ThemeSelectorOptions{})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `mode` | `*Mode` | 必填 | System、Light 或 Dark;其他值 panic。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
默认、悬停、聚焦、选中(选中底色、边框与勾选)、禁用。
## 事件
`ChoiceResult.Changed()`。
## 键盘操作
Tab 进入单选组,←/→ 移动,Space 选择。
## 限制
- 无。
@@ -0,0 +1,42 @@
# 464 AccentColorPicker
主色选择。
## 用途
从候选色中选择主色;承载浅色文字对比度不足 4.5:1 的候选带警示标记,选中时给出提示。
## 最小示例
```go
accent := ui.Hex("#7D2034")
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.AccentColorPicker(c, &accent, mujica.AccentColorPickerOptions{})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `color` | `*ui.Color` | 必填 | 当前主色。 |
| `Candidates` | `[]ui.Color` | 内置 8 色 | 候选色。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
默认、选中(外框与勾选)、对比度不足(警示图标与说明)、禁用。
## 事件
`ChoiceResult.Changed()`。
## 键盘操作
Tab 进入单选组,←/→ 移动,Space 选择。
## 限制
- 对比度按 OnAccent 文字计算;只标记,不阻止选择。
+46
View File
@@ -0,0 +1,46 @@
# 465 ShortcutRecorder
快捷键录制。
## 用途
点击后录制下一次按下的组合键;与已占用的快捷键冲突时提示并保留原值;按平台显示修饰键。
## 最小示例
```go
palette := mujica.Shortcut{Mods: ui.Cmd | ui.Shift, Key: ui.KeyP}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.ShortcutRecorder(c, &palette, mujica.ShortcutRecorderOptions{
Label: "Command palette",
Taken: []mujica.ShortcutBinding{{Action: "Save", Shortcut: mujica.Shortcut{Mods: ui.Cmd, Key: ui.KeyS}}},
})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `value` | `*Shortcut` | 必填 | Mods 与 Key;零值表示未设置。 |
| `Label` | `string` | 必填 | 动作名称。 |
| `Taken` | `[]ShortcutBinding` | nil | 已占用的快捷键。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
显示、录制中、冲突提示、缺少修饰键提示、禁用。
## 事件
`ChoiceResult.Changed()` 在录到新快捷键时为 true。
## 键盘操作
Enter/Space 开始录制;Escape 取消;Tab 离开。字母、数字等须带 Ctrl、Alt 或 Command,F1–F12 可单独使用。
## 限制
- 系统或应用菜单先拦截的组合键(如 Cmd+Q)无法录制。
@@ -0,0 +1,47 @@
# 466 KeyboardShortcutsList
快捷键列表。
## 用途
分组显示快捷键表,可按动作名或按键搜索。
## 最小示例
```go
query := ""
groups := []mujica.ShortcutGroup{{Title: "General", Bindings: []mujica.ShortcutBinding{
{Action: "Command palette", Shortcut: mujica.Shortcut{Mods: ui.Cmd | ui.Shift, Key: ui.KeyP}},
}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.KeyboardShortcutsList(c, &query, groups, mujica.KeyboardShortcutsListOptions{})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `query` | `*string` | 必填 | 搜索文字。 |
| `groups` | `[]ShortcutGroup` | 必填 | Title 与 Bindings。 |
| `Label` | `string` | 内置“Search shortcuts” | 搜索框名称。 |
## 状态
全部、筛选、无结果。
## 事件
无。
## 键盘操作
Tab 进入搜索框;每行读出动作与按键。
## 限制
大集合使用虚拟列表,构建当前可见行;搜索与分组在数据或查询变化时更新。
- 按键按平台显示,macOS 使用符号。
+47
View File
@@ -0,0 +1,47 @@
# 467 LoginForm
登录表单。
## 用途
账号、密码与“记住我”;提交中禁用输入;显示调用方给出的错误(含频率限制、锁定)。密码在私有临时状态中编辑,经提交回调传出,完成后清除;账号校验由调用方完成。
## 最小示例
```go
var state mujica.LoginFormState
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.LoginForm(c, &state, mujica.LoginFormOptions{OnSubmit: func(account, password string, remember bool) {
// Submit credentials through the caller-provided auth service.
state.EndSubmit("")
}})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `s` | `*LoginFormState` | 必填 | Account、Remember 可读写;密码不可读取。 |
| `OnSubmit` | `func(account, password string, remember bool)` | 必填 | 唯一接收凭据的出口。 |
| `AccountLabel` | `string` | 内置“Email or username” | 账号标签。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
默认、必填错误、提交中、失败(错误文字)、禁用。
## 事件
`OnSubmit` 每次提交调用一次;完成后调用 `s.EndSubmit(err)`,密码随即清除。
## 键盘操作
Tab 顺序:账号、密码、显示密码、记住我、登录;任一字段中 Enter 提交;缺项时聚焦第一个空字段。
## 限制
- 凭据只经调用方回调传出;密码、验证码与密钥不会写入日志、Label 或 Description。
- 提交失败后需重新输入密码。
+44
View File
@@ -0,0 +1,44 @@
# 468 OAuthButtons
第三方登录按钮。
## 用途
按调用方提供的名称显示“使用 X 继续”按钮组;不使用商标图形。
## 最小示例
```go
providers := []mujica.OAuthProvider{{ID: "sso", Name: "Company SSO"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if id, ok := mujica.OAuthButtons(c, providers, mujica.OAuthButtonsOptions{}).Chosen(); ok {
fmt.Println("start sign-in with", id)
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `providers` | `[]OAuthProvider` | 必填 | ID、Name 必填;Icon 可选,应为非商标图形。 |
| `Pending` | `string` | "" | 正在进行的提供方:显示加载,其余禁用。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
默认、进行中、禁用。
## 事件
`OAuthButtonsResult.Chosen()` 返回提供方 ID。
## 键盘操作
Tab 在按钮间移动,Enter/Space 选择。
## 限制
- 登录流程由调用方完成。
+48
View File
@@ -0,0 +1,48 @@
# 469 TwoFactorInput
两步验证码。
## 用途
六位验证码输入(基于 PinInput),支持整段粘贴;重新发送带倒计时;显示调用方错误。
## 最小示例
```go
code := ""
resendAt := time.Now().Add(30 * time.Second)
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.TwoFactorInput(c, &code, mujica.TwoFactorInputOptions{ResendAt: resendAt})
if r.Completed() {
fmt.Println("verify the code")
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `code` | `*string` | 必填 | 验证码数字。 |
| `ResendAt` | `time.Time` | 零值 | 此时间前重新发送按钮倒计时并禁用。 |
| `Error` | `string` | "" | 调用方错误,如过期。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
输入中、完成、错误、倒计时、可重发、禁用。
## 事件
`TwoFactorResult.Completed()` 在填满第六位时;`Resend()` 请求重发。
## 键盘操作
数字键填格,Backspace 删除,Cmd/Ctrl+V 粘贴;Tab 到重新发送按钮。
## 限制
- 验证码与密钥通过调用方状态接入;组件事件与日志仅包含完成或失败标记。
- 倒计时每秒刷新一次,结束后不再重绘。
+48
View File
@@ -0,0 +1,48 @@
# 470 ProfileEditor
个人资料编辑。
## 用途
头像、名称与简介;与已保存版本不同时显示未保存标记;保存、放弃与更换头像由调用方处理。
## 最小示例
```go
saved := mujica.Profile{Name: "Sakiko", Bio: "Keyboard."}
profile := saved
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if mujica.ProfileEditor(c, &profile, mujica.ProfileEditorOptions{Saved: saved}).Save() {
saved = profile
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `p` | `*Profile` | 必填 | Name、Bio。 |
| `Saved` | `Profile` | 零值 | 已保存的资料。 |
| `Avatar` | `*ui.Bitmap` | nil | 头像;nil 显示首字母。 |
| `BioLimit` | `int` | 160 | 可保存的简介字数上限;超限保留输入并阻止保存。 |
| `Saving` | `bool` | false | 保存中,阻止编辑。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
已保存、未保存(菱形与文字)、名称为空、简介超限、保存中、禁用。
## 事件
`Save()`、`ChangeAvatar()`、`Discarded()`。
## 键盘操作
Tab 依次经过更换头像、名称、简介、放弃、保存。
## 限制
- 头像选择与上传由调用方完成,可配合 FilePicker。
+47
View File
@@ -0,0 +1,47 @@
# 471 AccountSwitcher
账户切换。
## 用途
显示当前账户,菜单中切换已登录账户或添加账户。
## 最小示例
```go
current := "a"
accounts := []mujica.Account{{ID: "a", Name: "Sakiko Togawa", Email: "sakiko@court"}, {ID: "b", Name: "Oblivionis"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if mujica.AccountSwitcher(c, &current, accounts, mujica.AccountSwitcherOptions{}).Add() {
fmt.Println("sign in another account")
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `current` | `*string` | 必填 | 当前账户 ID,须在列表中。 |
| `accounts` | `[]Account` | 必填 | ID、Name 必填;Email、Avatar 可选。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
关闭、展开、当前账户勾选、禁用。
## 事件
`Changed()` 切换;`Add()` 请求添加账户。
## 键盘操作
Enter/Space/↓ 打开菜单,方向键移动,Enter 选择,Escape 关闭。
## 限制
大集合使用虚拟列表,仅构建当前可见行。
- 菜单项只显示文字,头像只在按钮上。
+45
View File
@@ -0,0 +1,45 @@
# 472 WorkspaceSwitcher
工作区切换。
## 用途
显示当前工作区,弹层中搜索并切换。
## 最小示例
```go
current := "ave"
spaces := []mujica.Workspace{{ID: "ave", Name: "Ave Mujica"}, {ID: "mygo", Name: "MyGO!!!!!"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.WorkspaceSwitcher(c, &current, spaces, mujica.WorkspaceSwitcherOptions{})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `current` | `*string` | 必填 | 当前工作区 ID。 |
| `spaces` | `[]Workspace` | 必填 | ID、Name 必填,Detail 可选。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
关闭、展开、搜索、无结果、当前项勾选、禁用。
## 事件
`ChoiceResult.Changed()`。
## 键盘操作
打开后焦点在搜索框;↑/↓ 移动,Enter 切换,Escape 关闭。
## 限制
大集合使用虚拟列表,构建当前可见行;搜索与分组在数据或查询变化时更新。
- 无。
+46
View File
@@ -0,0 +1,46 @@
# 473 UserMenu
用户菜单。
## 用途
头像按钮打开菜单:在线状态、设置与退出登录。头像角标以形状与颜色共同表示状态。
## 最小示例
```go
status := mujica.PresenceOnline
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if mujica.UserMenu(c, &status, mujica.UserMenuOptions{Name: "Sakiko Togawa"}).SignOut() {
fmt.Println("sign out")
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `status` | `*UserStatus` | 必填 | PresenceOnline、PresenceAway、PresenceBusy、PresenceInvisible。 |
| `Name` | `string` | 必填 | 用户名。 |
| `Email` | `string` | "" | 邮箱。 |
| `Avatar` | `*ui.Bitmap` | nil | 头像。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
关闭、展开、四种状态、禁用。
## 事件
`StatusChanged()`、`Settings()`、`SignOut()`。
## 键盘操作
Enter/Space/↓ 打开,方向键移动,Enter 选择,Escape 关闭。
## 限制
- 按钮名称包含用户名与状态。
+45
View File
@@ -0,0 +1,45 @@
# 474 SessionList
登录会话。
## 用途
列出已登录设备、位置与最近活跃时间;可注销单个会话或经确认注销其他全部会话。
## 最小示例
```go
sessions := []mujica.Session{{ID: "s1", Device: "MacBook Pro", Current: true}, {ID: "s2", Device: "iPhone", Location: "Osaka"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if id, ok := mujica.SessionList(c, sessions, mujica.SessionListOptions{}).Revoked(); ok {
fmt.Println("sign out", id)
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `sessions` | `[]Session` | 必填 | ID、Device 必填;不包含会话令牌。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
本设备标记、最近活跃未知、确认对话框、禁用。
## 事件
`Revoked()` 返回会话 ID;`OthersRevoked()` 在确认后为 true。
## 键盘操作
Tab 到各注销按钮;确认框默认聚焦取消。
## 限制
大集合使用虚拟列表,仅构建当前可见行。
- 注销由调用方执行。
+51
View File
@@ -0,0 +1,51 @@
# 475 ApiKeyManager
API 密钥管理。
## 用途
密钥列表只显示前缀与掩码;创建后明文只显示一次并可复制,关闭即从内存清除;撤销需确认。
## 最小示例
```go
var state mujica.ApiKeyManagerState
keys := []mujica.APIKey{{ID: "k1", Name: "Deploy bot", Prefix: "mk_live_9f2c"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if name, ok := mujica.ApiKeyManager(c, &state, keys, mujica.ApiKeyManagerOptions{}).Create(); ok {
fmt.Println("create", name)
state.Reveal("secret from your key service")
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `s` | `*ApiKeyManagerState` | 必填 | 对话框与一次性明文。 |
| `keys` | `[]APIKey` | 必填 | ID、Name、Prefix 必填;不含明文。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
列表、空列表、输入名称、创建中、显示明文、失败、撤销确认、禁用。
## 事件
`Create()` 返回新密钥名称:调用方生成后调用 `s.Reveal(secret)` 或 `s.Fail(msg)`;`Revoked()` 返回确认撤销的 ID。
## 键盘操作
Tab 到创建与撤销按钮;对话框中 Enter 创建;复制按钮写入剪贴板并播报“已复制”。
## 限制
大集合使用虚拟列表,仅构建当前可见行。
- 验证码与密钥通过调用方状态接入;组件事件与日志仅包含完成或失败标记。
- 明文作为可选择文字显示一次,屏幕阅读器可读出文字本身。
- 创建进行中等待调用方结果;禁用关闭全部弹层并清除已显示明文。
- 待处理请求跨禁用保留;失败后恢复名称与错误,支持重试。
+42
View File
@@ -0,0 +1,42 @@
# 476 UsageQuota
用量配额。
## 用途
每项资源的用量与上限进度条;接近与超出上限以图标与文字提示;显示重置时间。
## 最小示例
```go
items := []mujica.QuotaItem{{Label: "API calls", Used: 4200, Limit: 10000}, {Label: "Storage", Used: 9, Limit: 10, Unit: "GB"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.UsageQuota(c, items, mujica.UsageQuotaOptions{ResetAt: time.Now().Add(72 * time.Hour)})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `items` | `[]QuotaItem` | 必填 | Label、Used、Limit(>0)、Unit。 |
| `ResetAt` | `time.Time` | 零值 | 重置时间;一天内显示小时,否则显示日期。 |
| `Warn` | `float64` | 0.8 | 达到该比例即提示接近上限。 |
## 状态
正常、接近上限、已达上限。
## 事件
无。
## 键盘操作
不获取焦点;每项以计量角色读出。
## 限制
- 无。
+45
View File
@@ -0,0 +1,45 @@
# 477 OnboardingWizard
引导向导。
## 用途
多步引导:进度条、步骤内容、上一步、下一步、跳过与完成。
## 最小示例
```go
step := 0
steps := []mujica.WizardStep{{Title: "Welcome"}, {Title: "Pick a theme"}, {Title: "Done"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if mujica.OnboardingWizard(c, &step, steps, mujica.OnboardingWizardOptions{}).Finished() {
fmt.Println("onboarded")
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `step` | `*int` | 必填 | 当前步骤,越界 panic。 |
| `steps` | `[]WizardStep` | 必填 | Title 必填;Description、Content、Ready。 |
| `NoSkip` | `bool` | false | 不显示跳过。 |
## 状态
各步骤、未就绪(下一步禁用)、最后一步(完成)。
## 事件
`Finished()`、`Skipped()`。
## 键盘操作
下一步按钮自动聚焦;Tab 在按钮与内容间移动。
## 限制
- 无。
+43
View File
@@ -0,0 +1,43 @@
# 478 Coachmark
功能提示。
## 用途
在锚点元素旁显示提示,锚点加框;多步导航;Escape 或点击外部关闭。
## 最小示例
```go
open, step := true, 0
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
compose := mujica.Button(c, "Compose", mujica.ButtonOptions{})
mujica.Coachmark(c, &open, &step, []mujica.CoachmarkStep{{Anchor: compose, Title: "Write here", Body: "Start a new letter."}})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `open` | `*bool` | 必填 | 是否显示。 |
| `step` | `*int` | 必填 | 当前步骤。 |
| `steps` | `[]CoachmarkStep` | 必填 | Anchor(本帧已构建的元素)、Title 必填,Body 可选。 |
## 状态
显示、各步骤、最后一步(完成)、关闭。
## 事件
`Finished()`;`Dismissed()` 在 Escape、点击外部或跳过时为 true。
## 键盘操作
下一步按钮自动聚焦;Escape 关闭。
## 限制
- 弹层沿用 Popover 定位,空间不足时翻转到锚点上方。
+44
View File
@@ -0,0 +1,44 @@
# 479 WhatsNewDialog
更新内容。
## 用途
以带饰边的对话框列出各版本的更新(新增、改进、修复),提供“不再显示”。
## 最小示例
```go
open, hide := true, false
releases := []mujica.Release{{Version: "1.1", Changes: []mujica.ReleaseChange{{Kind: mujica.ChangeNew, Text: "500 components."}}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.WhatsNewDialog(c, &open, &hide, releases, mujica.WhatsNewDialogOptions{})
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `open` | `*bool` | 必填 | 是否显示。 |
| `hide` | `*bool` | 必填 | “不再显示”的值,由调用方保存。 |
| `releases` | `[]Release` | 必填 | Version 必填;Date、Changes。 |
| `Title` | `string` | 内置“What's new” | 标题。 |
## 状态
显示、勾选不再显示。
## 事件
`ChoiceResult.Changed()` 在“不再显示”变化时。
## 键盘操作
“知道了”自动聚焦;Escape 关闭。
## 限制
- 无。
+46
View File
@@ -0,0 +1,46 @@
# 480 FeedbackWidget
反馈组件。
## 用途
选择反馈类型、填写内容、附件插槽,提交一次后等待调用方完成。基于 Form。
## 最小示例
```go
var state mujica.FeedbackWidgetState
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
if f, ok := mujica.FeedbackWidget(c, &state, mujica.FeedbackWidgetOptions{}).Submitted(); ok {
fmt.Println("send", f.Kind)
state.EndSubmit("")
}
}
ui.Render(view, 400, 300, 1)
```
## 参数
| 字段 | 类型 | 默认值 | 含义 |
| --- | --- | --- | --- |
| `s` | `*FeedbackWidgetState` | 必填 | Draft 与 Form。 |
| `Attachments` | `func()` | nil | 截图或文件插槽。 |
| `MinLength` | `int` | 10 | 最少字数。 |
| `Disabled` | `bool` | false | 禁用。 |
## 状态
填写、过短错误、提交中、失败、禁用。提交中锁定类型、正文与附件控件,失败保留原稿。
## 事件
`Submitted()` 返回反馈;完成后调用 `s.EndSubmit(err)`,成功时清空内容。
## 键盘操作
类型分段用方向键切换;Tab 到内容与按钮。
## 限制
- 截图采集由调用方完成。