WIP components (as built)
This commit is contained in:
110 files changed
+3975
-273
No files matched your search
@@ -0,0 +1,40 @@
|
||||
# 181 OptionChain
|
||||
|
||||
## 用途
|
||||
|
||||
期权链。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.OptionChainState
|
||||
rows := []mujica.OptionStrike{{Strike: 100, Call: mujica.OptionQuote{Bid: 3, Ask: 3.2, Last: 3.1}, Put: mujica.OptionQuote{Bid: 2, Ask: 2.2, Last: 2.1}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.OptionChain(c, &state, []string{"Oct 17", "Nov 21"}, rows, mujica.OptionChainOptions{Spot: 100.4})
|
||||
if r.Changed || r.Submitted || r.ExpiryChanged {
|
||||
fmt.Println(state.Expiry, state.Strike, state.Side)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`s` 保存到期日和合约;`expiries` 至少一个;`strikes` 升序。`Spot` 默认 0 隐藏现价;`Decimals` 默认 2;`Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed || r.Submitted || r.ExpiryChanged { 调用方回调(state.Expiry, state.Strike, state.Side) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 切换到期日或列表;上下、Home/End 选择行;左右切换认购认沽;Enter 确认。
|
||||
|
||||
## 限制
|
||||
|
||||
到期日切换后,由调用方更换对应报价;排序与稳定合约标识由调用方保证。
|
||||
@@ -0,0 +1,38 @@
|
||||
# 182 GreeksTable
|
||||
|
||||
## 用途
|
||||
|
||||
希腊值表。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
rows := []mujica.GreeksRow{{Label: "AAPL 100 C", Greeks: mujica.OptionGreeks{Delta: 0.5, Gamma: 0.03, Theta: -0.1, Vega: 0.2, Rho: 0.05}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
mujica.GreeksTable(c, rows, mujica.GreeksTableOptions{Notes: true})
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
小数位范围 0—12;0 表示默认 4 位。
|
||||
|
||||
`rows` 为合约与五个数值;NaN 显示破折号。`Decimals` 默认 4;`Notes` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界。
|
||||
|
||||
## 事件
|
||||
|
||||
展示组件;数据由调用方更新。
|
||||
|
||||
## 键盘操作
|
||||
|
||||
展示组件;表头提供说明和悬停提示。
|
||||
|
||||
## 限制
|
||||
|
||||
通过虚拟列表构建可见行;精度为显示规则,数值计算由调用方提供。
|
||||
@@ -0,0 +1,39 @@
|
||||
# 183 PayoffDiagram
|
||||
|
||||
## 用途
|
||||
|
||||
到期损益图。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
legs := []mujica.OptionLeg{{Kind: mujica.LegCall, Strike: 100, Premium: 3, Quantity: 1}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.PayoffDiagram(c, legs, mujica.PayoffDiagramOptions{Frame: mujica.ChartFrame{Label: "Call payoff"}, Spot: 103})
|
||||
if r.Changed() || r.Retried() {
|
||||
fmt.Println(r.Point)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`legs` 为认购、认沽或标的组合;负数量表示卖出。`Frame.Label` 必填,`Height` 默认 240;`Spot` 默认 0;`Low/High` 默认行权价上下 30%;`Points` 默认 101;`Format` 可覆盖读数。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() || r.Retried() { 调用方回调(r.Point) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦;方向键、Home/End 逐点读数;Escape 清除。
|
||||
|
||||
## 限制
|
||||
|
||||
计算到期损益,合约乘数由 Quantity 表达;价格采样数量由 Points 指定。
|
||||
@@ -0,0 +1,40 @@
|
||||
# 184 Watchlist
|
||||
|
||||
## 用途
|
||||
|
||||
自选列表。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.WatchlistState
|
||||
groups := []mujica.WatchGroup{{Name: "Technology", Items: []mujica.WatchItem{{Symbol: "AAPL", Name: "Apple", Price: 227.5, Change: 2.7, ChangePercent: 1.2}}}, {Name: "Energy", Items: []mujica.WatchItem{{Symbol: "XOM", Price: 117.4}}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.Watchlist(c, &state, groups, mujica.WatchlistOptions{})
|
||||
if r.Changed || r.Submitted || r.Moved {
|
||||
fmt.Println(state.Selected, r.Rows, r.To)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`s` 保存分组、代码和隐藏列;`groups` 至少一个;`Decimals` 默认 2;`Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed || r.Submitted || r.Moved { 调用方回调(state.Selected, r.Rows, r.To) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 切换分组或列菜单;上下、Home/End 选择;Enter 确认;菜单 Space 开关列。
|
||||
|
||||
## 限制
|
||||
|
||||
拖动仅返回 Moved;调用方应用 Rows/To 调整顺序;刷新采用稳定 Symbol。
|
||||
@@ -0,0 +1,40 @@
|
||||
# 185 SymbolSearch
|
||||
|
||||
## 用途
|
||||
|
||||
代码搜索。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.SymbolSearchState
|
||||
rows := []mujica.MarketSymbol{{Code: "AAPL", Name: "Apple", Market: "NASDAQ", Type: "Stock"}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.SymbolSearch(c, &state, rows, mujica.SymbolSearchOptions{Markets: []string{"NASDAQ", "NYSE"}, Recent: rows})
|
||||
if r.Changed || r.Picked || r.Retry {
|
||||
fmt.Println(state.Query, state.Market, r.Chosen.Code)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`s.Query/Market` 为调用方搜索条件;`results` 是调用方异步结果。`Markets` nil 隐藏过滤;`Recent` 为空查询时显示;`Loading/Error/Disabled` 默认零值。
|
||||
|
||||
## 状态
|
||||
|
||||
默认、聚焦、禁用;异步结果支持加载、失败和空。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed || r.Picked || r.Retry { 调用方回调(state.Query, state.Market, r.Chosen.Code) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦输入与市场;Down 进入结果;Tab 到达结果按钮,Enter 选择。
|
||||
|
||||
## 限制
|
||||
|
||||
调用方处理搜索、市场过滤和最近记录;组件提供异步加载、失败和重试界面。
|
||||
@@ -0,0 +1,39 @@
|
||||
# 186 SymbolBadge
|
||||
|
||||
## 用途
|
||||
|
||||
代码徽标。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
symbol := mujica.MarketSymbol{Code: "AAPL", Name: "Apple", Market: "NASDAQ", Type: "Stock"}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.SymbolBadge(c, symbol, mujica.SymbolBadgeOptions{Clickable: true})
|
||||
if r.Changed() {
|
||||
fmt.Println(symbol.Code)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`MarketSymbol.Code` 必填,Name、Market、Type 为调用方标签。`Clickable/Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() { 调用方回调(symbol.Code) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Clickable 开启时 Tab 聚焦,Enter/Space 激活。
|
||||
|
||||
## 限制
|
||||
|
||||
市场和类型属于业务标签,由调用方本地化。
|
||||
@@ -0,0 +1,42 @@
|
||||
# 187 MarketHeatmap
|
||||
|
||||
## 用途
|
||||
|
||||
市场热力图。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var path []string
|
||||
root := mujica.HeatNode{Name: "Market", Children: []mujica.HeatNode{{Name: "Technology", Children: []mujica.HeatNode{{Name: "AAPL", Cap: 3000, Change: 1.2}, {Name: "MSFT", Cap: 2800, Change: -0.6}}}, {Name: "Energy", Cap: 450, Change: -2.1}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.MarketHeatmap(c, &path, root, mujica.MarketHeatmapOptions{Frame: mujica.ChartFrame{Label: "Market"}})
|
||||
if r.Changed() || r.ValueChanged() || r.Retried() {
|
||||
fmt.Println(path, r.Point)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`Version` 在原地修改数据时递增。小于 4 DIP 的瓦片按屏幕网格汇总绘制,键盘仍逐项读取原始数据。
|
||||
|
||||
`path` 保存下钻路径;`root` 名称必填,子项名称唯一;`Cap` 为面积,`Change` 为百分比。`Frame.Label` 必填;`Scale` 默认 3。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() || r.ValueChanged() || r.Retried() { 调用方回调(path, r.Point) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦图;方向键逐块读数;Enter 下钻;Backspace 返回;路径按钮可用 Tab。
|
||||
|
||||
## 限制
|
||||
|
||||
市场数据由调用方提供;原地修改数据后更换 Children 切片或递增 Version。
|
||||
@@ -0,0 +1,41 @@
|
||||
# 188 Screener
|
||||
|
||||
## 用途
|
||||
|
||||
选股器。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.ScreenerState
|
||||
fields := []mujica.ScreenerField{{ID: "pe", Label: "P/E", Decimals: 1}}
|
||||
rows := []mujica.ScreenerRow{{Symbol: "AAPL", Values: map[string]float64{"pe": 34}}, {Symbol: "XOM", Values: map[string]float64{"pe": 13}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.Screener(c, &state, fields, rows, mujica.ScreenerOptions{})
|
||||
if r.Changed || r.Save || r.Table.Changed() || r.Table.Submitted() || r.Table.SortChanged() || r.Table.Retried() {
|
||||
fmt.Println(state.Conditions)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`s.Conditions` 保存条件;`fields` 至少一项,ID 唯一;`rows.Values` 为字段值。`Version` 原地更新递增;`Status/Error/Disabled` 默认零值。
|
||||
|
||||
## 状态
|
||||
|
||||
默认、聚焦、禁用;异步结果支持加载、失败和空。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed || r.Save || r.Table.Changed() || r.Table.Submitted() || r.Table.SortChanged() || r.Table.Retried() { 调用方回调(state.Conditions) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 到达字段、比较、数值和保存;Select 方向键选择;NumberInput 方向键步进;表格方向键选择。
|
||||
|
||||
## 限制
|
||||
|
||||
全部条件取交集;保存由调用方处理;缺失值无法通过条件。
|
||||
@@ -0,0 +1,39 @@
|
||||
# 189 MarketOverview
|
||||
|
||||
## 用途
|
||||
|
||||
市场概览。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
indices := []mujica.IndexQuote{{Name: "S&P 500", Price: 5751.07, Change: 51.13, ChangePercent: 0.9, Series: []float64{5700, 5730, 5720, 5751}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.MarketOverview(c, indices, mujica.MarketOverviewOptions{Breadth: mujica.MarketBreadth{Advancing: 2100, Declining: 1400, Unchanged: 300}})
|
||||
if r.Chosen >= 0 {
|
||||
fmt.Println(indices[r.Chosen].Name)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`indices` 为指数报价组;`Breadth` 是非负涨跌家数;`AsOf` 零值隐藏时间戳;`Decimals` 默认 2;`Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Chosen >= 0 { 调用方回调(indices[r.Chosen].Name) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 到达指数卡片;Enter/Space 选择。
|
||||
|
||||
## 限制
|
||||
|
||||
提供展示与点击事件;行情获取由调用方负责。
|
||||
@@ -0,0 +1,39 @@
|
||||
# 190 IndexCard
|
||||
|
||||
## 用途
|
||||
|
||||
指数卡片。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
quote := mujica.IndexQuote{Name: "S&P 500", Price: 5751.07, Change: 51.13, ChangePercent: 0.9, Series: []float64{5700, 5730, 5720, 5751}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.IndexCard(c, quote, mujica.IndexCardOptions{Clickable: true})
|
||||
if r.Changed() {
|
||||
fmt.Println(quote.Name)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`q.Name` 必填;Price、Change、ChangePercent 和 Series 来自调用方。`Decimals` 默认 2;`Clickable/Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() { 调用方回调(quote.Name) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦卡片或迷你图;Enter/Space 激活卡片,图表方向键读数。
|
||||
|
||||
## 限制
|
||||
|
||||
迷你图复用 Sparkline;行情获取由调用方负责。
|
||||
@@ -0,0 +1,36 @@
|
||||
# 191 MarketStatus
|
||||
|
||||
## 用途
|
||||
|
||||
市场状态。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
now := time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC)
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
mujica.MarketStatus(c, mujica.MarketOpen, mujica.MarketStatusOptions{Market: "NYSE", Now: now, Next: now.Add(5 * time.Hour), NextPhase: mujica.MarketAfterHours})
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`phase` 支持五个 MarketPhase;`Market` 默认空;`Next` 零值隐藏;`NextPhase` 默认 Closed;`Now` 零值使用窗口时间。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界。
|
||||
|
||||
## 事件
|
||||
|
||||
展示组件;数据由调用方更新。
|
||||
|
||||
## 键盘操作
|
||||
|
||||
展示组件。
|
||||
|
||||
## 限制
|
||||
|
||||
使用窗口时间时每分钟刷新;传入 Now 时由调用方推进时间。
|
||||
@@ -0,0 +1,37 @@
|
||||
# 192 TradingSessionClock
|
||||
|
||||
## 用途
|
||||
|
||||
交易时段时钟。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
now := time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC)
|
||||
markets := []mujica.SessionMarket{{Name: "NYSE", Location: time.FixedZone("EDT", -4*3600), Sessions: []mujica.TradingSession{{Phase: mujica.MarketOpen, Start: 570, End: 960}}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
mujica.TradingSessionClock(c, markets, mujica.TradingSessionClockOptions{Now: now})
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`markets` 每项包含 Name、Location 与有序时段;Start/End 是本地午夜后的分钟;`Holiday` 默认 false;`Now` 零值使用窗口时间。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界。
|
||||
|
||||
## 事件
|
||||
|
||||
展示组件;数据由调用方更新。
|
||||
|
||||
## 键盘操作
|
||||
|
||||
展示组件。
|
||||
|
||||
## 限制
|
||||
|
||||
每天重复时段由调用方指定;节假日由 Holiday 指定;跨午夜时段拆分为两个日期的时段。
|
||||
@@ -0,0 +1,40 @@
|
||||
# 193 EconomicCalendar
|
||||
|
||||
## 用途
|
||||
|
||||
经济日历。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.EconomicCalendarState
|
||||
rows := []mujica.EconomicEvent{{ID: "jobs", Country: "US", Title: "Payrolls", Time: time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC), Importance: 3, Forecast: "150K", Previous: "142K", Actual: "254K"}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.EconomicCalendar(c, &state, rows, mujica.EconomicCalendarOptions{})
|
||||
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() {
|
||||
fmt.Println(state.Table.Selected())
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`s` 保存国家、重要性和表格状态;`events` 的 ID 稳定且重要性 1—3。`Version` 原地更新递增;`Status/Error/Disabled` 默认零值。
|
||||
|
||||
## 状态
|
||||
|
||||
默认、聚焦、禁用;异步结果支持加载、失败和空。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() { 调用方回调(state.Table.Selected()) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 到达国家过滤、重要性和表格;方向键选择;Enter 提交行。
|
||||
|
||||
## 限制
|
||||
|
||||
事件数据与发布结果由调用方提供;过滤与排序缓存直到数据或条件变更。
|
||||
@@ -0,0 +1,40 @@
|
||||
# 194 EarningsCalendar
|
||||
|
||||
## 用途
|
||||
|
||||
财报日历。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.DataTableState[string]
|
||||
rows := []mujica.EarningsEvent{{ID: "a", Symbol: "AAPL", Name: "Apple", Date: mujica.Date{Year: 2026, Month: 10, Day: 30}, Timing: mujica.EarningsAfterClose, EPSEstimate: 1.6, EPSActual: 1.64}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.EarningsCalendar(c, &state, rows, mujica.EarningsCalendarOptions{})
|
||||
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() {
|
||||
fmt.Println(state.Selected())
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`s` 保存表格状态;`events` 使用稳定 ID、Date 和盘前盘后时段;EPSActual 的 NaN 表示待公布。`Version` 原地更新递增;`Status/Error/Disabled` 默认零值。
|
||||
|
||||
## 状态
|
||||
|
||||
默认、聚焦、禁用;异步结果支持加载、失败和空。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() { 调用方回调(state.Selected()) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦表格;方向键及 Home/End 选择;Enter 提交;表头支持键盘排序。
|
||||
|
||||
## 限制
|
||||
|
||||
NaN 表示待公布;零预期仅显示金额差;财报数据由调用方提供。
|
||||
@@ -0,0 +1,42 @@
|
||||
# 195 NewsFeed
|
||||
|
||||
## 用途
|
||||
|
||||
新闻流。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
var state mujica.NewsFeedState
|
||||
rows := []mujica.NewsItem{{ID: "a", Title: "Apple unveils new chips", Source: "Wire", Time: time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC), Symbols: []string{"AAPL"}}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.NewsFeed(c, &state, rows, mujica.NewsFeedOptions{})
|
||||
if r.Opened != "" || r.Symbol != "" || r.Retry {
|
||||
fmt.Println(r.Opened, r.Symbol)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`Version` 在调用方原地修改新闻或已读映射时递增;`ReadChanged` 报告已读状态变化。
|
||||
|
||||
`s.Read` 以 ID 保存已读;`items` 按调用方给定顺序显示。`Today` 默认窗口日期;`Status/Error/Disabled` 默认零值。
|
||||
|
||||
## 状态
|
||||
|
||||
默认、聚焦、禁用;异步结果支持加载、失败和空。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Opened != "" || r.Symbol != "" || r.Retry { 调用方回调(r.Opened, r.Symbol) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦列表或相关代码;上下选择;Enter 打开并标记已读。
|
||||
|
||||
## 限制
|
||||
|
||||
虚拟化构建可见行;读取状态以稳定 ID 保存;链接打开由调用方负责。
|
||||
@@ -0,0 +1,36 @@
|
||||
# 196 SentimentGauge
|
||||
|
||||
## 用途
|
||||
|
||||
情绪仪表。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
value := 72.0
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
mujica.SentimentGauge(c, value, mujica.SentimentGaugeOptions{Label: "Fear & Greed"})
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`value` 范围 0—100;`Label` 默认空;`Size` 默认 240 DIP,指定值至少 48 DIP。`Status/Error/Empty` 默认就绪、空文本、false,保留同一尺寸的加载、失败与空占位。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界。
|
||||
|
||||
## 事件
|
||||
|
||||
`Retry` 回调报告错误占位的重试请求;数值由调用方更新。
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦仪表;方向键和 Home/End 朗读当前数值与区间文字。
|
||||
|
||||
## 限制
|
||||
|
||||
区间边界为 20、40、60、80;值域错误触发 panic。
|
||||
@@ -0,0 +1,40 @@
|
||||
# 197 PortfolioSummary
|
||||
|
||||
## 用途
|
||||
|
||||
资产总览。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
account := ""
|
||||
accounts := []mujica.PortfolioAccount{{ID: "a", Name: "Brokerage", Total: 120000, DayPnL: 1250, TotalReturn: 20000, Cost: 100000}, {ID: "b", Name: "Retirement", Total: 80000, DayPnL: -300, TotalReturn: 5000, Cost: 75000}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.PortfolioSummary(c, &account, accounts, mujica.PortfolioSummaryOptions{})
|
||||
if r.Changed() {
|
||||
fmt.Println(account)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`account` 空值汇总全部账户;`accounts` 使用稳定 ID。`Currency` 默认 $;`Decimals` 默认 2;`Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() { 调用方回调(account) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦账户组;方向键切换账户。
|
||||
|
||||
## 限制
|
||||
|
||||
收益、成本与资产数值由调用方计算;基数为 0 时隐藏比例。
|
||||
@@ -0,0 +1,41 @@
|
||||
# 198 AssetAllocationChart
|
||||
|
||||
## 用途
|
||||
|
||||
资产配置图。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
items := []mujica.AllocationItem{{Name: "Stocks", Value: 60, Target: 50}, {Name: "Bonds", Value: 30, Target: 40}, {Name: "Cash", Value: 10, Target: 10}}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.AssetAllocationChart(c, items, mujica.AssetAllocationChartOptions{Frame: mujica.ChartFrame{Label: "Allocation"}})
|
||||
if r.Changed() || r.Retried() {
|
||||
fmt.Println(r.Point)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`Version` 在原地修改数据时递增。环形图合并小于 1 度的多个扇区;列表虚拟化保留每项的占比、目标与偏离。
|
||||
|
||||
`items` 包含 Name、Value、Target;目标总和为 100 或全部 0。`Frame.Label` 必填;`Tolerance` 默认 5 个百分点;`Format` 可覆盖数值。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() || r.Retried() { 调用方回调(r.Point) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦环形图;方向键逐项读数;Home/End 到首尾。
|
||||
|
||||
## 限制
|
||||
|
||||
列表同时提供占比、目标、偏离;负资产值触发 panic。
|
||||
@@ -0,0 +1,46 @@
|
||||
# 199 PerformanceChart
|
||||
|
||||
## 用途
|
||||
|
||||
收益曲线。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
values := []float64{100, 110, 95, 120}
|
||||
benchmark := []float64{100, 105, 108, 112}
|
||||
times := []time.Time{time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 2, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 3, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 4, 1, 0, 0, 0, 0, time.UTC)}
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.PerformanceChart(c, values, mujica.PerformanceChartOptions{Frame: mujica.ChartFrame{Label: "Performance"}, Times: times, Benchmark: benchmark})
|
||||
if r.Changed() || r.Retried() {
|
||||
fmt.Println(r.Point)
|
||||
}
|
||||
if name, ok := r.Toggled(); ok {
|
||||
fmt.Println(name)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`Version` 在原地修改净值或基准时递增。
|
||||
|
||||
`values` 为正净值;`Times` 必填且递增;`Benchmark` nil 隐藏或与净值等长。`Frame.Label` 必填;`Name/BenchmarkName` 默认本地化名称。
|
||||
|
||||
## 状态
|
||||
|
||||
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.Changed() || r.Retried() { 调用方回调(r.Point) }; if name, ok := r.Toggled(); ok { 调用方回调(name) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 聚焦图和图例;方向键读数;Space 切换序列。
|
||||
|
||||
## 限制
|
||||
|
||||
净值先归一化为累计收益;最大回撤取峰值到谷值;日期与报价由调用方提供。
|
||||
@@ -0,0 +1,44 @@
|
||||
# 200 CurrencyConverter
|
||||
|
||||
## 用途
|
||||
|
||||
货币换算。
|
||||
|
||||
## 最小示例
|
||||
|
||||
```go
|
||||
state := mujica.CurrencyConverterState{Amount: 100, From: "USD", To: "JPY"}
|
||||
currencies := []mujica.Currency{{Code: "USD", Name: "Dollar", Decimals: 2}, {Code: "JPY", Name: "Yen", Decimals: 0}}
|
||||
rate := 149.37
|
||||
view := func(c *ui.Context) {
|
||||
mujica.Use(c, mujica.Settings{})
|
||||
r := mujica.CurrencyConverter(c, &state, currencies, mujica.CurrencyConverterOptions{Rate: rate})
|
||||
if r.PairChanged {
|
||||
rate = 0
|
||||
fmt.Println(state.From, state.To)
|
||||
}
|
||||
}
|
||||
ui.Render(view, 960, 440, 1)
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
`RateFrom/RateTo` 指定汇率所属货币对,支持数值相同的刷新结果;货币小数位范围 0—12。
|
||||
|
||||
`s` 保存金额及货币对;`currencies` 至少两种,Decimals 为最小单位精度。`Rate` 默认 0 表示待提供;`RateTime` 零值隐藏;`Disabled` 默认 false。
|
||||
|
||||
## 状态
|
||||
|
||||
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
|
||||
|
||||
## 事件
|
||||
|
||||
if r.PairChanged { rate = 0; 调用方回调(state.From, state.To) }
|
||||
|
||||
## 键盘操作
|
||||
|
||||
Tab 到达金额、币种和互换;方向键步进、选择;Enter/Space 互换。
|
||||
|
||||
## 限制
|
||||
|
||||
币种切换产生 PairChanged,调用方立即将 Rate 置 0 并获取新汇率;结果按目标货币精度取整。
|
||||
Reference in new issue
Block a user